最近在研读《白帽子讲web安全》和《Web前端黑客技术揭秘》,为了加深印象,闲暇之时做了一些总结。

下面是书中出现的一些专有词汇:

POC(Proof Of Concept):观点验证程序,运行这个程序就可以得出预期的结果,也就验证了观点。

Payload:有效负载,在病毒代码中实现这个功能的部分。

OWASP:开放式Web应用程序安全项目组织,协助个人、企业和机构来发现和使用可信赖软件。

XSS(Cross Site Script):跨站脚本攻击,想尽一切办法将你的脚本内容在目标网站中的目标用户的浏览器中执行。

如果要调试代码,可以直接在codepen的页面中进行。

一、XSS的几种类型

1)反射型XSS

XSS代码出现在URL中,作为输入提交到服务器,浏览器解析执行。也就是诱使用户点击一个恶意链接,发起攻击。

http://www.xss.com?x=<script>alert('xss')</script>

2)存储型XSS

提交的XSS代码会存储在服务器中(数据库、文件等媒介中),下次请求页面不用再提交XSS代码,典型的场景有博客文章、留言板等。

3)DOM Based XSS

与前面两种不一样的地方是不需要提交到服务器中,可直接在浏览器中执行

//输入http://www.xss.com#alert(1)
//执行锚点内容 显示提示框
eval(location.hash.substr(1))

常见的输入输出点可利用下面这些:

//常见的输入点:
document.URL
document.URLUnencoded
document.location(and many of its properties)
document.referrer
window.location(and many of its properties)
//常见的输出点:
document.write(…)
document.writeln(…)
document.body.innerHtml = …
//直接修改DOM树:
document.forms[0].action = … (and various other collections)
document.attachEvent(…)
document.create…(…)
document.execCommand(…)
document.body.…(accessing the DOM through the body object)
window.attachEvent(…)
//替换document URL:
document.location = … (and assigning to location’ s href, host and hostname)
document.location.hostname = …
document.location.replace(…)
document.location.assign(…)
document.URL = …
window.navigate(…)
//打开或修改新窗口:
document.open(…)
window.open(…)
window.location.href = … (and assigning to location’ s href, host and hostname)
//直接执行脚本:
eval(…)
window.execScript(…)
window.setInterval(…)
window.setTimeout(…)

二、XSS的危害

1)挂马

所谓挂马就是通过各种方法获得网站管理员账号,然后登陆网站后台,网页挂马可通过嵌入iframe实现。

2)盗取用户Cookie

通过“document.cookie”读取Cookie信息,发起劫持,可直接通过加密的Cookie登录凭证登录进用户的账户。

3)DDoS(Distributed Denial of Service)分布式拒绝攻击

在目标浏览器中注入Ajax请求的代码,Ajax请求的响应有同源策略的限制,但请求不会,所以可以同时发起请求攻击。

4)钓鱼攻击

在网页中,伪造真实的登录框,欺骗用户登录时,账号密码就会被盗取。

5)劫持用户Web行为

网站的很多操作是通过HTTP的get或post请求完成的,攻击者可通过代码发起这两种请求,例如构造form、ajax等。

6)XSS Worm(蠕虫)

当被攻击用户查看存在XSS蠕虫代码的内容时,蠕虫触发并开始感染传播。

用户之间发生交互行为的页面,存在存储型XSS,比较容易发起XSS Worm攻击。

三、XSS构造技巧

1)利用字符编码

这里要提一下HTML与JavaScript自解码机制,能够自动执行特定的方式。

1. HTML编码,具体有如下几种形式:

1. 进制编码:&#xH;(十六进制格式)、&#D;(十进制格式),最后的分号(;)可以不要。
2. HTML 实体编码(HtmlEncode),例如“&nbsp;、&lt;”等。
<button onclick="document.write('&lt;img src=@ onerror=alert(123) /&gt;')">click</button>

2. JavaScript编码,具体有如下几种形式:

1. Unicode 形式:\uH (十六进制)。
2. 普通十六进制:\xH。
3. 纯转义: \' 、 \" 、 \< 、 > 这样在特殊字符之前加 \ 进行转义。
//显示弹出框
document.write("\<img src\=@ onerror=alert\(123\) \/\>")

单纯的输入“<script>”等这些代码可能就会被马上过滤,但是如果再编码一次上面的几种形式,服务器过滤的时候可能就会漏掉。

关于编码的更多信息可以参考《JavaScript字符集编码与解码》。

还可以使用多种编码混淆在一起,更易于绕过服务器过滤。

<!--10进制编码background,16进制编码red-->
<div style="&#98&#97&#99kgr&#111&#117nd:\72\65\64;">content</div>

3. 标签天生具备HtmlEncode编码,包括标签“title、iframe、noscript、noframes、textarea、xmp、plaintext”。以textarea为例:

<textarea id="textarea">
<div>222</div>
</textarea>
//&lt;div&gt;222&lt;/div&gt;
document.getElementById('textarea').innerHTML

