您现在的位置是:首页 > 文章详情

小组任务1(phpbug#69892)

日期:2018-06-30点击:642

参考文献:https://github.com/CHYbeta/Code-Audit-Challenges

1.php的Bug#69892

$users = array(
        "0:9b5c3d2b64b8f74e56edec71462bd97a" ,
        "1:4eb5fb1501102508a86971773849d266",
        "2:facabd94d57fc9f1e655ef9ce891e86e",
        "3:ce3924f011fe323df3a6a95222b0c909",
        "4:7f6618422e6a7ca2e939bd83abde402c",
        "5:06e2b745f3124f7d670f78eabaa94809", //hund
        "6:8e39a6e40900bb0824a8e150c0d0d59f",
        "7:d035e1a80bbb377ce1edce42728849f2",
        "8:0927d64a71a9d0078c274fc5f4f10821",
        "9:e2e23d64a642ee82c7a270c6c76df142",
        "10:70298593dd7ada576aff61b6750b9118"
);
$valid_user = false;
$input = $_COOKIE['user'];
$input[1] = md5($input[1]);
foreach ($users as $user)
{
        $user = explode(":", $user);
        if ($input === $user) {
                $uid = $input[0] + 0;
                $valid_user = true;
        }
}
if (!$valid_user) {
        die("not a valid user\n");
}
if ($uid == 0) {
        echo "Hello Admin How can I serve you today?\n";
        echo "SECRETS ....\n";
} else {
        echo "Welcome back user\n";
}

题目其实很容易理解,就是输入user[0]和user[1],其中user[0]==0user[1]=$users中的任意一个

看见0~10这些内容第一反应就是md5解密,都试过一遍之后发现只有第五个能解出来,user[0]=5;user[1]=hund这个就可以得到你是普通用户的欢迎信息了,但是想要的是管理员的,所以得尝试将$uid=0这个条件实现,这个时候就需用到php的Bug#69892

[2015-06-20 14:29 UTC] nikic@php.net 描述: ------------
var_dump([0 => 0] === [0x100000000 => 0]); //布尔(true) 
所有版本:http://3v4l.org/Sjdf8</pre>

php运行在32位系统的会将数组的键 0x100000000=2^32=4294967296 变换为字符串,而在64位系统会直接 数组中的键4294967296 为unsigned long 类型 且等同于0

  • 最后的payload
Cookie: user[4294967296]=5;user[1]=hund;

2.PHP 0819

<?php
// closure, because of namespace!
$challenge = function()
{
        $f = Common::getGetString('eval');
        $f = str_replace(array('`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>'), '', $f);
        if((strlen($f) > 13) || (false !== stripos($f, 'return'))){
                die('sorry, not allowed!');
        }
        try{
                eval("\$spaceone = $f");
        }
        catch (Exception $e){
                return false;
        }
        return ($spaceone === '1337');
};
?>

通过get的eval参数传入并赋值到变量f,然后经过str_replace()的过滤,要求长度小于13,并且不包含字符串return,接着执行eval,然后让`spaceone === '1337'返回True。最后一行spaceone === '1337'`,要求类型和值都得相等。看一下str_replace(),过滤了单引号,双引号,所以如果直接get传参`index.php?eval='1337'`进去,在经过过滤后,到最后会变为spaceone=1337,不等。

可以用heredoc构造绕过单引号

<<<EOF
内容
EOF;

内容中不能包括特殊符号,以一个变量起始,以相同的变量名+;结束(还要再加上一个换行符!)

  • 最终payload
?eval=<<<s%0a1337%0as;%0a
原文链接:https://yq.aliyun.com/articles/654374
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章