[经验分享]——XSS 入门介绍

微博、知乎经常会有人问如何学习技术,如何入门安全,等等各类求学问题,但你连基本的搜索都偷懒,那该如何是好呢?微信支持模糊搜索,比如,你对某个知识点感兴趣,可以在搜索栏里搜一下文章,这样会出现很多,你根据自身喜好与需求来选择阅读就可以了,而且不少公众号会持续推出好内容,也可以保持关注。

今天安小妹给大家分享一篇来自云鼎实验室 安全研究员 Fooying 童鞋在 XSS 方面的经验之谈。

反射型、存储型、DOM型、突变型、UTF-7 XSS、MHTML XSS...什么是 XSS?XSS是前端安全中最常见的问题之一

什么是XSS?

XSS全称跨站脚本(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS,比较合适的方式应该叫做跨站脚本攻击。

跨站脚本攻击是一种常见的web安全漏洞,它主要是指攻击者可以再在面中插入恶意脚本代码,当受害者访问这些页面时,浏览器会解析并执行这些恶意代码,从而达到窃取用户身份/钓鱼/传播恶意代码等行为。

上图为一个典型的存储型XSS

什么是Payload?

Payload是一个专业术语,中文翻译过来是是有效荷载,可能经常会从搞安全的口里说出,那么什么是Payload?什么又是Exp?什么又是PoC?

先介绍PoC,PoC的全称是Proof of Concept,意思为概念验证,通俗的可以理解为漏洞验证脚本;而Exp是Exploit的简写,意思为漏洞利用,两者的区别即使一个仅限于验证,而一个是攻击利用。那么Payload呢?Payload是组成PoC和Exp的必要部分,也可以理解为验证代码。

打个比喻,假如某个窗户存在问题,任何钥匙都可以开,那么这个比喻为一个漏洞,那么用钥匙打开窗户,看下是否可以打开,这是PoC做的事,而打开窗户后进去偷东西,这是Exp做的事,而那把钥匙就可以理解为Payload,Payload不区分是否攻击利用。

比如刚才上图中的那个XSS漏洞的Payload 如下:

<img src=0 onerror=alert(5)>

XSS是怎么产生的?

经常也会听到一个词,注入点,或者说专业术语是向量,指的是黑客可控内容的提交的位置,比如下图中,搜索框,黑客可以控制输入的内容,然后进行提交,那么实际在测试漏洞的时候,就可以把注入点的内容替换为Payload进行验证。

1、GET 请求参数

 2、POST请求参数

 3、UA 

4、Referer 

5、URI

 ... 

一切可以提交数据到页面的点都称作向量

而XSS或者说Web漏洞是怎么产生的?对非预期输入的信任!

安全的本质是信任的问题,在上图中,搜索框的设置对于开发者来说,理论上应该输入的是正常的字符串,进行搜索,这是一种对输入的信任,并且这种信任对于开发者来说是有预期的,在他的预期里输入是正常的字符串,而漏洞的产生就在于出现了非预期的情况,开发者没有针对性的做处理。

之前挖的一个联想商城的XSS

test //预期无害的输入 

XSStest" onmouseover=alert(4438) x="  //非预期输入

XSS分类

接下来来看看不同的XSS分类

反射型(非持久型)

存储型(持久型)

DOM型

这是最常见的三种分类:

存储型

存储型XSS也叫持久型XSS,存储的意思就是Payload是有经过存储的,当一个页面存在存储型XSS的时候,XSS注入成功后,那么每次访问该页面都将触发XSS,典型的例子是:

如留言板

1、插入留言=>内容存储到数据库 2、查看留言=>内容从数据库提取出来 3、内容在页面显示

如果这里存在XSS,Payload可以通过留言内容提交,然后显示在页面的时候可以生效,那么就是典型的存储型XSS。

开头的那个就是存储型XSS,而这个也是之前微信网页版存在的另外一个存储型XSS,昵称中包含XSS 的Payload,在点开查看群成员列表的时候就可以触发XSS。

反射型

反射型XSS也叫非持久型XSS,最常见的是Payload是构造在网址的某个GET参数的值里。

比如这样的:

http://www.xx.com/company/search.html?key_pro="><script>confirm(1501)</script>

与存储型相反,反射型XSS的是通过提交内容,然后不经过数据库,直接反射回显在页面上,比如说以下代码就存在反射想的XSS,通过参数get的值提交Payload:

echo $_GET['get'];

这是之前微信朋友圈的一个活动,一个很常见的形式,通过微信点击进入,授权登录,自动获取微信昵称,然后生成邀请函,而实际上读取的昵称是构造在网址上的,由于没有过滤,于是存在反射型XSS,点击的话就会跳转我的博客。

http://tdf.qq.com/mobile/index2.html?name=<a href="http://www.fooying.com">点击抽奖</a>&type=share&from=timeline&isappinstalled=1

DOM 型

其实DOM型也属于反射型的一种,不过比较特殊,所以一般也当做一种单独类型。 比如之前挖过的一个wechat.com的DOM型XSS,最终构造完网址地址是这样的:

http://wechat.com/en/features.html#<img src=0 onerror='alert(0)'>

 而其背后代码生效大概是这样的:

<script>

var name = location.hash;

document.write(name);

</script>

上图是以前挖的一个qq.com子域名的一个注入点存在于Referer的DOM型XSS,在页面地址为:

http://www.0xsafe.com" onerror="alert(0) 

的页面点击链接跳转到 

datalib.ent.qq.com/tv/3362/detail.shtml

就可以触发XSS,页面中存在JS语句获取Referer,然后通过页面加入img标签的的方式发起了一个GET请求,应该是一个访问来源记录的东西,而对于Referer的值没有做处理,于是就存在DOM型XSS。

其他类型XSS

上面是大家经常听到的XSS类型,其实细分下来还有其他的XSS类型:

mXSS 突变型XSS

UXSS 通用型XSS

Flash XSS

UTF-7 XSS

MHTML XSS

CSS XSS

VBScript XSS

其中UTF-7、MHTML XSS、CSS XSS、VBScript XSS 只在低版本的IE中可以生效,现在应该基本不可见了,不过还是给大家介绍下。

mXSS

mXSS中文是突变型XSS,指的是原先的Payload提交是无害不会产生XSS,而由于一些特殊原因,如反编码等,导致Payload发生变异,导致的XSS。下面的漏洞是存在于以前版本的PC的QQ客户端的页面预览功能。

这是博客园提交的一篇文章,可以看到,提交的XSS Payload已经被转义了,不产生危害。

上图是在QQ客户端里分享上面的博客园那篇文章的链接,而QQ存在网址预览功能,于是点击网址可以在右侧显示出优化后的页面的内容,就导致了XSS的产生;这个预览功能实际上是QQ客户端内嵌了一个网页,这个页面对原网页内容进行提取和处理的过程中,将原本无害的XSS Payload进行了转码操作,于是导致了Payload 变异而产生了XSS,我记得这个XSS,我前后一共绕过了三四次,然后提交给了TSRC。

实际上,页面预览这个功能不是针对所有网址都可以预览,对于一些大型的网站,估计是有白名单机制或者是认证的网站,才能进行预览,随便一个网址是不可以的,这本身也是一种信任的限制在里面,如果是随意的网站,那就更好控制内容了,所以对于域名是有限制的;这里也存在一个信任的问题,理论上,这些大站的内容应该是没问题的,但实际情况是可被控制而导致产生XSS。

UXSS

UXSS全称Universal Cross-Site Scripting,翻译过来就是通用型XSS,也叫Universal  XSS。UXSS是一种利用浏览器或者浏览器扩展漏洞来制造产生XSS的条件并执行代码的一种攻击类型。UXSS 可以理解为Bypass 同源策略。

同源策略:不同域的客户端脚本在没明确授权的情况下,不能读写对方的资源

上图就是一个安卓内核浏览器存在的UXSS,访问www.0xsafe.org/x.html,页面嵌套TSRC的页面,然后可以读取到TSRC站点的Cookie,具体的介绍我之前有写过一篇文章:

http://www.fooying.com/uxss/

Flash XSS 

var a:String = root.loaderInfo.parameters.par

if(ExternalInterface.available){

    ExternalInterface.call("alert",a)

} else {

    trace(100)

}

stop()

Flash 产生的XSS主要来源于:

getURL/navigateToURL  访问跳转

ExternalInterface.call  调用js函数

前者是访问跳转到指定URL,后者则是调用页面中JS函数,比如上面的代码就会导致弹框。

http://img.xiami.net/res/kuang/xiamikuang5tab.swf?rname=%E6%96%B0%E6%AD%8C%3C%3E&dataUrl=http://www.0xsafe.org/0.xml&ccnum=300&recordNum=30

这是之前虾米的一个播放器页面,然后分享功能可以通过网址里的参数直接控制一些值,于是就存在了可控的注入点,通过构造Payload可以触发,当点击进行分享的时候就会触发XSS。

这里也有篇介绍Flash XSS的文章:

https://www.secpulse.com/archives/44299.html

大家感兴趣的也可以看下。

UTF-7 XSS

在以下两种场景可以在低版本IE浏览器触发UTF-7 XSS:

meta未指定编码,特定版本IE发现内容存在UTF-7编码内容,则自动以UTF-7解码处理

指定编码为UTF-7

UTF-7 XSS与普通XSS的区别就在于构造的Payload是UTF-7编码的,而基于上面两个场景的特性,低版本IE浏览器会自动解码,于是就可以产生XSS。

上图中,a变量的值就是UTF-7 XSS 的Payload,实际上是正常Payload UTF-7编码后的结果。

MHTML XSS

MHTML XSS 同样只存在于低版本的IE中,MHTML是MIME HTML (Multipurpose Internet Mail Extension HTML,聚合超文本标记语言)的缩写,把一个多附件(如图片,flash动画等)的网页内容都保存到单一档案的标准,是类似HTTP的协议,在IE中,当嵌入资源的URL的协议为MHTML 时,IE将调用MHTML Protocol Handler,把该资源当作MHTML格式文件解析处理。

x.html 内容:

Content-Type:multipart/related;boundary="x"

--x

Content-Location:xss

Content-Transfer-Encoding:base64

PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==

--x--

其中

PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== BASE64解码:<script>alert(1)</script>

通过特定的访问方式:

mhtml:www.x.com/a.html!xss

就可以触发XSS,具体更多内容大家也可以自己搜索看看。

CSS XSS

<style>   

      body {width:expression(alert(1));: red;}

</style>

CSS XSS 是缘于IE8 Beta2以前版本支持使用expression在CSS中定义表达式(公式)来达到建立元素间属性之间的联系等作用,于是就可以通过以上代码的方式触发XSS。

VBScript XSS

VBScript XSS 同上面几种XSS一样,也是微软的产物,也可以触发XSS。

<input type ="button" onClick="VBScript:Document.Write 'hello mr. Fooying'

MsgBox 'xss'">

XSS防御

XSS的防御我就不多说了,之前有翻译过OWASP Xenotix XSS 漏洞利用框架作者Ajin Abranham写的一个《给开发者的终极XSS防御备忘录》,已放网盘里,后台回复“安小妹美美哒”即可获取下载链接。

其他

其实关于XSS,有很多东西可以深入,包括说学习XSS需要了解各种编码转义,各种绕过,这篇文章主要是进行入门的介绍,然后还有一个介绍XSS蠕虫的文档,以前翻译的,大家按套路后台回复“安小妹美美哒”也可以获取下载链接,下面是是一些学习资源。

一些在线XSS游戏

http://prompt.ml/

答案:

https://github.com/cure53/xss-challenge-wiki/wiki/prompt.ml

http://escape.alf.nu/ 

答案:

http://blog.163.com/cmdbat@126/blog/static/17029212320149385547765/

https://xss-game.appspot.com/ 

答案:

http://www.freebuf.com/articles/web/36072.html

http://xss-quiz.int21h.jp/

答案:

http://blog.163.com/cmdbat@126/blog/static/1702921232013112542728566/

一些学习网址

https://www.owasp.org/index.php/XSS

https://www.google.com/about/appsecurity/

http://www.freebuf.com/author/black-hole(看原理与剖析系列)

http://html5sec.org/

http://www.pkav.net/

https://xssing.org/

原文发布于微信公众号 - 腾讯云安全(TencentCloudSecurity)

原文发表时间:2017-02-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

与http头安全相关的安全选项

由于HTTP是一个可扩展的协议,各浏览器厂商都率先推出了有效的头部,来阻止漏洞利用或提高利用漏洞的难度。了解它们是什么,掌握如何应用,可以提高系统的安全性。 下...

760
来自专栏落影的专栏

新鲜出炉的iOS面试题

为防止背题,大部分题目不设标准答案,重点考察面试者的基础知识和思维逻辑,答案的提示见后面。

1032
来自专栏FreeBuf

Firefox/Chrome渗透测试插件推荐

注意:360安全浏览器有些比较不错的功能值得体验下(firefox/chrome有些功能我没能正常使用)不喜勿喷。firefox一直是各位渗透测试必备的利器,这...

4777
来自专栏黑白安全

利用XSS绕过WAF进行SQL注入

通俗讲,就是XSS和sql注入相结合绕过waf。知识要能灵活运用嘛。做一个灵活的胖子(虽然我不是胖子)。

621
来自专栏FreeBuf

Offset2lib攻击测试:看我如何全面绕过64位Linux的内核防护

前言 免责声明:本站提供安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! 地址空间布局随机化(ASLR),在你知道目标代码或数据定位的前...

2109
来自专栏北京马哥教育

Python爬虫爬取美剧网站

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前...

1030
来自专栏重庆的技术分享区

前端安全问题

1284
来自专栏JarvanMo的IT专栏

Fluwx:让在Flutter中使用微信SDK成为可能

之前有了解的小伙伴可能已经看过Fluwx的一篇文章,不过那个时候Fluwx还是不太成熟。现在Fluwx的主体功能已经过成了。如果你正在或想开发一个Flutter...

1692
来自专栏FreeBuf

iOS 10 iMessage字符崩溃Bug又来了

近日,黑客@vincedes3发现了一个从iOS 8 到 iOS 10.2.1 b2通用的iMessage字符崩溃Bug,该Bug同样利用了和当年iOS 8的i...

2015
来自专栏张戈的专栏

PHP跨站脚本攻击(XSS)漏洞修复方法(一)

今天又做了一回奥特曼(out man),居然才发现 360 的综合搜索变成了好搜!前几天,其实看到过一次好搜,但是以为又是 DNS 劫持出现的流氓搜索。 今天细...

5366

扫码关注云+社区