前言

虽然自己之前有整理过代码审计的入门笔记,但还是比较幼稚,自己下手分析了几个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
正则表达没有使用限定符(^ $)