某变态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,1

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值