在圈子中看到了有表哥发变态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码进行二进制异或操作,生成新的二进制,然后转换为ascii,进而生成新的异或结果。所以,异或会产生新的字符串,上面表哥给的payload就是基于这样的方式生成出来的。
0x02 生成有效的异或字符
1、先过滤出未被程序过滤的字符的ASCII码
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,1

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



