代码执行冷知识

April 18, 2020 · 默认分类 · 学习笔记 · 757次阅读

闲聊

这周在学校,抽点琐碎时间(语文课上)把《白帽子讲web安全》读了第二遍,之前第一遍没咋详看,第二遍从头到尾看了一遍,收获颇多.
遂,做点笔记,顺便再深入一些.

preg_replace的/e修饰符造成的代码执行

preg_replace函数: 执行一个正则表达式的搜索和替换

具体参数如下:

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
搜索subject中匹配pattern的部分, 以replacement进行替换。

subject
要进行搜索和替换的字符串或字符串数组。
如果subject是一个数组,搜索和替换回在subject 的每一个元素上进行, 并且返回值也会是一个数组。

limit
每个模式在每个subject上进行替换的最大次数。默认是 -1(无限)。

count
如果指定,将会被填充为完成的替换次数。

/e修饰符:

如果设置了这个被弃用(php5.4之后被弃用)的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.
2020-04-19T07:03:04.png
如图
2020-04-19T06:29:10.png
匹配到第三个参数<t>123<t>里面<t><t>包裹的部分,即123,然后用第二个参数替换,第二个参数$get的值为phpinfo()
然后/e模式修饰符将替换后的字符串phpinfo()执行.

也可以这样执行:
2020-04-19T07:06:21.png

<?php   
$get = $_GET['a'];
echo preg_replace("/<t>(.*?)<t>/e", '\\1', $get);

这里主要理解1
2020-04-19T07:07:37.png

(这个\1实际上就是1)

先上概念

反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。 ---菜鸟教程

1实际上就是临时缓冲区里第一个子匹配项

咕咕咕,上学去了,下周回家继续更

none

最后编辑于2个月前