代码审计篇——正则匹配

admin 2026-05-11 08:40:06 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文探讨代码审计中正则匹配的核心应用,指出其作为初步筛查工具的重要性与局限性。文章详细列举PHP代码审计中危险函数、用户输入来源、SQL注入风险点等关键场景的正则表达式示例,并提供grep命令的实用参数组合。作者强调正则匹配无法替代人工变量追踪与过滤逻辑分析,建议读者结合基础能力提升进行实践。 综合评分: 78 文章分类: 代码审计,WEB安全,安全工具,漏洞分析,安全开发


cover_image

代码审计篇——正则匹配

原创

这小子嘴硬 这小子嘴硬

一己之见安全团队

2026年5月7日 08:45 广西

在小说阅读器读本章

去阅读

人胆子大了真是什么都敢写,什么无良博主都来碰瓷代码审计了。

一、初入代码审计

坦白说,现在比较主流的大型代码审计普遍是比较依赖工具的,是的,大型项目的代审实际上人工审计的部分占比很少,核心原因就是效率、要求,毕竟大型项目的代码动辄几十万、上百万行,代码审计在大型项目环节中的要求里关于安全的部分实际占比小的可怜,优先服务于整体合规、运行性、性能等问题上,然后才是是否存在严重安全隐患。先前有过一段时间各类营销号大量鼓吹代审的重要性、优越性,本质上和无脑鼓吹入行网安的那批人没什么区别,虽然代审是一个很重要的技能,但不是无脑项,打好基础一步步往下走、有自己明确的规划才是对的,如果学了xxx技能就能无忧同行一路绿灯的话,还轮不到你学呢。

扯远了,今天先讲正则,代码审计与正则匹配的关系十分密切,在不借助商业工具的情况下做代码审计,最核心的工作就是搜索。搜索危险函数、搜索敏感关键字、搜索可控变量、搜索特定的代码模式。而搜索的效率,取决于你对正则表达式的掌握程度。你可以用IDE自带的搜索功能一个个关键字去搜,但效率太低。你也可以用grep配合正则表达式,一次搜出一类问题。

代码审计的本质,就是从海量代码中快速定位可疑位置。正则表达式就是你的探照灯。

二、代码审计中最常用的正则场景

场景一:搜索危险函数

PHP代码审计中,需要重点关注能够执行系统命令、读写文件、操作数据库的函数。

正则表达式示例:

regex

system|exec|shell_exec|popen|proc_open|passthru

这条规则能一次性匹配所有常见命令执行函数。配合grep使用:

bash

grep-rE"system|exec|shell_exec|popen|proc_open|passthru" /path/to/source/

场景二:搜索用户输入来源

需要追踪哪些变量是从用户端获取的,是否存在未过滤就进入危险函数的情况。

正则表达式示例:

regex

\$_GET\[.*?\]|\$_POST\[.*?\]|\$_REQUEST\[.*?\]|\$_COOKIE\[.*?\]

配合grep使用:

bash

grep-rE"\$_GET\[.*?\]|\$_POST\[.*?\]|\$_REQUEST\[.*?\]|\$_COOKIE\[.*?\]" /path/to/source/

场景三:搜索SQL注入风险点

搜索SQL语句拼接位置,重点关注变量直接拼入字符串的模式。

正则表达式示例:

regex

\.\s*"\s*\.|\.\s*'\s*\.|"\s*\.\s*\$|'\s*\.\s*\$

这条规则匹配的是字符串连接操作,常见于SQL语句的拼接构建方式。

配合grep使用:

bash

grep-rE"\.\s*"\s*\.|\.\s*'\s*\.|"\s*\.\s*\$|'\s*\.\s*\$" /path/to/source/

场景四:搜索文件操作函数

文件包含、文件读取、文件写入等操作,是文件包含漏洞和任意文件读写漏洞的高发区。

正则表达式示例:

regex

include|include_once|require|require_once|file_get_contents|file_put_contents|fopen|fwrite|fread

场景五:搜索危险配置项

某些配置项如果设置不当,会导致严重安全问题。例如PHP的allow_url_include开启后,可能导致远程文件包含漏洞。

搜索配置文件中的特定配置项:

regex

allow_url_include\s*=\s*On|register_globals\s*=\s*On|safe_mode\s*=\s*Off

三、grep命令常用参数及作用

在使用正则表达式进行代码搜索时,grep是最常用的工具。以下是审计中常用参数:

