PHP代码审计所需工具:
(1) 环境:PHPstudy
我这里直接使用phpstudy。其他的如:xampp,lamp等集成环境都可以。
Phpsyudy官网地址:https://www.xp.cn
(2) 代码审计工具:
“工欲善其事,必先利其器。”一款好的代码审计工具可以辅助我们的白盒测试,提高挖掘漏洞的效率。下面我来介绍一下两款常用的代码审计工具。
1. RIPS
Rips是PHP语言开发的一款流行的审计工具,只要我们搭建好php环境就可以使用该工具。
官网:http://rips-scanner.sourceforge.net
下载好后,放入到我们本地搭建的网站根目录中,访问即可。下面是rips的界面。
2. Seay
这是一款由国内大牛法师(seay)13年期间基于c#开发的一款针对与PHP代码安全性审计的系统。是初学代码审计时常用的一款工具。
经验总结:
我这边总结一下我自己个人的经验。我个人是没有系统的学习过php的,所以说的有误的请各位大牛更正。
我认为有几点:
(1)确定框架或了解好文件的作用
为什么要确定好框架呢?因为确定好框架,我们可以去找找该框架的漏洞,也为我们后续审计工作带来更多的便利。怎么确定好一个框架呢?通常我们可以去看看需要审计的cms的官方文档。
为什么需要了解好文件的作用呢?我认为搭建好要审计的代码后,第一步就去找存放有全局函数,全局类的文件或配置文件。为什么呢?因为存放有全局函数的,如过滤xss,sql注入的函数都放在里面,我们可以看看过滤的正则写的怎么样,看看能不能绕过正则。或者如一些获取ip地址的函数,有没有过滤好,如果没有过滤好,往往都会出现http注入。
如何去找这些文件呢?一般有几个命名方式,如存放有全局函数的文件命名一般带有function,而配置文件一般会带有config这个字样,而controller,class多为类文件,存放类文件的目录多为controller或lib。所以说我们从文件名上就可以获取到很多信息。
(2)找好输入点,并确定有没有危险函数。
找好输入点?找什么的输入点呢。我们也知道有几个超全局变量如:$_GET $_POST $_SERVER…..
这几个不难发现都是用来接收外部输入的变量,这就是我们的输入点,而用户的输入都是不可信的。找到危险函数的同时,我们也要确定我们有没有输入点,可以对这个危险函数进行操作,且这个输入点输入的内容,程序有没有进行过滤或者过滤不充足。这几点是我们要考虑的问题。
(3)黑白盒交替进行,懂得抓包分析,逐步调试你觉得可疑的代码。
黑白盒交替进行,运用好抓包分析,对我们代码审计工作有着非常重要的作用。我们开始看到的是一个网站成形的样子,而不是一堆看到眼花缭乱的代码。所以如果是一些刚学代码审计,对代码通读能力较弱的人,可以先进行一下黑盒测试。我们可以一开始找到一个什么留言板,搜索框之类的,去测试有没有xss。有url跳转的地方去测试ssrf,或者登录后台添加或删除用户时,抓包分析,适当删除referer头来看看存不存在csrf。感觉麻烦的就拿AWVS,Nessus这些工具扫一波。
懂得调试代码,我们也可以单独将一段可疑的代码复制到另一个文件调试,多输出你想要的变量,来看看过滤规则等。
(4)最后一点是心态上,一定不能着急,要慢慢来,不要怕被打击,不断地总结经验。
实战演示
(1) SQL注入(演示云业CMS)
这个说真的,我这几天为了帮朋友搞个证书,我随便去源码站那里看看那些cms可以水一波证书,然后刚好看到这个某业,结果洞挖好之后,发现已经有人提交了,所以我不是第一个发现该漏洞的人。这次就用来当做教材分享给大家吧。官方也已经发布补丁。本次教学仅供参考学习,切勿做任何违法活动。
好的,我们现在直接到存放有全局函数的文件里,我们可以看到这个getip()用来获取ip的函数后面没有经过任何过滤,直接返回,这样就会造成一个http头注入。既然认为这是个漏洞,剩下我们就去看看哪里调用了这个函数。我这里用的是seay代码审计系统,这有一个全局搜索的功能,我们搜索getip()看看那里调用了该函数。
好的,这次我们点开这个/admin/login.php管理员登录文件
可以发现这个$logiparr调用了getip()函数,又未经过滤后传入checklogintimes函数,然后我们追踪一下这个函数。
可以发现这个过程是未经过任何过滤就传入值,所以我们抓包分析一下,可以发现当我们加了xxf头后,在ip地址后面加个引号会出现MYSQL报错提示。说明存在注入漏洞。
剩下偷个懒,直接扔sqlmap。
(2) Csrf(YzmCMSV5.5版本)
这个危害比较小,比较很鸡肋(厂商也不收呀),所以我拿来演示Csrf漏洞产生。
首先,是一个黑盒测试。我们直接登录管理员后台添加和删除会员的页面。通过抓取添加和删除会员时的数据包,分析。
网站程序只是简单的验证了一下referer头
删除referer头后,成功添加用户
所以,当referer头为空或者跟他同源时,则绕过检测。所以我们的paylaod代码就可以用标签配合data协议,以及base64编码实现。然后黑盒测试完成
该代码会添加一个haha的用户,实测效果:
然后我们来看下代码,其实这个关键点的就是,添加用户的的时候,没有加一个token验证,而这个检测只是简单的验证了referer头。
总结
上面两个只是比较小的案例,我这边建议的是开始最好从dvwa这些靶场,去看看产生漏洞的源码,了解漏洞产生的原因,然后再去找找比较简单,小众的CMS去挖掘。这些cms可以去网上那些源码之家找找。然后多看别人的文章,多参考参考大佬们的经验。看懂后最好自己能复现一下。