php代码审计

##例二、[%00截断]("http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php" "%00截断")  (Strops函数以及ereg函数 )

 
     if (isset ($_GET['nctf'])) 
     {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
            echo '必须输入数字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
            die('Flag: '.$flag);
        else
            echo '骚年,继续努力吧啊~';
      }

 


这道题就是玩的代码分析,为了得到flag满足第二个条件语句
Php中的两个函数
ereg函数是一个正则匹配式存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。ereg函数可以用%00截断,这个是很常见的一种绕过方法 
Strpos函数stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
注释:stripos() 函数是不区分大小写的。 
payload

3、



    <?phpif (isset ($_GET['password'])) {
    if (ereg ("^[a-zA-Z0-9]+$",$_GET['password']) === FALSE)    
       {
        echo '<p>You password must be alphanumeric</p>';
    }
    else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
    {
        if (strpos ($_GET['password'], '*-*') !== FALSE)
        {
            die('Flag: ' . $flag);
        }
        else
        {
            echo('<p>*-* have not been found</p>');
        }
    }
    else
    {
        echo '<p>Invalid password</p>';
    }
    
    }?>

 



GET方式提交password,然后用ereg()正则限制了password的形式,只能是一个或者多个数字、大小写字母,继续strlen()限制了长度小于8并且大小必须大于
9999999,继续strpos()对password进行匹配,必须含有-,最终才输出flag
因为ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。对于另一个难题可以使用科学计数法表示,计算器或电脑表达10的的
幂是一般是e,例如1.333e5=133300,所以构造1e8即1大于 9999999,再加上*-*。进行构造:

payload:password=1e8%00*-* 成功拿到flag


##例三、 [Intval函数]("http://chinalover.sinaapp.com/web11/robots.txt")
        


        
            TIP:sql.php
        
            <?php
            if($_GET[id]) {
            mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
            mysql_select_db(SAE_MYSQL_DB);
            $id = intval($_GET[id]);
            $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
            if ($_GET[id]==1024) 
            {
              echo "<p>no! try again</p>";
            }
            else{
            echo($query[content]);
            }
            }
            ?>

 



这是一个sql.php文件
查看代码分析知道要想获得flag必须执行最后面的if语句的else语句得到文件内容传入的内容一定不能为1024
Intval()函数    获取变量的整数值,允许以使用特定的进制返回,默认10进制。 
注:如果参数为整数,则不做任何处理。  所以get的id必须含有1024 那么就id=1024.x

payload:?id=1024.x   拿到flag


##例四、[php弱类型]("http://chinalover.sinaapp.com/web17/index.php") 
          



    if (isset($_GET['a']) and isset($_GET['b'])) {
    if ($_GET['a'] != $_GET['b'])
    if (md5($_GET['a']) == md5($_GET['b']))
    die('Flag: '.$flag);
    else
    print 'Wrong.';
     }

 


根据这些已知的信息我们可以发现这里的两个要求有一些矛盾,但是我们联想到这是一个使用php编写的脚本,而且在php中对数组的MD5加密之后都是NULL,所以可以使用这个小点来试试,对其进行修改加入构造的参数:

payload:http://chinalover.sinaapp.com/web17/index.php?a[]=x&b[]=y  这里的x、y 可以为任意数值!拿到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值