这一系列的博客文章将向你展示如何在单页或富JavaScript的应用程序上识别DOM XSS的问题。作为示例,我们将在DOM XSS playground(https://domgo.at)上解决10个练习题目,并为检测到的问题创建了简单的概念证明漏洞。

这篇文章的内容涵盖了前两个练习的设置说明和解决方案。剩余的练习将在我们发布的其他文章中提到。我们还将发布一个gitbook,其中包含了Appsecco书籍门户网站上所有练习的解决方案。

更新:gitbook会挂在我们的图书门户网站上—— https://appsecco.com/books/automating-discovery-and-exploiting-dom-client-xss/

什么是DOM XSS / Client XSS?

纵观Cross Site Scripting漏洞的历史,在测试人员和开发人员的心中都占有特殊的地位。使用标准检的测技术很难检测到这种XSS的变体,并且相对的来说,这种漏洞的变体很容易出现在大型的JS应用程序中。

OWASP将其定义为XSS的漏洞类型,其中的原因是由于这种漏洞是在受害者浏览器中通过原始客户端脚本修改DOM环境而执行攻击有效载荷,因此客户端代码以一种 “意外” 的方式运行。也就是说,页面本身(即HTTP响应)不会改变,但由于DOM环境中发生了恶意的修改,页面中包含的客户端代码执行方式发生了改变。

简而言之,当来自DOM源(如location.hash)的用户输入发现它赋值到了DOM接收器(如HTMLElement.innerHTML)时,就会发生客户端XSS漏洞。DOM中有多个源,也可以有多个接收器,具体取决于JS的复杂程度和其所实现的功能。

通过手动的方式或代码审查来检测DOM XSS可能会花费大量的时间。一种可行的技术是通过一个工具从服务器发送流量,该工具可以注入自己的JS来监控DOM变化,只需浏览网站即可枚举所有源和接收器。

进入Sboxr

Sboxr是一个测试和调试Web应用程序的工具,尤其是大型的JavaScript应用程序。Sboxr通过在浏览器和服务器之间的流量中注入它自己的JS代码(称为DOM传感器)来工作,该代码在使用站点时监视JS的使用情况,源,接收器,变量分配,函数调用等。然后,它通过其Web控制台显示用户控制的数据在数据最终出现在执行接收器中时所采用的各种流的视图。

设置Sboxr和Chrome

我们使用Ubuntu 18.04来设置我们的攻击工具链以及Chrome 72。以下步骤将帮助你进行设置:

1、从供应商网站获取Sboxr的许可副本 - https://sboxr.com/

2、运行Sboxr需要.NET 核心 SDK,可以按照这里的(https://dotnet.microsoft.com/download/linux-package-manager/ubuntu18-04/sdk-current)说明在Linux上进行安装。对于Windows系统,请按照这个(https://dotnet.microsoft.com/download)说明进行操作即可。

3、安装完成后,通过运行dotnet Sboxr.dll启动Sboxr

4、程序启动后会在端口3333 http://localhost:3333/console 上访问到Sboxr Web界面(用于管理和分析发现的问题),端口3331是一个代理端口。

5、如果你希望链接Burp或其他拦截代理,请浏览并单击HTTP Sensor以设置上游代理(例如Burp或OWASP ZAP)的IP地址和端口。

设置完成后,我们需要配置浏览器向Sboxr发送流量(然后可以转发到Burp或OWASP ZAP)。

Sboxr目前还不支持SOCKS代理,因此你需要使用Burp或OWASP ZAP进行链接以阻止流量。

ED_:D_=>HTTPS站点可能无法与Sboxr一起正常工作,因为我们没有应该要导入的证书。因此,我们使用--ignore-certificate-errors参数启动Chrome(我们注意到Firefox的about:config中的禁用HSTS检查的network.stricttransportsecurity.preloadlist选项有一些问题,因此我们暂时会一直使用Chrome)。

在Linux上,使用以下命令启动Chrome:

mkdir -p ~/.chrome;/opt/google/chrome/chrome -incognito --ignore-certificate-errors --proxy-server=http=http://localhost:3331\;https=http://localhost:3331 --user-data-dir=~/.chrome

在Windows系统上,可以执行以下操作(假设你的安装路径也是标准的安装路径)

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -incognito --ignore-certificate-errors --proxy-server=http=http://localhost:3331;https=http://localhost:3331 --user-\Program Files(x86)\Google \Chrome \Application \chrome.exe”-incognito --ignore-certificate-errors --proxy-server = http = http:// localhost:3331; https = http://localhost:3331 --user-data-dir =“C:\Users \%Username%\AppData \Local \Temp \TestChromeProxy”

检测并利用DOM XSS

在本文的这一部分,我们将使用Sboxr的创建者设置的客户端XSS playground来练习我们对客户端XSS漏洞的检测和利用技能。

https://domgo.at 。

概念验证漏洞Demo。这些漏洞可用于在提交错误报告时创建你自己的PoC,因为它们允许读者查看正在执行的用户控制的数据。

练习1

1、浏览到https://domgo.at/ 并单击左侧窗格中的练习1,就可以使用命令行选项启动Chrome中的第一个练习。

2、切换到Sboxr控制台并单击Sboxr侧栏中的代码执行

3、从HTML上下文可以看出,数据源是location.hashproperty,导致执行的接收器是HTMLElement.innerHTML

4、点击“代码执行”图标将打开代码执行详细信息的窗口。

5、通过单击View事件位置详细信息的那个狙击图标,我们可以清楚地看到JS中我们的数据在哪里被接收器HTMLElement.innerHTML使用。

6、为了显示location.hash属性是可利用的,我们通过源传递JS并让它到达接收器以查看它是否已执行。

7、题目的解决方案是通过location.hash属性传递。最终的漏洞利用PoC是 -  https://domgo.at/cxss/example/1?payload=abcd&sp=x#

练习2

1、单击侧栏上的练习1来加载练习题目1

2、单击侧栏上的练习 -  2以加载第二个练习题目。必须通过点击操作进入题目,而不是直接浏览到题目的URL,因为本练习中的源是document.referrer属性。

3、我们按照与上一个练习相同的步骤开始,然后单击Sboxr侧栏中的“代码执行”

4、我们从易受攻击的代码中看到,如果referrer的URL中有一个名为payload的参数,则将其提取并传递给接收器。

5、我们可以使用以下简单的HTML页面构建我们的漏洞。将其另存为exercise2.html并在本地托管(nginx/Apache/python/node/anything),然后通过http://127.0.0.1/exercise2.html?payload=进行访问。

PoC for Exercise 2 of https://domgo.at

window.location="https://domgo.at/cxss/example/2"

6、该页面将加载并立即重定向到练习页面,因为referrer属性是用户控制的代码执行是可能的。

接下来我们来说说其他4个练习的解决方案。剩余的练习将在我们将发布的其他文章中提到。

练习3

在许多Web应用程序中,来自外部的第三方应用程序的数据可以使用接收器,并将其作为目标应用程序的一部分,而无需清理收到的响应。在这种情况下,第三方应用程序的XHR端点可以将恶意代码注入到目标应用程序中。即使在XHR响应来自同一站点的情况下,你也需要验证数据在服务器上的结果。在现代应用程序中,应用程序从不同的源收集不受信任的数据并将它们存储在服务器端数据库中,最终这些不受信任的数据会进入目标应用程序,从而导致持久性的DOM XSS。

此练习涉及对JSON端点的XHR请求,该请求会将数据反射到客户端。然后将反射的数据添加到接收器HTMLElement.innerHTML,从而执行任意代码。

1、在“练习”页面的文本框中输入随机字符串,然后单击“执行有效载荷”的按钮。

2、数据将由JSON端点反射到https://domgo.at/data.json?payload=thanos

3、在代码执行窗口下使用Sboxr查看从源到接收器的数据流

4、我们可以准确地看到来自JSON响应的内容在接收器中使用并创建了一个漏洞。

5、要利用漏洞,请在文本框中传递字符串

练习4

与XHR响应类似,受信任的websocket数据是良性的,无论它来自何处都可能导致DOM XSS问题。

此练习涉及对安全websocket端点的websocket请求,该请求将数据反射到客户端。然后将反射的数据添加到接收器HTMLElement.innerHTML,从而执行任意代码。

1、在“练习”页面的文本框中输入随机字符串,然后单击“执行有效载荷”的按钮。

2、数据由wss://domgo.at/ws上的Websocket端点反射出来

3、在代码执行窗口下使用Sboxr查看从源到接收器的数据流

4、我们可以准确地看到响应在接收器中使用的内容并创建了一个漏洞。

5、要利用漏洞,请在文本框中传递字符串

练习5

XHR,fetch API,websockets或postMessage等通信信道经常被忽视,但最终可能会成为DOM XSS漏洞的源。特别是,如果数据来自不同的源。在响应中信任数据并通过接收器呈现/评估它可能导致DOM XSS问题,作为分析师,你必须留意这些源。

本练习涉及一个postMessage,它将用户控制的有效载荷发送到window.onmessage事件处理程序,并将数据下沉到HTMLElement.innerHTML,执行任意代码。

1、在“练习”页面的文本框中输入随机字符串,然后单击“执行有效载荷”的按钮。

2、在这种情况下,数据源是来自https://domgo.at(同源)的窗口消息。

3、在代码执行窗口下使用Sboxr查看从源到接收器的数据流

4、我们可以准确地看到响应在接收器中使用的内容并创建了一个漏洞。

5、要利用漏洞,请在文本框中传递字符串

练习6

另一个有趣的不受信任的数据来源是浏览器的存储源,包括localStorage,sessionStorage和IndexedDB。虽然攻击者无法直接控制DOM存储(除非应用程序中已存在XSS),但攻击者可能能够通过其他HTML元素或JS源将恶意数据引入存储源。此数据最终可能会从存储源的接收器中生成,并导致DOM XSS。

一个很好的例子就是Twitter子域上的DOM XSS  - https://hackerone.com/reports/297968

在本练习中,数据源是HTML LocalStorage。页面中的JS从localStorage读取数据并将其传送到HTMLElement.innerHTML,从而执行任意代码。

1、在“练习”页面的文本框中输入随机字符串,然后单击“执行有效载荷”的按钮。

2、在这种情况下,数据源是HTML localStorage。

3、在代码窗口下使用Sboxr查看从源到接收器的数据流

4、我们可以准确地看到响应在接收器中使用的内容并创建了一个漏洞。

5. 要利用漏洞,请在文本框中传递字符串

练习7

在本练习中,数据源是location.hash。但是,数据在添加到接收器HTMLElement.innerHTML之前进行处理。

1、单击练习7并注意URL中的哈希值。

2、在代码执行窗口下使用Sboxr查看从源到接收器的数据流

3、我们可以确切地看到location.hash数据是如何北处理的,并从那里构建了一个漏洞。

4、从location.hash获取值,并将HTML标记替换为其HTML实体等价物( 替换为>)。然后将数据附加到

练习8

这个练习与练习7完全相同,唯一的区别是JS期望location.hash包含一个名称值的字符串键值对(任何包含=字符的字符串)。

1、如果我们通过Sboxr查看JS,我们注意到通过location.hash传递的字符串在第一个=处被拆分,而字符串的其余部分用于构造转到接收器的数据(锚标签,如上一个练习)

2、在这种情况下的漏洞利用URL是https://domgo.at/cxss/example/8

练习9

本练习使用两个源location.hash和window.name处理来自这些源的数据,然后将其发送到HTMLElement.innerHTML 接收器。

1、单击练习9并注意包含哈希值user=12345的URL

2、在这种情况下有两个来源。最终发送到接收器HTMLElement.innerHTML的数据是从两个源获得的。

3、查看代码执行细节,很明显,来自location.hash的数据在=符号处被分割,然后只选择前10个字符并将其附加到window.name中的数据。此外,在被附加到window.name中的数据之前,通过使用等效的HTML实体来清理出现的双引号。

4. 为此写一个漏洞EXP就意味着

· 通过location.hash传递10个字符但不能出现双引号(我们显然不能使用元素属性注入,因为我们无法突破href属性)

· 通过window.name传递JS的其余部分,并让易受攻击的JS将它们都附加到一起,最后就产生出我们想要的漏洞EXP

· 我们不能突破href属性,因为我们已经在href中,我们可以使用javascript:protocol handler来点击锚标签来触发我们的代码

· 本质上,我们是利用了javascript:alert(document.domain)作为我们的PoC。

5. 创建包含以下代码的HTML页面,将其托管在本地服务器上并在浏览器中打开它。

PoC for Exercise 9 of https://domgo.at

6.大多数现代浏览器可能会使用内置的弹出窗口阻止程序启动阻止新窗口,但你必须允许这样做。如果你想摆脱弹出警告,你可以修改HTML PoC以触发用户驱动事件(如鼠标点击等)上的window.open。

PoC for Exercise 9 of https://domgo.at

Click me for solution to Exercise 9

7. 一旦你启动新窗口后,单击Welcome消息就会执行我们的有效载荷。

练习10

这与练习9类似,但JavaScript除外,其中的代码路径是基于条件分支执行的。使用手动测试很容易遗漏这一点,因为仅当满足JS中的某些代码条件时,接收器才会填充我们的恶意数据。

在本练习中,我们通过两个来源location.href和window.name传入数据,在满足分支条件和一些简单的处理之后就可以将其传递到HTMLElement.innerHTML 接收器。

客户端JS中可能存在条件分支代码,这可能会使创建有效的漏洞EXP变得有点困难。此练习显示了如何检测条件分支并传递正确的字符串,以便可以访问接收器并执行攻击者的代码。

1、如果我们查看来自源的数据流,我们会看到来自location.href和window.name的数据被附加在一起。

2、可以使用window.open()使用我们的数据设置window.name中的数据。在本地服务器上托管以下内容并在浏览器中打开它。在浏览器提示时启用浏览器的弹出窗口。

PoC for Exercise 10 of https://domgo.at

3、在代码执行详情窗口中,我们看到来自location.href属性的数据在ID-之后被拆分,剩下的字符串被处理为双引号并附加到了window.name的值里面。

4、我们可以查看源进行检查条件分支。在这个例子中不是很明显,因为我们在URL中的用户参数已经以ID-开头,但情况可能并非总是如此。单击目标符号会显示JS的源代码,如果用户参数以ID-开头,很明显会到达接收器。

5、根据我们现在的情况,我们的漏洞利用只需通过导航到https://domgo.at/cxss/example/10?lang=en&user=ID-javascript&returnurl=/,在同一个窗口中生成 HTML代码,然后单击welcome href锚标签即可成功利用漏洞。

结论

Sboxr是一个非常强大的工具,可以与其他Web应用程序攻击工具(如Burp和ZAP)结合使用,尤其是在使用富JavaScript的应用程序时。源和接收器之间的数据流以及准确显示数据传输和修改方式的能力使得此工具在你的工具库中非常有用。

使用该工具,我们完成了10个练习的解决方案。对于尝试学习客户端XSS的挖掘和利用的人,建议使用本文所描述的这些东西。

参考文献:

1、Sboxr — https://sboxr.com

2、客户端XSS漏洞  -  https://www.owasp.org/index.php/Types_of_Cross-Site_Scripting#DOM_Based_XSS_.28AKA_Type-0.29

3、命令行开关 - https://dev.chromium.org/developers/how-tos/run-chromium-with-flags

4、XMLHttpRequest(XHR)MDN  - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

5、window.postMessage()MDN  -  https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

6、https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API

7、https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API

8、https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API

9、HTML 实体字符- https://dev.w3.org/html5/html-author/charref

windows系统和linux系统可以使用相同的js代码吗_使用Sboxr自动发现和利用DOM(客户端)XSS漏洞...相关推荐

  1. windows系统和linux系统可以使用相同的js代码吗_「React 手册 」在 Windows 下使用 React , 你需要注意这些问题...

    大家好,本篇内容,我要和大家聊聊使用 Windows 开发 React ,你需要注意的一些问题.首先说明下,我不是使用 windows 进行开发,因为其配置开发环境来说不是特别方便,我更喜欢 苹果ma ...

  2. Android 系统(68)---使用Xshell在Windows系统和Linux系统之间进行文件传输

    使用Xshell在Windows系统和Linux系统之间进行文件传输 Windows系统在安装虚拟机centos系统之后,如何进行两者之间的文件传输和互操作,或者如何在Windows端使用Xshell ...

  3. android程序移动到Linux,Android应用开发之Android 系统 -- 使用Xshell在Windows系统和Linux系统之间进行文件传输...

    本文将带你了解Android应用开发之Android 系统 -- 使用Xshell在Windows系统和Linux系统之间进行文件传输,希望本文对大家学Android有所帮助. 使用Xshell在Wi ...

  4. linux执行class文件_「大数据干货」Windows系统和Linux系统中打jar包与导入语句剖析...

    Jar包是Java中的压缩包格式,同Zip格式一样,用来对.class文件统一管理,如下是在Windows系统和Linux系统中不同的打包和执行.class程序的过程. windows: Linux: ...

  5. U盘/光盘制作windows系统和linux系统

    U盘/光盘制作windows系统和linux系统 一 所需材料 1. UltraISO破解版(后附下载地址) 2. 相应的系统映象文件ISO,不同版本不一样,有自己需求的可以选择不一样,一般Windo ...

  6. linux查看Windows的ip命令,在windows系统和linux系统中查询IP地址命令的不同

    在linux和windows系统上查询IP地址的命令是不一样的. 在linux中的命令行模式下,输入ifconfig即可查询到IP.而在windows系统下要查询IP地址需要先打开dos命令行,然后输 ...

  7. 一台windows机器和一台linux机器之间互相拷贝文件的方法,windows系统和Linux系统之间拷贝文件***--pscp...

    putty secure copy == pscp,是putty提供的文件传输***,通过ssh两件,在两台机器之间安全传输文件 获取pscp工具:http://www.chiark.greenend ...

  8. node.js命令行程序在Windows系统和Linux系统下的部署

    在Windows系统下全局部署node.js写的命令行程序 我们有一个简单的命令行程序,使用node.js的commander模块写的,只有一个文件hello.js,其内容如下: #!/usr/bin ...

  9. Nginx在Windows系统和Linux系统下的重启

    一.Windows系统下重启nginx 1.杀掉nginx进程 tskill nginx echo 已终止所有ginx进程 2.启动nginx cd f:\nginx-1.0.5  nginx.exe ...

最新文章

  1. modelsim读取文件中的数据_modelsim中的文件操作—— 大数据测试
  2. char N2Char(int n)函数:将一个整数转换为字符串,并放入一个字符串中
  3. JAVA模拟肯德基点餐系统源码,肯德基辞职员工透露,用这几句暗语点餐,你拿的分量会比别人多...
  4. JAX-RS 2.0:服务器端处理管道
  5. 如何用EasyRecovery找回已经删除的图片?
  6. 乱谈B2C系统-算是今年的总结吧
  7. java轩辕剑天之痕游戏攻略_轩辕剑3外传天之痕攻略 全流程文字攻略(3)
  8. 自制三层架构代码生成器软件
  9. Python的request库爬取豆瓣电影排行
  10. 【预测模型-ELM分类】基于鲸鱼算法优化核极限学习机实现数据分类附matlab代码
  11. java nio 框架_几种Java NIO框架的比较(zz)
  12. sql server 公共表表达式【CTE 】、临时表、变量表
  13. C语言中的指针应用,函数指针,指针函数,结构体中定义函数指针。
  14. 【YOLOv5-6.x】模型参数量param及计算量FLOPs解析
  15. 数据库索引分裂 问题分析
  16. 在线社交网络影响力分析——总结
  17. 第五章:Sharding-JDBC 自定义分片算法
  18. spf打包解包_2020最新CentOS(linux下)安装7-Zip(7za压缩软件)以及解压命令,只打包不压缩,加密的方法...
  19. SoftLayer Object Storage 节点
  20. 为什么现在还有985高校给大一上C语言课?

热门文章

  1. STL中的find_if函数
  2. 漫游Kafka设计篇之数据持久化
  3. 给Source Insight做个外挂系列之六--“TabSiPlus”的其它问题
  4. Redis源码:朴实无华且枯燥
  5. 程序员十大心愿,程序员:你这么了解我的心声的嘛!
  6. Xilinx:让FFmpeg在FPGA上玩的爽
  7. 音视频技术开发周刊 67期
  8. 大规模 Node.js 网关架构设计与工程实践
  9. 如何用keras实现deepFM
  10. PMP之项目整合管理之变更管理计划