编程基础 | PHP代码审记(下)
字数 1945 2025-08-18 11:39:26

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

2.3 RIPS

  • 静态代码审计工具
  • 直接上传源代码分析
  • 下载:SourceForge

2.4 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二次注入

  1. 第一次将恶意数据存入数据库
  2. 第二次从数据库取出数据时触发漏洞

示例代码:

// 注册页面
$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应用程序中的安全漏洞。\]

PHP代码审计全面指南(下) 1. PHP安全配置 1.1 安全模式配置 控制PHP函数权限,如限制 system() 等危险函数 限制对关键文件(如 /etc/passwd )的访问 1.2 目录访问限制 限制PHP脚本只能访问指定目录 防止PHP脚本访问系统敏感文件 1.3 危险函数禁用 禁止执行系统命令的函数 禁止查看PHP信息的函数 文件操作函数禁用: 1.4 注册全局变量 防止GET/POST变量自动注册为全局变量 必须使用 $_GET['var'] 方式获取变量 1.5 SQL注入防护 自动转义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漏洞查找 3.2 命令执行查找 3.3 代码注入查找 3.4 SQL注入查找 3.5 信息泄露查找 3.6 文件包含查找 4. PHP漏洞函数详解 4.1 SQL注入相关函数 mysql_connect , mysql_query , mysql_fetch_* select , update , insert , delete 案例1: 案例2:过滤绕过 可通过编码绕过过滤 4.2 宽字节注入 相关设置: SET NAMES 'gbk' , character_set_client=gbk 原理:GBK编码可能"吃掉"转义字符 \ 示例: POC: ?name=a%df' or 1=1; %20%23 4.3 二次编码注入 相关函数: urldecode , rawurldecode 示例: 利用 %2527 绕过( %25 解码为 % ,与 27 组合成单引号) 4.4 MySQL二次注入 第一次将恶意数据存入数据库 第二次从数据库取出数据时触发漏洞 示例代码: 4.5 文件包含漏洞 相关函数: include , include_once , require , require_once 案例1:基本包含 案例2:目录限制绕过 案例3:后缀限制绕过 4.6 文件上传漏洞 相关函数: move_upload_file 示例: 4.7 任意文件删除 相关函数: unlink , session_destory 4.8 代码注入 相关函数: eval , assert , preg_replace(/e) , call_user_func , call_user_func_array , array_map 示例: 4.9 命令执行 相关函数: system , exec , shell_exec , passthru , pctnl_exec , popen , proc_exec , 反引号 `` 示例: 4.10 变量覆盖 相关函数: extract , parse_str , $$ 4.11 反序列化漏洞 相关函数: unserialize , serialize 序列化示例: 反序列化漏洞: 通过构造恶意序列化数据执行任意代码 4.12 随机数问题 相关函数: rand , mt_rand 可能产生的安全问题将在完整报告中详细介绍 5. 代码审计方法论 工具+人工审计 : 使用工具进行函数遍历和正则匹配 人工对漏洞敏感点进行深入分析 代码通读法 : 整体理解代码逻辑 耗时较长但能发现更有价值的漏洞 重点关注 : 用户输入点(GET/POST/COOKIE) 数据库操作语句拼接处 文件操作函数调用点 动态代码执行位置 6. 最佳实践建议 输入验证 : 对所有用户输入进行严格过滤 使用白名单机制而非黑名单 安全函数使用 : 使用预处理语句防止SQL注入 避免直接执行用户提供的命令 错误处理 : 禁止显示详细错误信息 使用自定义错误页面 权限控制 : 最小权限原则 分离系统用户和数据库用户 定期更新 : 保持PHP版本和扩展更新 及时修复已知漏洞 通过本指南,您应该能够全面了解PHP代码审计的关键技术和方法,有效识别和防范PHP应用程序中的安全漏洞。