代码审计感觉学起来比较痛苦,但是木的办法,要想找到自己的0day,这一道坎感觉是无法越过了。或许也能加深我们对于漏洞原理的理解。
代码审计前的准备
1、熟悉网站结构,大体框架
2、入口文件:index.php admin.php等等
3、配置文件config.php、php.ini、user.ini,httped.conf
4、过滤功能:就是对于参数获取之后有没有什么处理,比如替换、删除等等
三种审计方法
1、通读全部代码:公司企业使用的,比较费时,对于小的、代码量少的也可使用
2、敏感函数查找分析:找到敏感函数,然后看看他的来源和处理过程,有没有人为可控的参数传入;我感觉我们私人审计可能这个方法用的会多点
3、定向功能分析:根据程序的业务逻辑来审计(据说大佬都是用的这个方法)
常见业务功能漏洞:
程序初始安装、站点信息泄露、文件上传管理、登录认证权限管理、数据库备份恢复、找回密码、验证码
PHP配置文件的分析
几个重要的php.ini选项:
1、Register Globals = Off 默认值预设为 Off(下面写的都是基本默认的)设定为 On 时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,容易产生变量覆盖(视情况,但是全局变量关掉会很麻烦)
2、display_errors = On 错误等级决定是否可能泄露绝对路径(视情况,错误全关影响调试) E_ALL 最高级别,展示所有错误信息,审计时最好打开,网站上线时关闭
3、short_open_tag = On 默认可用短标签 短标签有可能可以帮助我们渗透时免查、免杀;这个设置可以将<?php?>缩写为<??>;<?echo缩写为<?=
4、safe_mode = Off 默认关闭 安全模式,PHP 用来限制文档的存取、限制环境变量的存取,限制system()等函数执行 以及敏感文件的读取
5、safe_mode_exec_dir = /var/www/html 这个目录下才可以执行(高版本PHP已废弃)
6、disable_classes = disable_functions = opendir,readdir,scandir,fopen,unlink 禁用某些类、函数 在php.ini设置
7、file_uploads = on upload_max_filesize = 8M 设置上传及最大上传文件大小
8、upload_tmp_dir = 文件上传临时目录 Linux是/tmp windows是C:WindowsTemp
9、open_basedir = .:/tmp/ 用户访问目录限制 默认不配置是空的 一般都是只能访问网站目录 此配置可有效防止PHP木马跨站运行;Linux使用:分隔 windows使用;分隔
10、magic quotes 魔术引号(宽字节注入大家不会陌生) magic_quotes_gpc = On 5.4.0移除 虽然移除,但是这个功能很可能被开发者自定义使用
11、open_base_dir 禁止使用目录以外的文件操作,有效的消除文件包含
12、expose_php 设为 Off ,这样 php 不会在 http 文件头中泄露信息
13、allow_url_fopen = On 一直都是开启的 可以远程打开url文件,但是这个选项不是执行远程文件的
14、allow_url_include = Off 是否允许远程文件包含(PHP5.2以后默认关闭此功能)允许include、include_once等文件包含函数执行远程文件,所以这个选项比较重要,如果打开远程包含一句话木马就比较可怕了;关于远程文件包含推荐先知社区的伪协议文件包含文章
15、log_errors = On 记录错误日志得就带上吧
其他:
16、session.cookie_httponly = ON 时,客户端脚本(JavaScript等)无法访问该 cookie,打开该指令可以有效预防通过 XSS 攻击劫持会话ID
17、session.cookie_domain 是否只包含本域,如果是父域,则其他子域能够获取本域的cookies
18、如果使用 HTTPS,那么应该设置 session.cookie_secure=ON,确保使用 HTTPS 来传输 cookies
各种漏洞的敏感函数
- 跨站脚本漏洞
- 文件包含(文件泄露)
- 文件操作(管理)
- 命令(代码)执行:命令执行和代码执行的原理其实有细微差别:详见
- SQL注入
- 变量覆盖
- 会话安全
- 特殊函数
- SSRF漏洞就找一些参数和功能点吧
1、跨站脚本漏洞(就是直接echo能输出链接的诱骗别人去点的那种):
echo、print、printf、vprintf、<%=$test%>
2、文件包含(文件泄露):
include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、file
3、文件操作(管理):
copy、file_get_contents、file_put_contents、file、fopen、move_uploaded_file、readfile、rmdir、rename、unlink&delete、fwrite、fread、chmod、fgetc、fgetcsv、fgets、fgetss、
4、命令(代码)执行:
eval():把给定的字符串作为PHP代码执行
preg_replace():当与"/e"开关一起使用时,替换字符串将被解释为PHP代码(这个地方可能会不太好理解)
exec()、shell_exec() proc_open()、pentl_exec() passthru()、 escapeshellcmd()
passthru():执行指定命令,返回所有结果到客户浏览器
`` (反引号) 执行指定命令,返回所有结果到一个数组
system() 同passthru(),但是不处理二进制数据
popen() 执行指定的命令,把输入或输出连接到PHP文件描述符
assert断言也具有把字符串当做代码执行的效果
call_user_func、call_user_func_array、create_function 代码注入(闭合+exp+注释掉后面部分)
array_walk()、 array_map()、array_filter()、usort()、ob_start()
5、SQL注入:
insert、delete、update、select(SQL语句查询的地方,看看有没有对变量过滤,有没有可乘之机)
6、变量覆盖:
$$(这个可能也不太好理解)、extract()、parse_str、mb_parse_str、import_request_variables、Register_globals=ON 时,GET 方式提交变量会直接覆盖
7、会话安全:
HTTPOnly 设置、domain 设置、path 设置设置设置、 cookies 持续时间 、 secure 设置、session 固定
8、特殊函数:
配置相关:ini_get()成功时返回配置选项的值
数字判断:is_numeric()数字或数字字符串返回true,仅仅使用is_numeric()而不使用intval转换可能插入16进制字符串到数据库,造成二次注入
变量覆盖:parse_str()
列目录:glob()
无参数函数获取信息:
get_defined_vars() //返回包含所有定义的变量列表的多维数组,包括环境变量、服务器变量、用户自定义
get_defined_constants()//返回当前所有已定义的常量名和值
get_defined_functions() //返回一个包含所有已定义函数列表和多维数组
get_include_files() //返回包含所有文件的文件名
9、SSRF漏洞就找一些参数和功能点吧
函数:curl等
参数:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain .......
功能点:图片链接、分享、收藏下载
最后附一张审计学习中比较全面的思维导图: