• 使用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:https://github.com/maniacs1/findSink/releases

  • 相关阅读:
    Twisted
    day10-redis操作
    day9mysql操作
    day9-paramiko
    day10-rabbitmq
    day9-协程
    day8-异常
    Linux 软连接
    nginx 配置篇
    ansilbe基础学习(一)
  • 原文地址:https://www.cnblogs.com/piaomiaohongchen/p/15540569.html
Copyright © 2020-2023  润新知