Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Chorme headless的xss检测实践

基于Chorme headless的xss检测实践

作者头像
xfkxfk
发布于 2018-07-24 07:48:54
发布于 2018-07-24 07:48:54
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

本文内容比较多,建议点击

https://blog.formsec.cn/2018/07/12/%E5%9F%BA%E4%BA%8EChrome-headless%E7%9A%84XSS%E6%A3%80%E6%B5%8B/

进行浏览。

01

起因

扫描器不能满足需求,phantomjs不支持html5标签。所以自己查阅资料和api,写了一个基于chrome headless xss扫描插件。

总体思路来自于:fridayy的基于phantomjs的xss扫描https://paper.seebug.org/93/

以及猪猪侠的web2.0启发式爬虫实战

判断xss的方法为:

1、 监听页面的弹窗事件

2、 查看dom中的localName是否有存在我们自定义的标签

3、 查看dom中的nodeValue 是否含有我们输入的payload

将其分为三个等级,分别为level 3 level 2 level 1 分别对应这xss的精确程度(由高到低)

02

了解chrome_headless

初步了解,可以看一下大佬的blog: https://thief.one/2018/03/06/1/ 你可以通过它来做很多事情,但是这里不讨论其他功能,只着眼于xss的判断。

总体来说,headless chrome意思是无头chrome浏览器,相对于传统的chrome浏览器,这是一个可以在后台用命令行操作浏览器的工具,对于爬虫编写以及web自动化测试都有很大的作用。相比较同类工具Phantomjs,其更加强大(主要因为其依赖的webkit更新)。

我认为核心的理解在于:

1、 就是具有基于Chrome DevTools Protocol 的chrome远程调试功能的无界面浏览器。

2、 现在的python和nodejs对chrome headless进行操作的封包都是基于Chrome DevTools Protocol来实现的。

学习了一下:https://github.com/wilson9x1/ChromeHeadlessInterface 的项目后,决定自己使用webscoket和chrome进行通信。 原因有以下几点:

1、有现成的部分代码,但是不支持post,也不能监听dom的更改。所以需要自己读api去实现我们的功能。

2、比较直观,可以通过本地远程调试端口看页面的变化。

与chrome通信的基本知识: 简单说一下这套协议吧,这套协议通过 websocket 进行通信,发送和返回的内容都是 json 格式。发送的格式大概是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1{
2"id": id,
3"method": command,
4"params": params,
5}

换成一个实际的例子可能是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1{"id": 1,
 2"method: "Page.enable",
 3"params": {}
 4}
 5
 6{
 7"id": 2,
 8"method": "Page.navigate",
 9"params": {"url": "https://www.github.com"}
10}

几个关键的url:

http://localhost:9222/json

http://localhost:9222/json/new

http://localhost:9222/json/close/tab_id

其中第一个 URL 是获取当前所有打开的 TAB 页,第二个是新建一个 TAB 页,第三个是根据 TAB 页的 id 关闭这个 TAB 页。
当我们请求第一个 URL 时,返回的内容大概如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1[
 2{
 3"description": "",
 4"id": "c33a4799-13e0-4b6a-b636-fd717c32c941",
 5"title": "a.html",
 6"type": "page",
 7"url": "http://x.x.x.x/a.html"
 8},
 9{
10"description": "",
11"devtoolsFrontendUrl": "/devtools/inspector.html?ws=localhost:9222/devtools/page/1adf9b16-5cca-483e-874a-2a53f4b131ca",
12"id": "1adf9b16-5cca-483e-874a-2a53f4b131ca",
13"title": "about:blank",
14"type": "page",
15"url": "about:blank",
16"webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/1adf9b16-5cca-483e-874a-2a53f4b131ca"
17}
18]

这里面可以拿到每个 TAB 页的详细信息。

第二个新建 TAB 页访问之后,也会返回新 TAB 页的信息。其中就有一个很重要的字段:webSocketDebuggerUrl,这个就是我们要拿的 websocket 的地址。

Page.navigate命令

