使用grep命令,玩转代码审计寻找Sink
好久没分享东西了,今天分享个实用代码审计技巧
使用grep,玩转代码审计,适用于linux/mac,windows需要另行安装grep:
使用场景如下:快速寻找项目中所有的Sink,快速寻找符合适配条件的所有代码文件
常规的idea,已经不能满足我们的需求,又要全量Sink,又需要符合适配条件
以java业务代码审计为例:
首先列出部分敏感函数:exec(,command(:
使用grep全局搜索:
grep -rn "exec(" --include="*.java" ./

这样我们就可以发现Sink和对应的对应的行数,非常的方便
这个用法,我在代码审计中经常用,有个弊端就是,当Sink关键字变多了,一次又一次grep,又显得很浪费时间:
我写了一个小脚本:

其中sink.txt是我们的Sink关键字:


现在我们使用grep可以批量找sink了,真的令人开心.
但是这不是完美的,不知道大家代码审计是否遇到过这种情况,我在代码审计中,经常遇到如下场景:
以php某工程代码为例子:
一段不需要登录的代码:
$PAGE->set_url('/help_ajax.php');
$PAGE->set_context(context_system::instance());
$data = get_formatted_help_string($identifier, $component, true);
echo json_encode($data);
访问/help_ajax.php,响应200,没有跳转
一段需要登录的代码:
$PAGE->set_url('/admin/dataformats.php');
$PAGE->set_context($syscontext);
require_login();
访问/admin/dataformats.php,响应302跳转主页登陆
更多的时候,我们要挖掘前台的安全漏洞,前台的rce漏洞比后台rce价值更大更高,这时候有个需求,也是很多人的需求,获取所有前台代码文件:
这里的两个特征:
1.包含set_url(
2.不需要的附加依赖,不包含require_login(,甚至还有别的不需要的附加依赖
一般审计php项目,我都是用vs code,vs code全局搜索也很香,我觉得比idea全家桶好用
一个坑:全局搜索set_url(,发现存在require_login(,看得很累,工程项目一旦很大,一个个看过去,非常的累
使用正则匹配精准定位:
尝试过的正则如下:
(1)[^require_login\(\)\;].*set_url\(.*\).*[^require_login\(\)\;].*
(2)[^require_login()\;]*|set_url\(
(3)(?!require_login).*set_url\(.*\).*(?!require_login).*
(4)[require_login();]{0}.*set_url\(.*\)\;.*[require_login();]{0}
(5)[require_login();]{0}.*set_url\(
(6)[require_login();]{0}set_url\(
.....
自己的能力真的是有限的,这些正则,vs code基于正则搜索,grep -E 基于正则搜索,均不能得到完全符合规则的代码文件,终究有好几个不符合条件
这里,退一步海阔天空:
(1)使用findSink/grep,拿到所有包含set_url(的代码文件:
这两种方法都可以
(1)find . -name '*.php' | xargs grep 'set_url'
(2)grep -r "set_url" --include="*.php" ./
这两种方法都可以:

拿到所有符合条件的代码文件后:
简单的处理下:
使用编辑器自带的正则替换功能: 
把:后面的都替换成空
效果如下: 
现在我们拿到了所有的文件
这里非常感谢rr师傅提供的思路:grep -L
首先单个文件举例子:
如果代码文件中包含了require_login关键字的,就会返回空,反之,如果不包含require_login关键字的代码文件,就会原样返回:

文件工程项目很大,一个个grep -L非常的累,这里我又写了一个辅助脚本:
演示效果:

运行代码:
现在拿到的所有文件都是前台可以访问文件:

如果再后续看代码中,又发现一些附属不必要的依赖,同样可以使用这种方法去筛选,非常的方便快捷!
相关程序后续传到git上去
使用grep命令,玩转代码审计寻找Sink的更多相关文章
- 经验分享:如何用grep对PHP进行代码审计
这是一个常见的误解- 企业需要购买复杂和昂贵的软件来发现应用程序中安全漏洞:而这些专门的软件应用程序,无论是黑盒或白盒,开源或商业,都能很快的发现安全漏洞. 事实是:所有这些专业的漏洞扫描工具都有其特 ...
- linux管道命令grep命令参数及用法详解---附使用案例|grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- grep命令參数及使用方法
功能说明:查找文件中符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- grep命令参数和使用方法
功能说明:查找符合串的条件的文件. 语言 法国:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- Centos下grep命令简介
grep命令简介 grep 是一个最初用于Unix操作系统的命令行工具.在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本. grep ...
- 12个 Linux 中 grep 命令的超级用法实例
12个 Linux 中 grep 命令的超级用法实例 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一 ...
- Linux中利用grep命令如何检索文件内容详解
前言 Linux系统中搜索.查找文件中的内容,一般最常用的是grep命令,另外还有egrep命令,同时vi命令也支持文件内容检索.下面来一起看看Linux利用grep命令检索文件内容的详细介绍. 方法 ...
- linux的grep命令参数全拼详解
今天为了查找文件中某段字符,找了好久,最后成功使用指令: find . -name "*.cpp" |xargs grep -in “get_itemInfo” | grep -v ...
- Linux中grep命令的12个实践例子
grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具.无论何种原因,如果你的系统没有预装它的话,你可以很容易的通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和 ...
随机推荐
- requestAnimationFrame 切换页面问题
requestAnimationFrame 切换页面时, 之前定时的内容还会继续执行. 所以 要注意处理动画函数内容,否则会出现死循环. 遇到的问题: 我在两个页面都有使用 requestAnimat ...
- xadmin使用富文本
环境:pycharm django1.11.20 python2.7 后台xadmin(根据网络各种资料实现) 本教程接上篇如何安装 xadmin,如何不清楚,请看上一篇(django安装xadmin ...
- 10分钟教你使用Picgo+GitHub+ jsDelivr搭建CDN加速免费图床
前言 经常写Markdown或者博客的同学,肯定都要用到图床.图床是什么呢?其实相当于一个存储图片的网站,类似百度云这样,不过上传图片到图床后可以直接通过外链进行访问. 比如把本地一张a.jpg上传到 ...
- P4173-残缺的字符串【FFT】
正题 题目链接:https://www.luogu.com.cn/problem/P4173 题目大意 给出两个字符串\(S,T\),其中包含小写字母和一些\(?\),\(?\)可以匹配任何字符. 求 ...
- YbtOJ#832-鸽子饲养【凸包,Floyd】
正题 题目链接:https://www.ybtoj.com.cn/contest/116/problem/3 题目大意 给出两个大小分别为\(n,m\)的点集\(A,B\). 求出\(B\)的一个最小 ...
- Dapr + .NET Core实战(十三)跨语言开发
因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...
- 配置Internal Load balancer中VM的外网访问
当在Azure中部署SQL VM时,处于安全考虑,不会配置VM的Public IP,会禁止外网的进出站访问,只允许从内部VNET,或者特定的内部IP访问.特别是当使用Azure Internal Lo ...
- 题解 GT考试
题目传送门 题目大意 给出\(n,m,k\),以及一个长度为\(m\)的数字串\(s_{1,2,...,m}\),求有多少个长度为\(n\)的数字串\(X\)满足\(s\)不出现在其中的个数模\(k\ ...
- bzoj1858SCOI 序列操作 (线段树)
题目大意: 给定一个长度为n的01序列为,现在有m种操作 \(0\ a\ b\) 把\([a,b]\)的数全部修改为0 \(1\ a\ b\) 把\([a,b]\)的数全部修改为1 \(2\ a\ b ...
- ShardingSphere学习
1 基本概念 1.1 ShardingSphere概述 官网:https://shardingsphere.apache.org/index_zh.html 1.2 分库分表概述 分库分表是为了解决由 ...