PHP代码审计全面指南(下)
1. PHP安全配置
1.1 安全模式配置
safe_mode = on
- 控制PHP函数权限,如限制
system()等危险函数 - 限制对关键文件(如
/etc/passwd)的访问
1.2 目录访问限制
open_basedir = D:/usr/www
- 限制PHP脚本只能访问指定目录
- 防止PHP脚本访问系统敏感文件
1.3 危险函数禁用
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo,escapeshellarg,escapeshellcmd,proc_close,proc_open,dl,show_source,get_cfg_var
- 禁止执行系统命令的函数
- 禁止查看PHP信息的函数
文件操作函数禁用:
disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
1.4 注册全局变量
register_globals = Off
- 防止GET/POST变量自动注册为全局变量
- 必须使用
$_GET['var']方式获取变量
1.5 SQL注入防护
magic_quotes_gpc = On
- 自动转义SQL查询中的特殊字符
- 将
'转为\'等,防止SQL注入
2. 代码审计工具
2.1 SeayPHP
2.2 Cobra
- Docker安装方式
- 文档:http://cobra.feei.cn/
- 提供规则自定义功能
2.3 RIPS
- 静态代码审计工具
- 直接上传源代码分析
- 下载:SourceForge
2.4 BadCode
- Sublime3插件
- GitHub地址:https://github.com/pwnsdx/BadCode
2.5 VulHint
- Sublime3插件
- 提供安全规则检查
3. Linux系统代码审计命令
3.1 XSS漏洞查找
grep -Ri "echo" .
grep -Ri "\$_" . | grep "echo"
grep -Ri "\$_GET" . | grep "echo"
grep -Ri "\$_POST" . | grep "echo"
grep -Ri "\$_REQUEST" . | grep "echo"
3.2 命令执行查找
grep -Ri "shell_exec(" .
grep -Ri "system(" .
grep -Ri "exec(" .
grep -Ri "popen(" .
grep -Ri "passthru(" .
grep -Ri "proc_open(" .
grep -Ri "pcntl_exec(" .
3.3 代码注入查找
grep -Ri "eval(" .
grep -Ri "assert(" .
grep -Ri "preg_replace" . | grep "/e"
grep -Ri "create_function(" .
3.4 SQL注入查找
grep -Ri "\$sql" .
grep -Ri "\$sql" . | grep "\$_"
3.5 信息泄露查找
grep -Ri "phpinfo" .
3.6 文件包含查找
grep -Ri "file_include" .
grep -Ri "include(" .
grep -Ri "require(" .
grep -Ri "require(\$file)" .
grep -Ri "include_once(" .
grep -Ri "require_once(" .
grep -Ri "require_once(" . | grep "\$_"
4. PHP漏洞函数详解
4.1 SQL注入相关函数
mysql_connect,mysql_query,mysql_fetch_*select,update,insert,delete
案例1:
$id = $_GET['id'];
$getid = "SELECT * FROM users WHERE id = $id";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>');
案例2:过滤绕过
function inject_check($str) {
$check=preg_match('/select|order|insert|update|eval|document|delete|injection|jection|link|and|or|from|union|into|load_file|outfile|<script>/',$str);
if($check){
echo "<script>alert('Filtered!!!');window.history.go(-1);</script>";
exit();
} else {
return $str;
}
}
- 可通过编码绕过过滤
4.2 宽字节注入
- 相关设置:
SET NAMES 'gbk',character_set_client=gbk - 原理:GBK编码可能"吃掉"转义字符
\ - 示例:
mysql_query("SET NAMES 'gbk'",$conn);
$name=addslashes($_GET['name']);
$sql="select * from hongrisec where name='".$name."'";
POC:?name=a%df' or 1=1; %20%23
4.3 二次编码注入
- 相关函数:
urldecode,rawurldecode - 示例:
$a=addslashes($_GET['p']);
$b=urldecode($a);
- 利用
%2527绕过(%25解码为%,与27组合成单引号)
4.4 MySQL二次注入
- 第一次将恶意数据存入数据库
- 第二次从数据库取出数据时触发漏洞
示例代码:
// 注册页面
$username = $_POST['username']; // 未过滤
$sql = "INSERT INTO users VALUES (NULL, '$username', ...)";
// 搜索页面
$rows = mysql_fetch_array($row);
$username = $rows['username']; // 从数据库取出未过滤的数据
$sql = "select * from users where username='$username'";
4.5 文件包含漏洞
- 相关函数:
include,include_once,require,require_once
案例1:基本包含
if(isset($_GET[page])) {
include $_GET[page];
}
案例2:目录限制绕过
if($_GET[page]) {
include("./action/".$_GET[page]);
}
// 使用../跳出目录
案例3:后缀限制绕过
if($_GET[page]) {
include("./action/".$_GET[page].".php");
}
// 使用%00截断(需PHP<5.3.4且magic_quotes_gpc=off)
4.6 文件上传漏洞
- 相关函数:
move_upload_file
示例:
if($_FILES['userfile']['type'] != "image/gif") {
echo "Sorry, we only allow uploading GIF images";
exit;
}
// 可通过修改Content-Type绕过
4.7 任意文件删除
- 相关函数:
unlink,session_destory
4.8 代码注入
- 相关函数:
eval,assert,preg_replace(/e),call_user_func,call_user_func_array,array_map
示例:
$username = $_POST['username'];
@eval("\$var1=$username;"); // 直接执行代码
4.9 命令执行
- 相关函数:
system,exec,shell_exec,passthru,pctnl_exec,popen,proc_exec, 反引号``
示例:
$cmd=$_GET['hongri'];
echo shell_exec($cmd);
4.10 变量覆盖
- 相关函数:
extract,parse_str, `
\[` ### 4.11 反序列化漏洞 - 相关函数:`unserialize`, `serialize` **序列化示例:** ```php class hongrisec { var $test = '123'; } $class1 = new hongrisec; $class1_ser = serialize($class1); // 输出:O:9:"hongrisec":1:{s:4:"test";s:3:"123";} ``` **反序列化漏洞:** - 通过构造恶意序列化数据执行任意代码 ### 4.12 随机数问题 - 相关函数:`rand`, `mt_rand` - 可能产生的安全问题将在完整报告中详细介绍 ## 5. 代码审计方法论 1. **工具+人工审计**: - 使用工具进行函数遍历和正则匹配 - 人工对漏洞敏感点进行深入分析 2. **代码通读法**: - 整体理解代码逻辑 - 耗时较长但能发现更有价值的漏洞 3. **重点关注**: - 用户输入点(GET/POST/COOKIE) - 数据库操作语句拼接处 - 文件操作函数调用点 - 动态代码执行位置 ## 6. 最佳实践建议 1. **输入验证**: - 对所有用户输入进行严格过滤 - 使用白名单机制而非黑名单 2. **安全函数使用**: - 使用预处理语句防止SQL注入 - 避免直接执行用户提供的命令 3. **错误处理**: - 禁止显示详细错误信息 - 使用自定义错误页面 4. **权限控制**: - 最小权限原则 - 分离系统用户和数据库用户 5. **定期更新**: - 保持PHP版本和扩展更新 - 及时修复已知漏洞 通过本指南,您应该能够全面了解PHP代码审计的关键技术和方法,有效识别和防范PHP应用程序中的安全漏洞。\]