代码审计之论

作者: 苏打水一瓶 | 来源:发表于2018-11-08 09:22 被阅读31次

    代码审计现状

        随着开发人员的安全意识逐步提高,导致漏洞挖掘的难度逐年递增。而代码审计,逐渐出现在大家的视野里,方便了安全人员能够更易挖掘到很多黑盒测试不容易发现的漏洞威胁。但是由于系列代码审计从0到1的资料比较稀缺,导致懂代码审计的人相对属于少数人员,而大部分web安全人员还徘徊在已知漏洞利用阶段。

    代码审计之问

        有大部分小伙伴没有真正接触代码审计,没有具体去实践代码审计的肯定会有这样的疑问。要做代码审计需要懂哪些知识啊?给一套程序如何下手?我看得懂别人的代码审计案例,但是到自己下手时就没了思路了呢?找到漏洞不会构造POC 怎么办等等。笔者认为问这些问题的主要原因是不知道代码审计的流程。如果你知道代码审计的流程,你就知道哪个环节需要学习掌握哪些知识;如何下手审计代码;选择什么样的方式去下手;如何构造Payload,编写POC来验证漏洞的存在。

    笔者认为代码审计的流程是:审计前的准备->定位漏洞产生点->URL链接构造访问漏洞产生点->payload构造突破各种防御/编码转换->证实漏洞存在。下面我们以php代码审计为例来进行分析。

    审计前的准备

        环境搭建+调试工具

      别人给我们一套php程序让我们做代码审计,通过漏洞挖掘验证漏洞的存在。我们在拿到程序之后,首先要做的是环境搭建,让程序运行起来方便我们调试,验证。这就要求懂得windows版的php环境搭建或者linux版的php环境搭建。笔者推荐一款集成开发环境phpstudy。这款集成环境不论是windows还是linux安装方便,php版本切换一键搞定。环境搭建完毕后,我们要使用编辑器去修改代码调试程序,这里推荐使用IDE,phpstrom。该款编辑器美化精致,功能强大,可在phpstrom上配置xdebug 来进行调试方便漏洞挖掘。所以这里我们要学习phpstrom的简单使用及关键词搜索与xdebug的配置。    

    定位漏洞发生点

     寻找定位漏洞发生点一般有如下几种方式。

    1全文通读正向审计

    2功能点审计

    3关键词定位逆向追踪

    4灰盒+白盒审计

        在进行代码审计的时候,各种方式进行组合使用是比较高效的,当然这是对有审计经验的人来说的,没有的还是慢慢针对一种方式练习一下。

    在寻找漏洞定位漏洞发生点之前,审计者首先要清楚自己的定位,想要挖单种类型的漏洞,常规类型漏洞,还是业务类型逻辑漏洞,是想挖掘哪些比较难发现的漏洞,还是想挖掘比较容易挖掘的漏洞。挖掘什么样的漏洞,你就要熟悉什么样的漏洞类型产生原理,知道哪些函数利用不当或本身的脆弱性或未过滤/有效过滤造成的漏洞威胁。 比如涉及到sql注入时,因为它的产生是可控参数在与数据库交互的时没有有效过滤与原有SQL语句拼接在一起造成的注入漏洞,这时你就要专门查找与数据库交互的功能;又比如XSS, 它是在浏览器渲染的时候,可控参数被当做js代码执行造成的,这时候你就要查找在输出端时,可控参数会不会被导致js执行。其他常规类型漏洞挖掘时,可直接定位关键词来回溯。 挖掘单种类型漏洞或者常规类型漏洞,可以使用自动化审计工具如国际流行的rips,国内seay大牛的源代码审计工具,进行关键词定位搜索,然后在去验证漏洞的存在及可用性。

        全文通读正向审计并非代码全读,且属于正向追踪。审计框架级的程序,先找出开发手册来熟悉一下,然后在根据手册挑出有可控点的方法往下追代码,如带入了哪个方法,调用了哪个函数,一直追到不能追了或者追到有漏洞点位置为止,这样的好处是漏洞发现的覆盖率高,追踪好追踪,url链接好构造;审计没有手册的程序,就专门找URL链接可直接请求到的方法,且该方法中代码有带可控点方法调用,然后如上追代码。例如请求的url链接是localhost/user/updatePassword,这个链接映射的代码位置是user模块的updatePassword方法,该方法中有代码$User->where('id='.$_GET['id'])->save(); 我们看到where()方法中有带入可控参数id,那我们就继续往下追踪where方法去寻找漏洞发生点。

      功能点审计适用于常规类型漏洞,也适用于逻辑类型漏洞。为什么这么说呢?比如一个忘记密码找回的功能点,我们猜测该功能点可能会有SQL注入,验证码绕过,爆破重置密码,越权等漏洞,所以我们在审计功能点的时候,就会着重进行预测漏洞类型的审计。一般有了一定代码审计经验的人在做SDL的威胁建模时,效率就会高很多。

    URL链接构造访问漏洞产生点

      到了这个环节,必不可少的要熟悉程序的目录文件结构,URL路由。一般访问漏洞产生点会有两种方式,一种是通过URL连接构造直接访问和间接访问。直接访问是漏洞产生点在可通过URL直接映射到的方法中,间接方法是漏洞点在直接映射的方法内所调用的其他方法(可多级递归)中。想要学会URL构造,一般有三种方式,①网站链接点击+目录结构寻找控制器方法。随便点击搭建起来的目标网站链接,通过对比链接,和目录文件结构来模仿构造URL链接②看手册找到URL路由结构的映射方式③是看代码+经验。

    PAYLOAD构造

    一般可控参数在到漏洞发生点时,可能会遇到代码防御过滤,类型转换,编码转换等。所以在可控参数到漏洞发生点期间,进行了哪些,防御,转换,编码等做一个流程图,在最后漏洞发生点想要执行什么样的结果,写出来,然后拿着最后执行的效果往上推,一直推到可控参数传参的位置。在这个环节,必不可少的要掌握一些渗透技巧,跟payload编写技巧,方便在用到的时候能真正做到灵活运用。

    其他

    在代码审计时,我们不光要注意到代码的问题,还要注意到php.ini配置问题,中间件结合的问题等各种影响因素,而且在审计一套你未曾审计的源码时,可查阅一下前辈们审计的该套目标程序的漏洞产生情况,熟悉开发人员的开发安全意识及漏洞忽略点来进行漏洞预测挖掘。

    总结一下,通过上面简单的论述,对代码审计已经有了一个初步的了解,掌握了代码审计,你不光熟悉了编程语言,渗透测试技巧,更学会了漏洞挖掘,也就是说你同时掌握了三种技术。

    喜欢就点个关注呗~谢谢

    相关文章

      网友评论

        本文标题:代码审计之论

        本文链接:https://www.haomeiwen.com/subject/clyixqtx.html