尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

preg_replace \e模式下的代码执行加案例详解!!

preg_replace \e模式下的代码执行加案例详解!! 下面将深入研究 preg_replace /e 模式下的代码执行问题 其中包括 preg_replace 函数的执行过程分析、正则表达式分析、漏洞触发分析当中的坑非常非常多相信看完你也能学到很多题目?php function complex($re, $str) { return preg_replace( /( . $re . )/ei, strtolower(\\1), $str ); } foreach($_GET as $re $str) { echo complex($re, $str). \n; } function getFlag(){ eval($_GET[cmd]); }首先我们来认识一下preg_replace 这个函数preg_replace 使用了 /e 模式导致了代码可以被执行php7.3 版本之前 preg_replace使用/E模式都会导致代码执行我们都知道 preg_replace 在匹配到正则符号后就会被替换字符串也就是第二个参数 strtolower(\\1) 所代表的的内容将被执行这里我提供一个payload:?\S*${phpinfo()}在代码中$re \S* $str ${phpinfo();}/( . $re . )/ei 》 /( . \S*. )/eistrtolower(\\1) 在经过这个转小写 匹配到phpinfo();最开始想到的是.*${phpinfo();} 为什么这个payload不行呢在php的get传参中.会被转换成_所以?\.*${phpinfo();}不行S除了 \n换行符 \t制表符 \r回车符 \f换页符 \v垂直制表符 所以可以匹配到phpinfo()${....}作用strtolower(\1) 双引号可以解析变量首先匹配到phpinfo 单引号就不行 执行完之后就变成了${1}true我们为什么一直在构造 ${phpinfo()} 的一个形式才能执行 phpinfo()函数观察一个案例${phpinfo();}phpinfo() 会被当做变量先执行执行后即变成 ${1} (phpinfo()成功执行返回true)。最后的输出就是helloword
返回列表