2)base标签

base标签定义页面上所有相对路径标签的host地址。

插入此标签设置域名,然后在远程服务器上定义相同文件名以及路径,劫持当前页面所有使用相对路径的标签。

<base href="http://www.pwstrick.com"/>
<!--解析为http://www.pwstrick.com/dist/x.jpg-->
<img src='/dist/x.jpg' />

3)window.name的使用

window对象不受同源策略的限制,可通过name属性实现跨域、跨页面传递参数。

window.name="alert(document.cookie)";
//在另外要攻击的页面中注入 就能绕过长度限制执行代码
eval(window.name);

有网友总结了绕过长度限制的技巧,但没找到排版漂亮的版本,只找到百度文档中的一篇,凑合一下看看吧《突破XSS字符数量限制

4)DOM fuzzing技巧

模糊测试(fuzzing)就是生成特定的数据输入到程序的某个位置,监视程序异常、奔溃、显示结果等。

在前端中可以将代码写到HTML、JavaScript或CSS中都可。

通过在线fuzzing工具Shazzer可以了解更多,不过要注册Twitter账号,我注册成功了但授权没成功,还是不能创建Vector,可惜了。

不过在网站上还是可以看到别人的编写的一些代码。

5)其他

在网上还有个开源小工具XSSProbe,代码简单可供参考。

浏览器有兼容特点,所以可以针对不同的浏览器注入不同代码,浏览器探测可参考《Detecting browsers javascript hacks

四、XSS防御

1)HttpOnly

浏览器将禁止页面的JS访问带有HttpOnly属性的Cookie。此属性解决的是XSS后的Cookie劫持攻击。

Cookie的使用过程大致如下:

1. 浏览器向服务器发起请求

2. 服务器响应后发送Set-Cookie头(此时可设置HttpOnly),向客户端浏览器写入Cookie

3. 浏览器访问该域下的所有页面都将发送该Cookie(只要Cookie还没过期)

<?php
header("Set-Cookie: hidden=value; httpOnly");

2)输入检查

在服务器与客户端添加验证规则,在特定的地方使用特定的规则,例如不匹配“script标签或<、>特殊符号”等。

启用“白名单原则”,可用于标签、属性或事件,只让正常的“a、div”等标签通过。

下面是FindingDOMXSS中对输入点(sources)的匹配规则:

