在圈子中看到了有表哥发变态CTF中preg_match绕过的姿势,并没有写绕过的具体原理及方法,本着学习的态度,查了查资料简单复现了一下。
0x00 题目原型是这样的
测试环境
php7.0.12
apache5.3
简单理解shell参数接收时不允许包含以下字符串"0123456789,.$&|{_defogps]",最终的目的是要到eval()函数中去执行任意代码,这题也就是考研我们如何绕过这个preg_match。
通过表哥给的姿势是这样的
http://127.0.0.1/1.php?shell=(%27%01%00%01%00%00%04%01%27^%27qhqinbn%27)();
标红的部分是payload
最终结果
简单来说将特殊字符通过异或的方式重组了phpinfo();,当然这也得益于php语义的灵活性。下面看看如何构造payload。
0x01 原理
什么是按位异或,异或本质是二进制运算
1001
0101
1100
对应二进制位相异(不相同)时,结果为1,否则为0.
举例: 比如95,其实就是1001 0101 = 1,因此9^5=1100=12
在php中,abc^def,会产生一个新的字符串,比较方式是:a的ascii码和d的ascii码进行二进制异或操作