其socket返回包为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1{"id":2,"result":{"frameId":"33320.1"}}{"method":"Page.frameNavigated","params":{"frame":
 2{"id":"33320.1","loaderId":"33320.2","url":"http://x.x.x.x/a.html","securityOrigin":"http://x.x.x.x","mimeType":"text/html"}}}
 3{"method":"Page.javascriptDialogOpening","params":
 4{"message":"9527","type":"alert"}}
 5{"method":"Page.javascriptDialogClosed","params":
 6{"result":true}}
 7{"method":"Page.loadEventFired","params":{"timestamp":131319.852874}}
 8{"method":"Page.frameStoppedLoading","params":
 9{"frameId":"33320.1"}}
10{"method":"Page.domContentEventFired","params":{"timestamp":131319.853225}

从内容可以看出来是页面渲染时浏览器通知客户端浏览器发生的事件。

03

漏洞判别标准及实现

1、 监听页面的弹窗事件: 通过循环监听Page.javascriptDialogOpening的结果,判断页面是否存在弹窗事件。 其socket回包是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1{"method":"Page.javascriptDialogOpening","params":
2{"url":"http://xss.php","message":"1","type":"alert","hasBrowserHandler":false,"defaultPrompt":""}
3}

2、 查看dom中的localName是否有存在我们自定义的标签 通过循环监听DOM.getDocument的return来判断我们自定义的标签是否被解析。其数据包如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1{"id":2324,"result":{"root":{"nodeId":30453,"backendNodeId":6,"nodeType":9,"nodeName":"#document","localName":"","nodeValue":"","childNodeCount":1,"children":[{"nodeId":30454,"parentId":30453,"backendNodeId":7,"nodeType":1,"nodeName":"HTML","localName":"html","nodeValue":"","childNodeCount":2,"children":[{"nodeId":30455,"parentId":30454,"backendNodeId":8,"nodeType":1,"nodeName":"HEAD","localName":"head","nodeValue":"","childNodeCount":0,"children":[],"attributes":[]},{"nodeId":30456,"parentId":30454,"backendNodeId":9,"nodeType":1,"nodeName":"BODY","localName":"body","nodeValue":"","childNodeCount":4,"children":[{"nodeId":30457,"parentId":30456,"backendNodeId":10,"nodeType":1,"nodeName":"TABLE","localName":"table","nodeValue":"","childNodeCount":1,"children":[{"nodeId":30458,"parentId":30457,"backendNodeId":11,"nodeType":1,"nodeName":"TBODY","localName":"tbody","nodeValue":"","childNodeCount":2,"children":[{"nodeId":30459,"parentId":30458,"backendNodeId":12,"nodeType":1,"nodeName":"TR","localName":"tr","nodeValue":"","childNodeCount":2,"children":[{"nodeId":30460,"parentId":30459,"backendNodeId":13,"nodeType":1,"nodeName":"TD","localName":"td","nodeValue":"","childNodeCount":1,"children":[{"nodeId":30461,"parentId":30460,"backendNodeId":14,"nodeType":3,"nodeName":"#text","localName":"","nodeValue":"id"}],"attributes":[]},{"nodeId":30462,"parentId":30459,"backendNodeId":15,"nodeType":1,"nodeName":"TD","localName":"td","nodeValue":"","childNodeCount":1,"children":[{"nodeId":30463,"parentId":30462,"backendNodeId":16,"nodeType":3,"nodeName":"#text","localName":"","nodeValue":"username"}],"attributes":[]}],"attributes":[]},{"nodeId":30464,"parentId":30458,"backendNodeId":17,"nodeType":1,"nodeName":"TR","localName":"tr","nodeValue":"","childNodeCount":2,"children":[{"nodeId":30465,"parentId":30464,"backendNodeId":18,"nodeType":1,"nodeName":"TD","localName":"td","nodeValue":"","childNodeCount":0,"children":[],"attributes":[]},{"nodeId":30466,"parentId":30464,"backendNodeId":19,"nodeType":1,"nodeName":"TD","localName":"td","nodeValue":"","childNodeCount":1,"children":[{"nodeId":30467,"parentId":30466,"backendNodeId":20,"nodeType":3,"nodeName":"#text","lo

3、 通过解析DOM.getDocument的return里的 nodeValue来判断payload是否存在于最后渲染的页面里。

一些细节:

1、 如何触发事件的弹窗,通过遍历dom树触发事件来触发onerror=alert之类的弹窗

2、 如何支持post请求:

chrome远程调试的配置:

1chrome-canary --remote-debugging-port=9222 --headless -remote-debugging-address=0.0.0.0 --disable-xss-auditor --no-sandbox --disable-web-security

这里关闭了xss-auditor 和安全相关的一些参数。所以事实上如果不对参数进行处理部署在内网可能会导致ssrf的情况。

三种不同的判断逻辑的结果: scan_result结果:

1# level 3 代表触发了Page.javascriptDialogOpening事件 2{'url': u'http://xss.php', 'vul': 'xss', 'post': '', 'method': u'GET', 'level': '3'} 3# level 2 代表dom树的节点包含了我们自定义的<webscan></webscan>标签 4{'url': u'http://xss.php', 'vul': 'xss', 'post': '', 'method': u'GET', 'level': '2'} 5# level 1 代表渲染后的nodeValue包含我们的payload 6{'url': u'http://xss.php', 'vul': 'xss', 'post': u'id1=1&id2=2test_test', 'method': u'POST', 'level': '1'}

04

源码及使用方法

Mac os 安装 chrome-canary:

1brew install Caskroom/versions/google-chrome-canary

启动chrome远程调试:

1chrome-canary --remote-debugging-port=9222 --headless -remote-debugging-address=0.0.0.0 --disable-xss-auditor --no-sandbox --disable-web-security

centos7: 安装chrome

1$ vi /etc/yum.repos.d/google-chrome.repo

写入如下内容:

1[google-chrome] 2name=google-chrome 3baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch 4enabled=1 5gpgcheck=1 6gpgkey=https://dl.google.com/linux/linux_signing_key.pub

然后

1$ sudo yum install google-chrome-stable

后台启动chrome-stable

1nohup google-chrome-stable --disable-gpu --remote-debugging-port=9222 --headless -remote-debugging-address=0.0.0.0 --disable-xss-auditor --no-sandbox --disable-web-security > chromeheadless.out 2>&1 &

chrome_headless_xss

1# tmp_url为添加payload的url,如果是post请求则为原始url 2chrome_headless_drive = ChromeHeadLess(url=tmp_url, 3ip="127.0.0.1", 4port="9222", 5cookie="", 6post="", 7auth="", 8payloads= payload) 9scan_result = chrome_headless_drive.run()

scan_result结果:

1# level 3 代表触发了Page.javascriptDialogOpening事件 2{'url': u'http://xss.php', 'vul': 'xss', 'post': '', 'method': u'GET', 'level': '3'} 3# level 2 代表dom树的节点包含了我们自定义的<webscan></webscan>标签 4{'url': u'http://xss.php', 'vul': 'xss', 'post': '', 'method': u'GET', 'level': '2'} 5# level 1 代表渲染后的nodeValue包含我们的payload 6{'url': u'http://xss.php', 'vul': 'xss', 'post': u'id1=1&id2=2test_test', 'method': u'POST', 'level': '1'}

源码链接:

https://github.com/neverlovelynn/chrome_headless_xss/

05

总结及思考

1、 其实使用websocket和chrome进行通信整个过程是异步的,使用异步的方法可以解决粗暴的通过超时来控制循环监听的问题,同时也能提高扫描效率。

2、 在关闭了同源策略的情况下,可能会导致内网ssrf,所以要对传入参数进行处理。可以尝试用其他方法实现post请求,如在Network.requestWillBeSent时修改请求参数。

3、 由于企业内部对qps有限制,我们扫描的payload数量会被限制的很少。不能进行fuzz,如果需要fuzz模块可以参考 https://github.com/bsmali4/xssfork 的fuzz模块进行payload的fuzz。另外我有一个想法就是既然能得到最后的dom,是否能通过对指纹上下文进行分析自动生成精准的payload。但是想了很久也没想到优雅的实现方式。

CTF成员招募

FormSec团队近期正在筹建一支CTF战队,目标就是成为国内顶尖的CTF战队,参与国内外CTF赛事。团队将尽可能为CTF战队成员提供一切帮助,助力战队成员成长和发展,加入后战队成员将享有团队所有福利。目前,战队已经有数位web二进制等大牛,期待有更多的大佬加入!

如有兴趣请联系admin#formsec.cn,或在FormSec公众号进行留言!

往期精彩回顾

wordpress任意文件删除漏洞分析

铁人三项2018 pwn [aleph1] Writeup

铁人三项2018 pwn [heapmain] Writeup

ISCC 2018 Writeup

American Fuzz Lop (AFL) Fuzz 初探

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逢魔安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
玩转 Chrome DevTools,定制自己的调试工具
Chrome DevTools 是我们每天都用的工具,它可以查看元素、网络请求、断点调试 JS、分析性能问题等,是辅助开发的利器。
神说要有光zxg
2022/11/11
4.1K1
玩转 Chrome DevTools,定制自己的调试工具
HTML DOM(二):节点的增删改查
       上一篇:HTML DOM(一)        上一篇讲述了DOM的基本知识,从其得知,在DOM眼中,HTML的每个成分都可以看作是节点(文档节点、元素节点、文本节点、属性节点、注释节点,
高爽
2017/12/28
1.7K0
Selenium及Headless Ch
一般的的静态HTML页面可以使用requests等库直接抓取,但还有一部分比较复杂的动态页面,这些页面的DOM是动态生成的,有些还需要用户与其点击互动,这些页面只能使用真实的浏览器引擎动态解析,Selenium和Chrome Headless可以很好的达到这种目的。
py3study
2020/01/19
1.1K0
Web自动化之Headless Chrome编码实战
API 概览 && 编码Tips 文档地址 github Chrome DevTools Protocol 协议本身的仓库 有问题可以在这里提issue github debugger-protoc
IMWeb前端团队
2017/12/29
1.2K0
利用XSStrike Fuzzing XSS漏洞
关于XSStrike这款工具虽有前人写过相关资料,但是已经历经一年之久了,这款工具已经发生重大的改变(如从仅支持python2.7 改变为python 3.6),因此还是有必要再次写一下的。
FB客服
2018/12/28
2.2K0
XSS初探
通过xss跨站脚本,来获得用户的Cookie和其他有用的信息,利用平台的特性,xss利用诸如:xss Shell ,BeEF,Anehta,CAL9000……
Mirror王宇阳
2020/11/13
5380
XSS初探
DevTools 实现原理与性能分析实战
从 2008 年 Google 释放出第一版的 Chrome 后,整个 Web 开发领域仿佛被注入了一股新鲜血液,渐渐打破了 IE 一家独大的时代。Chrome 和 Firefox 是 W3C Web 标准的坚定支持者,随着这两款开源浏览器市场份额逐渐加大,迎来了开发者的春天。这就迎来了一个新的职业分工——前端工程师 frontend-engineer,前端工程师促进了 Web 应用的繁荣,功能强大的调试工具必不可少。Google 基于开源的基础上顺势推出了 DevTools,广受网页开发者的好评,随即也推动了 Chrome 的在商业的成功。
2020labs小助手
2021/12/27
1.3K0
DevTools 实现原理与性能分析实战
XSS基础学习
XSS攻击是指在网页中嵌入一段恶意的客户端Js脚本代码片段,JS脚本恶意代码可以获取用户的Cookie、URL跳转、内容篡改、会话劫持……等。
Mirror王宇阳
2020/11/12
9030
phantomJs之殇,chrome-headless之生 | 洞见
技术雷达快讯:自2017年中以来,Chrome用户可以选择以headless模式运行浏览器。此功能非常适合运行前端浏览器测试,而无需在屏幕上显示操作过程。在此之前,这主要是PhantomJS的领地,但Headless Chrome正在迅速取代这个由JavaScript驱动的WebKit方法。Headless Chrome浏览器的测试运行速度要快得多,而且行为上更像一个真正的浏览器,虽然我们的团队发现它比PhantomJS使用更多的内存。有了这些优势,用于前端测试的Headless Chrome很可能成为事实
ThoughtWorks
2018/04/17
1.9K0
phantomJs之殇,chrome-headless之生 | 洞见
PHP代码审计笔记--XSS跨站脚本
这边代码逻辑中,问题根源在于最后一句的url解码输出,导致存在三重url编码绕过的情况。
Bypass
2019/07/08
9520
PHP代码审计笔记--XSS跨站脚本
DOM(文档对象模型):理解网页结构与内容操作的关键技术
DOM的编程接口由一组标准属性和方法定义。属性通常用于描述节点的特征,而方法通常用于执行与节点相关的操作。
小万哥
2024/03/29
1930
DOM(文档对象模型):理解网页结构与内容操作的关键技术
Web自动化之Headless Chrome开发工具库
本文作者:IMWeb 钌子_rawbin 原文出处:IMWeb社区 未经同意,禁止转载 命令行运行Headless Chrome Chrome 安装 下载地址 几个版本的比较 Chromiu
IMWeb前端团队
2018/01/08
9730
Pikachu漏洞靶场系列之XSS
跨站脚本攻击(Cross-Site Scripting)简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
FB客服
2020/02/20
2.8K0
Pikachu漏洞靶场系列之XSS
XssHtml – 基于白名单的富文本XSS过滤类
啦啦啦,去了北京参加荣耀6的发布会,真心不错呀这款手机,在这里无耻地推荐一下。与会的同学都获得了一枚荣耀6,说说我的感受吧:CPU真心给力,跑分很高;价格合理,2000是荣耀一贯的高性价比;特权给力,寝室的Chinanet可以免费用了;相机真不错,全景拍照,把整个鸟巢拍得一清二楚,抓拍也很给力,黑屏状态下按两次音量下就能在0.6秒完成一次拍摄;触屏很舒服,滑动没有一丝卡顿。
phith0n
2020/10/15
1.7K0
米斯特白帽培训讲义(v2)漏洞篇 XSS
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS 。恶意攻击者往 Web 页面里插入恶意 JavaScript 代码,当用户浏览器该页之时,嵌入 Web 页面里的代码会被执行,从而达到恶意攻击用户的目的。
ApacheCN_飞龙
2019/02/15
5990
米斯特白帽培训讲义(v2)漏洞篇 XSS
Headless Chrome简介
在 Chrome 59中开始搭载Headless Chrome。这是一种在无需显示headless的环境下运行 Chrome 浏览器的方式。从本质上来说,就是不用 chrome 浏览器来运行 Chrome 的功能!它将 Chromium 和 Blink 渲染引擎提供的所有现代 Web 平台的功能都带入了命令行。
随心助手
2020/08/04
1.7K0
一篇文章带你从XSS入门到进阶(附Fuzzing+BypassWAF+Payloads)
OWASP(开放式Web应用程序安全项目)的工具、文档、论坛和全球各地分会都是开放的,对所有致力于改进应用程序安全的人士开放,其最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结了Web应用程序最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。
陈殷
2020/03/06
4.9K0
浏览器安全一 / Chrome XSS Auditor bypass
(2017-08-14 更新,chrome57更新了xss auditor的拦截方式,之前的大量payload不能用了)
phith0n
2020/10/15
6290
白帽赏金平台XSS漏洞模糊测试有效载荷最佳集合 2020版
该备忘清单可用于漏洞猎人,安全分析,渗透测试人员,根据应用的实际情况,测试不同的payload,并观察响应内容,查找web应用的跨站点脚本漏洞,共计100+条xss漏洞测试小技巧。
瓦都剋
2020/12/17
9.9K0
针对一些简单场景的模糊测试
WFuzz 是开源的一款针对 web 应用模糊测试的开源软件,使用 Python 编写,测试的漏洞类型主要包括:未授权访问、注入漏洞(目录遍历、SQL 注入、XSS、XXE)、暴力破解登录口令 等。项目地址:
信安之路
2021/07/06
9440
相关推荐
玩转 Chrome DevTools,定制自己的调试工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验