3.2 通读全文代码
前面提到的根据敏感关键字来回溯传入的参数,是一种逆向追踪的思路,我们也提到了这种方式的优缺点,实际上在需要快速寻找漏洞的情况下用回溯参数的方式是非常有效的,但这种方式并不适合运用在企业中做安全运营时的场景,在企业中做自身产品的代码审计时,我们需要了解整个应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
通读全文代码也有一定的技巧,并不是随便找文件逐个读完就可以了,这样你是很难真正读懂这套 Web 程序的,也很难理解代码的业务逻辑,首先我们要看程序的大体代码结构,如主目录有哪些文件,模块目录有哪些文件,插件目录有哪些文件,除了关注有哪些文件,还要注意文件的大小、创建时间。我们根据这些文件的命名就可以大致知道这个程序实现了哪些功能,核心文件是哪些,discuz 的程序主目录如图 3-7 所示。
图 3-7
在看程序目录结构的时候,我们要特别注意以下几个文件:
1)函数集文件,通常命名中包含 functions 或者 common 等关键字,这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到其他文件。寻找这些文件一个非常好用的技巧就是去打开 index.php 或者一些功能性文件,在头部一般都能找到。
2)配置文件,通常命名中包括 config 关键字,配置文件包括 Web 程序运行必须的功能性配置选项以及数据库等配置信息。从这个文件中可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数值是用单引号还是用双引号括起来,如果是双引号,则很可能会存在代码执行漏洞,例如下面 Kuwebs 的代码,只要我们在修改配置的时候利用 PHP 可变变量的特性即可执行代码。
<?php /* 网站基本信息配置 */ $kuWebsiteURL = "http : //www.kuwebs.com" ; $kuWebsiteSupportEn = "1" ; $kuWebsiteSupportSimplifiedOrTraditional = "0" ; $kuWebsiteDefauleIndexLanguage = "cn" ; $kuWebsiteUploadFileMax = "2" ; $kuWebsiteAllowUploadFileFormat = "swf|rar|jpg|zip|gif" ; /* 邮件设置 */ $kuWebsiteMailType = "1" ; $kuWebsiteMailSmtpHost = "smtp.qq.com" ;
3)安全过滤文件,安全过滤文件对我们做代码审计至关重要,关系到我们挖掘到的可疑点能不能利用,通常命名中有 filter、safe、check 等关键字,这类文件主要是对参数进行过滤,比较常见的是针对 SQL 注入和 XSS 过滤,还有文件路径、执行的系统命令的参数,其他的则相对少见。而目前大多数应用都会在程序的入口循环对所有参数使用 addslashes() 函数进行过滤。
private static function _do_query_safe ( $sql ) { $sql = str_replace ( array ( '\\\\' , '\\\'' , '\\"' , '\'\'' ), '' , $sql ); $mark = $clean = '' ; if ( strpos ( $sql , '/' ) === false && strpos ( $sql , '#' ) === false && strpos ( $sql , '--' ) === false && strpos ( $sql , '@' ) === false && strpos ( $sql , '`' ) === false ) { $clean = preg_replace ( "/' ( .+ ?) '/s" , '' , $sql ); } else {
4)index 文件,index 是一个程序的入口文件,所以通常我们只要读一遍 index 文件就可以大致了解整个程序的架构、运行的流程、包含到的文件,其中核心的文件又有哪些。而不同目录的 index 文件也有不同的实现方式,建议最好先将几个核心目录的 index 文件都简单读一遍。
上面介绍了我们应该注意的部分文件,可以帮助我们更有方向地去读全部的代码,实际上在我们真正做代码审计的时候,经常会遇到各种框架,这时候就会被搞得晕头转向,所以在学习代码审计的前期建议不要去读开源框架或者使用开源框架的应用,先去 chinaz、admin5 之类的源码下载网站下载一些小应用来读,并且一定要多找几套程序通读全文代码,这样我们才能总结经验,等总结了一定的经验,对 PHP 也比较熟悉的时候,再去读一些像 thinkphp、Yii、Zend Framework 等开源框架,才能快速地挖掘高质量的漏洞。
通读全文代码的好处显而易见,可以更好地了解程序的架构以及业务逻辑,能够挖掘到更多、更高质量的逻辑漏洞,一般老手会比较喜欢这种方式。而缺点就是花费的时间比较多,如果程序比较大,读起来也会比较累。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论