/(location\s*[\[.])|([.\[]\s*["']?\s*(arguments|dialogArguments|innerHTML|write(ln)?
|open(Dialog)?|showModalDialog|cookie|URL|documentURI|baseURI|referrer|
name|opener|parent|top|content|self|frames)\W)|(localStorage|sessionStorage|Database)/

3)输出检查

变量输出到HTML页面时,可以使用编码或转义的方式防御XSS攻击。

针对HTML与JavaScript的编码可通过HtmlEncode和JavaScriptEncode实现,具体的函数内容可参考此处

在PHP中,可以使用一个开源的项目HTML Purifier实现对XSS的检查。

FindingDOMXSS中同样给出了输出点(sinks)的匹配规则:

/((src|href|data|location|code|value|action)\s*["'\]]*\s*\+?\s*=)|
((replace|assign|navigate|getResponseHeader|open(Dialog)?|showModalDialog|
eval|evaluate|execCommand|execScript|setTimeout|setInterval)\s*["'\]]*\s*\()/

4)DOM Based XSS防御

DOM Based XSS是直接从“JavaScript”中输出数据到HTML页面里,前面提到的都是从“服务器”中输出。

//x是从服务器中输出的,并且做了JavaScriptEncode操作
var x="\x20\x27onclick\x3dalert\x281\x29\x3b";
//在输出后会变成<a href=" " onclick="alert(1);">test</a>还是能执行点击
document.write("<a href='"+x+">test</a>");

所以要在合适的地方再做一次编码操作,下面是分情况说明:

如果输出到事件或脚本中,则再做一次JavaScriptEncode;如果输出到HTML内容或属性中,就再做一次HtmlEncode。

在OWASP中有一篇《DOM based XSS Prevention Cheat Sheet》,详细记录了发生场景和解决指南。

5)CSP

内容安全策略(CSP,Content Security Policy)用于指定哪些内容可执行。将用户输入的部分标为不可执行,就不会产生实际的危害。

为使CSP可用,需要配置HTTP响应头Content-Security-Policy,它的值可以是connect-src、default-src、script-src等。

参考资料:

网页挂马

HTML 与 javascript 自解码机制

DOM XSS

你所不知道的HostOnly Cookie

防御XSS的七条原则

XSS演示平台

谨慎能捕千秋蝉(一)——XSS的更多相关文章

  1. 谨慎能捕千秋蝉(二)——CSRF

    CSRF(Cross Site Request Forgery)跨站点请求伪造. CSRF的本质是当重要操作的参数都能被攻击者预测到,才能成功伪造请求. 一.场景演示 下图是一个伪造请求的场景,按顺序 ...

  2. 谨慎能捕千秋蝉(三)——界面操作劫持与HTML5安全

    一.界面操作劫持 1)ClickJacking ClickJacking点击劫持,这是一种视觉上的欺骗. 攻击者使用一个透明的.不可见的iframe,覆盖在网页的某个位置上,诱使用户点击iframe. ...

  3. iOS中的时间和日期

    怎么说?时间和日期不是了不起的属性.了不起的功能,但是,我们决不能够因此就“冷落”它. 一:怎么“搞到货”--如何获取时间.日期 //-=-==当前时间------默认显示“0时区”时间 NSDate ...

  4. 蝉知CMS5.6反射型XSS审计复现

    0x00 源起 最近在深入学习反射XSS时遇到蝉知CMS5.6反射型XSS这个案列,乍一看网上的漏洞介绍少之又少,也没有详细的审计复现流程.虽然是17年的漏洞了,不巧本人正是一个喜欢钻研的人.这个CM ...

  5. 蝉知CMS 7.X XSS漏洞复现

    个人博客地址:xzajyjs.cn 作为一个开源的企业门户系统(EPS), 企业可以非常方便地搭建一个专业的企业营销网站,进行宣传,开展业务,服务客户.蝉知系统内置了文章.产品.论坛.评论.会员.博客 ...

  6. Web攻防之XSS,CSRF,SQL注入

    摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨 ...

  7. XSS攻击:获取浏览器记住的明文密码

    作者:余弦(@evilcos) 0x01. XSS获取明文密码的多种方式 我已经感受到Web潮流带来的巨大革新,尤其是最近HTML5越来越火.浏览器们在客户端瓜分着这个Web OS,只要是对用户体验好 ...

  8. XSS跨站攻击

    目录 1 XSS跨站攻击简介 1 1.1 什么是XSS 1 1.2 XSS的分类 1 1.3 XSS的危害 1 2 XSS的攻击原理 1 2.1 本地式漏洞攻击 1 2.2 存储式漏洞攻击 2 2.3 ...

  9. XSS Challenges闯关笔记

    前言 做xss做疯了再来一个. 地址:https://xss-quiz.int21h.jp/ ,这个貌似是日本的一个安全研究员yamagata21做的. 做到第九关就跪了,而总共有二十关.一半都还没有 ...

随机推荐

  1. [iOS Animation]-CALayer 图层树

    图层的树状结构 巨妖有图层,洋葱也有图层,你有吗?我们都有图层 -- 史莱克 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做Layer Ki ...

  2. FZU 2092 收集水晶

    暴力DP. dp[x1][y1][x2][y2][t]表示,第一个人在(X1,Y1),第二个人在(X2,Y2),时间为t的时候获得的最大价值. 时间复杂度o(t*n*m*n*m*5*5). 什么都不优 ...

  3. 第三弹:ZFNet

    在所有深度网络中,卷积神经网和图像处理最为密切相关,卷积网在很多图片分类竞赛中都取得了很好的效果,但卷积网调参过程很不直观,很多时候都是碰运气.为此,卷积网发明者Yann LeCun的得意门生Matt ...

  4. JavaScript 事件模型 事件处理机制

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  5. 《算法导论》习题2.3-6 改进的InsertSort

    InsertSort中有关键的一步是把当前元素A[i]插入到已经排好序的A[1,i-1]的合适的位置上,在原始的InsertSort算法中, 采用的是从后往前一步一步查找的方法,习题2.3-6要求利用 ...

  6. iOS 生产证书 分类: ios相关 app相关 2015-05-22 14:49 175人阅读 评论(0) 收藏

    首先登陆https://developer.apple.com(99美元账号) 选择iOS Developer program 板块下的 Certificates,Identifiers & ...

  7. BLE 安卓APP控制LED灯的实现(转)

    源:BLE 安卓APP控制LED灯的实现 //注:参考AmoMcu源代码修改. 打开APP,检查蓝牙是否打开 BluetoothAdapter mBluetoothAdapter; final Blu ...

  8. sql数据库恢复 文件丢失误删除 误格式化置疑报错修复 数据库置疑修复总结/SQL SERVER 2000/2005/2008/2008R2

    数据库置疑的原因会有多种多样,不同的问题采用的步骤也会有所不同,以下的步骤不能适用所有的情况,但包括了一些基本的步骤. 数据库置疑是指数据库内部处于不一致的状态,很有可能会有数据丢失.我们推荐您从做数 ...

  9. 一 APPIUM基本理论知识

    1.APPIUM介绍 Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合应用.所谓的“移动原生应用”是指那些用 iOS SDK 或者 A ...

  10. Mysql死锁问题解决方式 & 聚簇索引、隔离级别等知识

    参考了这篇文章:http://www.cnblogs.com/LBSer/p/5183300.html  <mysql死锁问题分析> 写的不错. 如果Mysql死锁,会报出: 1.1 死锁 ...