图片挂马 一般分为两个步骤
① 先把携带恶意脚本的图片上传到网站目录
② 利用网站漏洞修改图片后缀 如 .php
可以借助工具将恶意代码写入到图片中 通常是头部或者尾部追加 如果用纯文本编辑器打开后修改会破坏图片文件格式
我们可以将数据以二进制的方式读取,然后转换成十六进制的格式 全局匹配有没有类似脚本标记的代码
防止PHP 脚本 如果是尾部追加 不要求标记闭合 因此只检测前缀,闭合标记不区分大小写。
为了安全,禁止开启短标记。
一共有8种组合
<?php 3c3f706870
<?phP 3c3f706850
<?pHp 3c3f704870
<?pHP 3c3f704850
<?Php 3c3f506870
<?PhP 3c3f506850
<?PHp 3c3f504870
<?PHP 3c3f504850
防止 JS脚本 只需要检测 <s < /S 之类的组合即可 需要判断闭合
<s </s 3c73 3c2f73
<s </S 3c73 3c2f53
<S </s 3c53 3c2f73
<S </S 3c53 3c2f53
以DZ 代码为例,在上传图片前Hook资源检测
class plugin_xxx_misc extends plugin_xxx
{
function swfupload_check()
{
global $_G, $imgexts;
require_once libfile('function/upload');
$swfconfig = getuploadconfig($_G['uid'], $_G['fid']);
$imgexts = explode(",", str_replace(array(';', '*.', " "), array(',', '', ''), $swfconfig['imageexts']['ext']));
foreach ($_FILES as $k => $v) {
if (strpos($v['type'], "image/") !== false) {
$ext = str_replace("image/", "", $v['type']);
if (in_array($ext, $imgexts)) {
//指定规格文件 检测时候携带木马
$fp = fopen($v['tmp_name'], "rb");
// 以十六进制方式读取所有文件
$hexCode = bin2hex(fread($fp, $v['size']));
fclose($fp);
if (preg_match("/(3c3f706870)|(3c3f706850)|(3c3f704870)|(3c3f704850)|(3c3f506870)|(3c3f506850)|(3c3f504870)|(3c3f504850)|(3c73.+?3c2f73)|(3c73.+?3c2f53)|(3c53.+?3c2f73)|(3c53.+?3c2f53)/is", $hexCode)) {
// 没有合法的文件被上传
if($_GET['simple'] == 1) {
echo 'DISCUZUPLOAD|-9|0|1|0';
} elseif($_GET['simple'] == 2) {
echo 'DISCUZUPLOAD|'.($_GET['type'] == 'image' ? '1' : '0').'|-9|0|1||'.$v['name'].'|0';
} else {
exit("-9");
}
}
}
}
}
}
}
安全的处理方式
① 网站源码 和 上传的附件 分离 OSS 开发
② 非脚本目录禁止执行权限
③ 禁用系统函数 如 eval