php审计笔记
Comment前言
虽然自己之前有整理过代码审计的入门笔记,但还是比较幼稚,自己下手分析了几个cms才逐渐悟出点道道,说白了还是从危险函数入手,分析各个漏洞原理根据危险函数溯源,结合灰盒进行审计。
危险函数集锦与漏洞挖掘
php.ini
register_globals
直接把用户GET/POST提交的变量注册成全局变量。 php<5.4.0
allow_url_include
远程文件包含,提交参数直接执行php。
include $_GET['a']
magic_quotes_gpc
魔术引号自动过滤 GET/POST/COOKIE 但是不会处理$_SERVER(client-ip/referer注入) php<5.4
magic_quotes_runtime
作用同上,受体数据库或者文件中获取的数据 php<5.4
safe_mode
安全模式,开启是会对危险函数进行限制,可以使用safe_mode_exec_dir
指向可以操作危险函数的目录
open_basedir
限制php可以访问的目录
disable_functions
禁用函数,通过他禁用危险函数。dl()
也要禁用,它可以加载PHP扩展绕过限制(安全模式下禁用)
display_errors error_reporting
错误回显
漏洞挖掘
SQL注入
老生常谈的了,不去讲原理直接说一下关键字。
select from、mysql_connect、mysql_query、mysql_fetch_now、update、insert、delete
宽字节注入
set character_set_client=gbk
set names 'gbk'
mysql_set_charset('gbk')
一般情况下 set names 'gbk'
还是存在漏洞,官方推荐 mysql_set_charset
也是调用set names 'gbk'
,还是要配合
mysql_real_escape_string
修复建议使用PDO或者在查询之前先执行set names 'gbk',character_set_client=binary
二次urldecode注入
提交参数到WebServer时会自动进行URL解码,id=%2527
里面没有单引号所以可以绕过GPC,这时使用
urldecode
rawurldecode
解码参数会造成单引号绕过引发注入。
漏洞防范
addslashes
mysql_escape_string
intval
PDO
XSS
找没有被过滤的参数直接输出触发漏洞。
直接找一些输出函数
print、print_r、echo、printf、sprintf、die、var_dump、var_export
CSRF
越权在没有token限制下诱导高权限用户点击业务操作。黑盒测试在非静态页面看有没有token,去掉referer访问看返回值。
token
referer
文件操作漏洞
文件包含
include()、include_once()//遇到错误继续执行
require()、require_once()//遇到错误退出程序
包含日志图片等。
文件包含截断
%00截断 php<5.3 受限GPC/addslashes
./截断 Windows 240(./) Linux 2038 (./) 不受限GPC PHP<5.3
?伪截断 把?后的内容当做参数 不受版本与GPC限制
文件读取
file_get_contents()、highlight_file()、fopen()、readfile()、fread()、fgetss()、fgets()、parse_ini_file()、show_source()、file()
文件上传
move_uploaded_file()
上传函数只有这一个,别名绕过黑名单、GIF89a、文件类型、截断上传….
文件删除
文件名字可以用../跳转
unlink()
session_destroy()
黑盒去找功能点,找文件名参数传递过程看是否可控
代码执行
可以把代码注入到应用中去执行。
eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()、array_map()等
还有动态函数的代码执行
$_GET($POST["xx"])
命令执行
直接执行系统命令。
system()、exec()、shell_exec()、passthru()、pcntl_exec()、popen()、proc_open()一共七个函数,反引号也可以(`)
变量覆盖漏洞
我们自定义的参数值替换程序原有的变量值。
extract()、parse_str()/import_request_variables()使用这个函数相当于开启注册了全局变量(5-5.4)。$$
逻辑漏洞
重装,修改密码,越权,验证,cookie等。
判断绕过
in_array() 判断在不在数组内,比较之前自动进行类型转换
is_numeric() 传入hex判断为true,mysql可以使用hex代替字符串,易引发注入xss
== 双等于判断之前先做类型抓换
未die()、exit()、return()
小技巧
GPC
$_SERVER
函数获取的header字段不受GPC影响。
编码转换(宽字节注入)
字符截断
%00
iconv() 转码时char(128-255)截断
php://输入输出流
php://stdin
php://stdout
php://stderr
php://input
php://output
php://fd
php://memory
php://temp
php://filter