1 php代码审计的意义
1.1 什么是代码审计
就是获取目标的代码,这个目标可以是一个网站,也可以是一个手机app
1.2 黑盒测试与白盒测试的区别
在代码审计中黑盒和白盒的主要区别就在于是否可以拿到源代码,黑盒是拿不到源代码的,白盒是可以拿到的
1.3 是否应该学习代码审计
测试流程必不可少的一部分 突破渗透测试的瓶颈 参与众测,赢取高额奖金
1.4 代码审计,需要学到什么程度
不需要像安全研究人员一样,挖掘到一些0day,才说明大家学会代码审计
2 PHP代码审计入门必备知识
2.1 代码审计需要使用那些软件
Seay源代码审计系统 快速函数定位 自定义多窗口搜索 MySQL执行监控 一键调试选中代码 文档自动查询 自动审计
2.2 PHP代码审计流程
2.2.1 通读全文法
通读全文法作为最麻烦的方法也是最全面的审计方法,特别是大型的项目,通读全文也是了解整个项目,了解业务逻辑最好方法,了解整个项目,这样也可以挖掘到更多的中高危漏洞
2.2.2 敏感函数参数回溯法
这个方法是最有效的,最常用的方法,大多数漏洞的产生是因为函数的使用不当导致的,我们可以全局搜索一些敏感函数,看看是否有未经过滤的参数传进来,就可以挖掘漏洞,这里我们也可以使用Seay源代码审计系统
2.2.3 定向功能分析法
这个方法主要是根据程序的业务逻辑来进行代码审计的 查看网站的功能,大概推测可能存在那些漏洞
常见的功能漏洞 程序初始安装 文件上传 数据库备份 找回密码 验证码
2.3 PHP服务架构
CLI(在命令行中运行) PHP Built-in Webserver Apache php_mod Swoole
2.4 PHP安全配置
magic_quotes_gpc:5.3后废弃,5.4后移除 register_global:4.2后默认为false allow_url_include:默认false allow_url_fopen:默认false request_order:5.3后从GPC改为GP short_open_tag:5.4以后,无论是否开启,<?=..?>总是可以被执行 open_basedir:限制PHP可以访问到那些目录,哪些目录不能访问 disable_functions/disable_classes:限制PHP不能执行那些函数或者类 enable_dll:是否允许加载PHP扩展
3 PHP危险函数归纳
3.1 函数归纳
include/require/include_once/require_once eval/assert/preg_replace/create_function system/passthru/exec/shell_exec file_get_contents/fread/readfile/file/show_source file_put_contents/fwrite/mkdir unlink/rmdir move_uploaded_file/copy/rename extract/parse_str simplexml_load_files/simplexal_load_string unserialize urldecode/base64_decode
3.2 代码执行函数
eval 把字符串作为PHP代码执行,很多常见的webshell都是用eval来执行具体操作的 assert 也是把字符串作为PHP代码执行 preg_replace 是正则表达式函数
3.3 包含函数
文件包含函数主要作用为包含并运行指定文件 include $file,如果$file可控的情况下,我们就可以包含任意文件了,从而达到getshell的目的 包含函数也能够读取任意文件内容,这就需要用到支持的协议和封装协议和过滤器
3.4命令执行函数
exec() 执行一个外部程序 system() 执行外部程序,并且显示输出 只要命令就能执行的参数可控系统命令
3.5 文件操作函数
copy:拷贝文件 file_get_contents:将整个文件读入一个字符串 file_put_contents:将一个字符串写入文件 unlink:删除文件 rmdir:删除目录
3.6 一些有漏洞的应用练习
XZ.Aliyun.com Github.com Wooyun镜像站点漏洞