| 参数 | 作用 | | — | — | | -r | 递归搜索,遍历所有子目录 | | -n | 显示匹配行在文件中的行号 | | -E | 启用扩展正则表达式,支持更多元字符 | | -i | 忽略大小写 | | -l | 只输出包含匹配内容的文件名,不输出具体行 | | -L | 输出不包含匹配内容的文件名 | | -A 5 | 输出匹配行以及后面的5行(after) | | -B 5 | 输出匹配行以及前面的5行(before) | | -C 5 | 输出匹配行以及前后各5行(context) | | --include=*.php | 仅搜索.php后缀的文件 | | --exclude=*.js | 排除.js后缀的文件 |

实际组合示例:

bash

# 搜索所有PHP文件中system函数调用的位置,显示行号和前后3行上下文
grep-rE-n-C3"system\s*\(" /path/to/source/ --include=*.php
# 搜索所有文件,忽略大小写,只输出包含eval的文件名
grep-rli"eval" /path/to/source/

四、grep配合正则的进阶用法

1. 多条件组合(或关系)

搜索systemexecshell_exec

bash

grep-rE"system|exec|shell_exec" /path/to/source/

2. 多条件组合(与关系)

搜索同时包含$GETeval的文件:

bash

grep-rl"\\$_GET" /path/to/source/ |xargsgrep-l"eval"

3. 排除特定目录

审计框架代码时,需要排除第三方库目录(如vendor、lib)以减少干扰:

bash

grep-rE"eval" /path/to/source/ --exclude-dir=vendor --exclude-dir=lib

4. 搜索非打印字符

有时候攻击者会在webshell中使用十六进制编码绕过检测,grep可以匹配非打印字符:

bash

grep-rP"\x[0-9a-f]{2}" /path/to/source/ --include=*.php

注意参数为-P(Perl正则,需要grep支持)。

五、常见的正则匹配模式(代码审计专用)

| 审计目标 | 正则表达式 | 说明 | | — | — | — | | 命令执行函数 | system|exec|shell_exec|popen|proc_open | PHP常见RCE函数 | | 代码执行函数 | eval|assert|preg_replace|create_function | preg_replace/e修饰符已废弃但仍可能遇到 | | 文件包含函数 | include|require|include_once|require_once | 文件包含漏洞入口 | | 文件读取函数 | file_get_contents|fread|readfile|file | 任意文件读取 | | 文件写入函数 | file_put_contents|fwrite|fputs | 任意文件写入 | | SQL执行函数 | mysql_query|mysqli_query|PDO::query|sqlsrv_query | 数据库查询入口 | | 用户输入来源 | \$_GET|\$_POST|\$_REQUEST|\$_COOKIE | 用户可控数据入口 | | 变量拼接 | \."\s*\.|\.'\s*\. | 字符串拼接操作,SQL注入高发写法 | | 反序列化 | unserialize|serialize | 反序列化漏洞入口 | | 数据库连接 | new mysqli|mysql_connect|pg_connect | 数据库连接配置位置 |

六、代码审计正则匹配的局限性

正则匹配只能是第一道筛子,不能替代人工分析。

局限性一:无法识别变量追踪

正则能搜到system($_GET['cmd']),但搜不到$a = $_GET['cmd']; system($a);这种跨行赋值的情况。变量追踪需要结合上下文分析。

局限性二:无法判断过滤逻辑

正则能告诉你这里有用户输入进入了危险函数,但无法判断这个输入是否经过了有效的过滤。需要人工检查过滤函数是否完备。

局限性三:正则语句极易写误

正则设计大量复杂语句和符号,一旦写错,可能漏掉大量漏洞。稳妥起见建议在测试环境中先用已知漏洞的代码验证正则的准确性。

七、总结

写这篇的初衷呢是身边有朋友问我值不值得单独去买课学代审呢?他一个水平连我都不如的人,是怎么想得到去学代审的呢?哦,估计又是看了什么无良公众号、帖子(应该不是我的,我是有良公众号)然后就被鸡汤到了,我一直劝大家不要迈出超出自己能力的步子,代审当然是很好的能力和阶梯,但前提是大家有了足够的了解,先将自身的认知、见识提升到那个高度了再来讨论要不要去学,高手之所以是高手不是他会的多,他只会做也挣不到钱,真实的故事是人家背后有团队、有公司支撑,有人捧的才是高手,而你,我的朋友,盲目报课,最终成为一张人家随时可以兑现的支票。

求关注!求三连啊!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:一己之见安全团队 这小子嘴硬 这小子嘴硬《代码审计篇——正则匹配》

代码审计篇——正则匹配 网络安全文章

代码审计篇——正则匹配

文章总结: 本文探讨代码审计中正则匹配的核心应用,指出其作为初步筛查工具的重要性与局限性。文章详细列举PHP代码审计中危险函数、用户输入来源、SQL注入风险点等
评论:0   参与:  0