打开环境,查看源代码可以获得一段注释
其中query的目的是获得所有上传的数据,第一个if过滤了“_”和%5f(也就是url编码的“_”),第二个if使得变量b_u_p_t要不等于23333并且后面的preg函数要使变量b_u_p_t等于23333
第一个if过滤了b_u_p_t,所以我们需要使用空格或者"."来绕过。第二个preg函数可以使用换行符进行绕过(编码为%0a)
构建payload如下
?b.u.p.t=23333%0a
提交后得到回显
尝试进入secrettw.php
发现无法访问,尝试从源代码寻找线索
获得一行加密内容。经查询发现是jsfuck加密,使用网站进行解密
获得结果,尝试post传参
首先我们来审计一下这段代码
这个函数change实现的是将字符串v进行base64编码后,对每一个字符进行【ascii编码+i*2】的处理,最终结果输出到字符串re中。
这段关于ip的代码要求你的访问ip为127.0.0.1。关于ip可以通过修改报表的client-ip与x-forward
进行修改
这段在满足ip=127.0.0.1和变量2333内容为“todat is a happy day”后,会将变量file内容通过函数 change进行处理,最后通过file_get_contents函数打开re函数的内容
于是payload的思路为:通过满足ip和变量2333的需求,从而在file_get_content()函数中打开flag.php,得到flag。
首先我们写一个脚本对写进change函数的数据进行处理
a="flag.php"
b=""
for i in range(0,len(a)):
b=b+chr(ord(a[i])-i*2)
print(b)
得到
fj]a&f\b
再进行base64加密,得到
ZmpdYSZmXGI=
使用bp抓包,修改client-ip构建payload
得到flag,此题结束。