好久没分享东西了,今天分享个实用代码审计技巧  

  使用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的更多相关文章

  1. 经验分享:如何用grep对PHP进行代码审计

    这是一个常见的误解- 企业需要购买复杂和昂贵的软件来发现应用程序中安全漏洞:而这些专门的软件应用程序,无论是黑盒或白盒,开源或商业,都能很快的发现安全漏洞. 事实是:所有这些专业的漏洞扫描工具都有其特 ...

  2. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  3. grep命令參数及使用方法

    功能说明:查找文件中符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  4. grep命令参数和使用方法

    功能说明:查找符合串的条件的文件. 语言 法国:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  5. Centos下grep命令简介

    grep命令简介 grep 是一个最初用于Unix操作系统的命令行工具.在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本. grep ...

  6. 12个 Linux 中 grep 命令的超级用法实例

    12个 Linux 中 grep 命令的超级用法实例 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一 ...

  7. Linux中利用grep命令如何检索文件内容详解

    前言 Linux系统中搜索.查找文件中的内容,一般最常用的是grep命令,另外还有egrep命令,同时vi命令也支持文件内容检索.下面来一起看看Linux利用grep命令检索文件内容的详细介绍. 方法 ...

  8. linux的grep命令参数全拼详解

    今天为了查找文件中某段字符,找了好久,最后成功使用指令: find . -name "*.cpp" |xargs grep -in “get_itemInfo” | grep -v ...

  9. Linux中grep命令的12个实践例子

    grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具.无论何种原因,如果你的系统没有预装它的话,你可以很容易的通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和 ...

随机推荐

  1. 编译原理: FIRST(x) FOLLOW(x) SELECT(x)的计算

    目录 First计算 Follow计算 Select计算 已知文法G[S]: S→MH|a H→LSo|ε K→dML|ε L→eHf M→K|bLM 判断G是否是LL(1)文法. First计算 F ...

  2. JVM详解(三)——运行时数据区

    一.概述 1.介绍 类比一下:红框就好比内存的运行时数据区,在各自不同的位置放了不同的东西.而厨师就好比执行引擎. 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的 ...

  3. NXOpen.UF.UFView.CycleObjects 的使用

    Public Sub CycleObjects(ByVal view As NXOpen.Tag, ByVal type As NXOpen.UF.UFView.CycleObjectsEnum, B ...

  4. JBOSS未授权访问漏洞利用

    1. 环境搭建 https://www.cnblogs.com/chengNo1/p/14297387.html 搭建好vulhub平台后 进入对应漏洞目录 cd vulhub/jboss/CVE-2 ...

  5. BUAA软工-结对项目作业

    结对项目作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 通过这门课锻炼软件开发能力和经验,强化与他人合作 ...

  6. .net,C#,Vb,F#,Asp,Asp.net区别以及作用和方向

    .net是平台,其他都是运行在其.NET FrameWork环境下的 C#,Vb都是语言运行在.net 平台下 Asp,Asp.net 都是用来写Web网页的,但是Asp和Asp.net有区别 Asp ...

  7. NGINX杂谈——flask_limiter的IP获取(怎么拿到真实的客户端IP)

    本篇博客将 flask_limiter 作为切入点,来记录一下自己对 remote_addr 和 proxy_add_x_forwarded_for 两个变量.X-Real-IP 和 X-Forwar ...

  8. HZOI帝国2019欢乐时刻

    前言: update 只是恢复一下原来手残删掉的博客,不是在水,嘤嘤嘤 update 以后改成Stack,但是之前的就懒得改了... by 10.31 为了窝的访问量大家的好心情,模仿学长搞了一个这个 ...

  9. [暴力题解&&考试反思] 双十一欢乐赛(联赛膜你测试32)

    前言: 今天考试很迷糊.从7点考到11点半,我大概从7点睡到9点.隐隐约约看到旁边的狗哥敲了好几个题,我才开始写代码.然后因为还是很困,而且T1迷迷糊糊调了好长时间,T3T4的暴力就懒的写了... 估 ...

  10. Java并发:Condition接口

    Condition 接口与 Lock 配合实现了等待 / 通知模式,这个和 Object 的监视器方法(wait.notify.notifyAll 等方法)一样,都是实现了等待 / 通知模式,但这两者 ...