布尔表达式的语法及语义分析程序_XSS语义分析的阶段性总结(一)

a7bef43a4f3d875d75612ec69028bb0d.png

作者:Kale 合天智汇

前言

由于X3Scan的研发已经有些进展了,所以对这一阶段的工作做一下总结!对于X3Scan的定位,我更加倾向于主动+被动的结合。主动的方面主要体现在可以主动抓取页面链接并发起请求,并且后期可能参考XSStrike加入主动fuzz的功能,这个目前还未加入,正在纠结中。。。而被动的方面,主要的工作就是xss语义分析的研究,通过xss语义分析而不是盲目的使用payload进行fuzz。

语义分析

业内提的比较早的是长亭的一款waf产品,语义分析说白了就是根据上下文来进行分析,而不是通过正则搜索的方式来匹配污染源,也就是我们的漏洞触发点。

由于这个需求,我们需要开发一款可以理解上下文的工具。来帮助我们识别我们的payload是输出在什么样的语义环境,从而给出精确的payload,而这一点xray目前做的效果挺不错的。

AST语法树

在此之前我们先简单了解一下JS抽象语法树。

Javascript 代码的解析(Parse )步骤分为两个阶段:词法分析(Lexical Analysis)和 语法分析(Syntactic Analysis)。这个步骤接收代码并输出抽象语法树,亦称 AST

在分析 Javascript 的 AST 过程中,借助于工具 AST Explorer 能帮助我们对 AST 节点有一个更好的感性认识。

下面是AST Explorer对 Javascript代码的解析,经过AST Explorer的解析Javascript代码会被抽象成AST的形式。

3d33d0cb6809e0fd2a1055209ddd8a6c.png

下面简单介绍几个节点类型,更多的参考官方文档定义https://esprima.readthedocs.io/en/3.1/syntax-tree-format.html

使用下面的demo为例

var param = location.hash.split("#")[1];
document.write("Hello " + param + "!");

VariableDeclaration

变量声明,kind 属性表示是什么类型的声明,因为 ES6 引入了 const/letdeclarations 表示声明的多个描述,因为我们可以这样:let a = 1, b = 2;

6e6de5cef506a6ec8c313b2b65ff6f07.png

VariableDeclarator

变量声明的描述,id 表示变量名称节点,init 表示初始值的表达式,可以为 null

57fb0426b245bb5e3c647dfb51474e51.png

Identifier

标识符,就是我们写 JS 时自定义的名称,如变量名,函数名,属性名,都归为标识符

5b58004ac8ccf4b79b2c6b961b8ffec3.png

一个标识符可能是一个表达式,或者是解构的模式(ES6 中的解构语法)。

Literal

字面量,就代表了一个值的字面量,如 “hello”, 1 这些,还有正则表达式(有一个扩展的 Node 来表示正则表达式),如 /d?/

f489b372a24a08f36de35052f9760782.png

cf55aa4c1d546edf6aecebbe8fc8673c.png

value 这里即对应了字面量的值,我们可以看出字面量值的类型,字符串,布尔,数值,null 和正则。

BinaryExpression

由于这里存在两个个二元运算,所以简单再介绍其中一个,其它的便不多简绍。

二元运算表达式节点,leftright 表示运算符左右的两个表达式,operator 表示一个二元运算符。

09ef751a4f643e13d09a8be4b21bfd95.png

这里进行运算的一个是Literal类型也就是hello,一个是Identifier类型也就是param变量,运算符为+

AST的介绍先到这里。下面介绍一下检测的原理

检测原理

xss漏洞一般有两种检测方法,第一种是简单粗暴的使用收集来的payload进行fuzz,通过页面是否回显来判断是否存在漏洞,这种手段目前已经不适用了。另一种就是通过对返回页面进行解析,结合语义分析,根据输出在不同的上下文来选择发送我们的payload,这样的话,我们的payload即精巧又准确。

还是使用这个demo

var param = location.hash.split("#")[1];
document.write("Hello " + param + "!");

检测思路一般为,我们首先找到document.write这个函数,从而定位到param,由param我们可以进行回溯到location.hash.split("#")[1],从而证明触发点是可控的。在污点分析模型里面,我们称document.write为sink,也就是污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性),称location.hash.split("#")[1]source,也就是污点源,代表直接引入不受信任的数据或者机密数据到系统中。很多代码审计工具也是基于了这样的模型。

基于上面的分析,我们需要开发一个可以理解js上下文的工具,帮助我们找到sinksource,让我们可以由sink回溯source,或者由反过来亦可,正则上实现这个问题已经基本不可能了,我们需要能够给上下文赋予准确意义。

而上面的AST语法树可以满足我们的需求,因为它可以帮助我们分析xss的输出点的上下文

幸运的是python里面有将js代码解析为语法树的库pyjsparser,还有在其基础上实现的js2py

from pyjsparser import parse
import json
js = '''var param = location.hash.split("#")[1];
document.write("Hello " + param + "!");'''
ast = parse(js)
print(json.dumps((ast)))

解析出来的效果跟AST Explorer是一致的

cc9c73e3402bfcc1f788969d846e8dda.png

接下来我们需要设计一个递归来找到每个表达式,每一个IdentifierLiteral类型等等。

部分代码如下:

8b4f3f57013ea3ea34d69fc900553af3.png

然后再遍历body的节点,找寻输出位置

1b5c07f196c7980aa45454cffeff032b.png

仍是上面的demo,我们尝试找到Hello

86bfc19625a81b5305061cb9e6138f69.png

54341ff4d2ada8c338d492219b4c60db.png

输出结果如下:

4da7280aa22590403b3013fa72e7642a.png

我们找到了Hello,并且输出位置的上下文为Literal

有了上面的研究,通过sink回溯source的方法便可以实现,对于dom型xss的分析,也会更加精确,对于反射型xss输出在js的情况,同样适用

如果回显在JS脚本中,发送测试payload后,通过js语法树解析确定IdentifierLiteral这两个类型中是否包含,如果payload是Identifier类型,就可以直接判断存在xss,如果payload是Literal类型,再通过单双引号来测试是否可以闭合。

最后

关于js语义分析暂时先分析到这里,难点还是dom型xss的检测,因为dom xss检测识别有点复杂,下一篇会探讨一下sink输出在html的情况,探讨一下html解析的一些问题。

复制链接做实验:XSS进阶一

http://hetianlab.com/expc.do?ce=2626aa4d-704e-4190-a80e-c14d1d47e88c

(恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而形成XSS攻击)

声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机上的usb设备是什么东西,联接一个USB的线在电脑桌上方便插U盘的东西叫什么?...

HUB,即俗称的集线器。它是一个多端口的转发器,当以HUB为中心设备时,网络中某条线路产生了故障,并不影响其它线路的工作。所以HUB在局域网中得到了广泛的应用。大多数的时候它用在星型与树型网络拓扑结构中,以RJ45接口与…

【黑金原创教程】【TimeQuest】【第二章】TimeQuest模型角色,网表概念,时序报告...

声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/alinx/p/3362790.html 《FPGA那些事儿--Tim…

设置springboot日志级别_Spring Boot 日志框架实践

概述Java应用中,日志一般分为以下5个级别:ERROR 错误信息WARN 警告信息INFO 一般信息DEBUG 调试信息TRACE 跟踪信息Spring Boot使用Apache的Commons Logging作为内部的日志框架,其仅仅是一个日志接口,在实际应用中需要为该接口来指…

简单的类来测量延迟

这是我编写的用于测量延迟的非常简单的类。 HDRHistogram并不是劳斯莱斯解决方案,但是如果您只想向项目添加一个类,则可以很好地解决问题。 这是一个简单的测试程序,向您展示其用法: package util;public class LatencyMeasureE…

计算机加分乘法套用,8+8+8+8+8写成乘法算式要怎样写?小学数学为何这么死板?...

88888写成乘法算式只能写8x5不能写5x8吗?小学数学为何这么死板?这个题目来自于某小学的期考试卷,是个填空题,88888写成乘法算式时给了两个空( )和( ),就有人提出来只能写8x5不能写5x8,所以应该只给一个空。…

债券价格和通胀率

一般规律,通胀率于债券收益率正相关。 当通胀率较高时,市场会降低对债券的需求(固定息票) 》 导致债券价格下跌,收益率上升。转载于:https://www.cnblogs.com/xispace/p/3383357.html

净值:测试编码器/解码器

我最近与Netty进行了一些合作,并且按照此出色的教程中的说明构建了编码器/解码器管道,以测试编码器和解码器是否在正常工作而不必发送真实的消息。 幸运的是,有一个EmbeddedChannel确实使我们的生活变得非常轻松。 假设我们有一条消息“ Fo…

投影元素直接隔离_摸着夜色上露台开投影,是巴塞罗那设计师的浪漫

总有人说,世界为你关上一扇门,定会为你留有一扇窗。在家闷上个把月,窗户直接担起了连接人们与外界的通道。既然观众出不了门,那不如让加油打气的海报们,自己爬上墙好了——人们打开窗子就能撞上。平面设计师Ral Goi一直…

天涯明月刀7月4号服务器维护,7月8日服务器例行维护公告

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼亲爱的玩家:青龙乱舞区、大地飞鹰区、沧海云帆区、把酒邀月区、边城浪子区全部服务器将在7月8日6:00~10:00停机维护更新,,维护完成后上述各服务器客户端版本更新至2.1.20.23,给您带来…

关于ecshop中jquery与js冲突解决的方案

ECShop把AJAX事件和JSON解析的模块放在common/transport.js之中,可以说它也有自己封装的一套工具,这其实是很正常的。但恰恰的,在封装JSON各种方法的同时对object的模型进行了重写,这个就跟jQuery冲突了。因为众所周知的&#xff…

Apache Lucene的结构

不可估量的高贵的Apache软件基金会(Apache Software Foundation)产生了许多重要产品(Ant,CouchDB,Hadoop,JMeter,Maven,OpenOffice,Subversion等)&#xff0c…

comcerter无法识别串口_基于FPGA 的MXN维字符识别的实现

基于FPGA 的MXN维字符识别的实现1 概述本文的灵感来源于杨淑英老师的一张PPT(手写数字识别),在此特别鸣谢杨淑英老师。一般机器视觉对事物是没有感知的,比如摄像头采集到一张苹果的图片,它本身是不知道那是什么东西&am…

嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中

我真的很想有一个快速便捷的方法来遍历JSON中的多个记录,每个记录都有潜在的深层嵌套。我只想输出到表。我不确定$ .each()或$ .ajax()成功的javascript方法需要通过function()传递哪些参数。所有示例似乎都使用通用词“data”或“ obj”,但它们使我感到…

难题:嵌套computeIfAbsent

总览 Java 8库在地图上有一个新方法,computeIfAbsent。 这是一种非常有用的将地图变成与键关联的对象的缓存的方法。 但是,您可能没有考虑过一种组合。 如果您在内部调用computeIfAbsent会发生什么。 map.computeIfAbsent(Key.Hello, s -> {map.com…

python扩展文件_1. 使用 C 或 C++ 扩展 Python

1.12.给扩展模块提供C API很多扩展模块提供了新的函数和类型供Python使用,但有时扩展模块里的代码也可以被其他扩展模块使用。例如,一个扩展模块可以实现一个类型 "collection" 看起来是没有顺序的。就像是Python列表类型,拥有C AP…

swal ajax,Sweetalert详细介绍

好长时间没有更新文章了,年底工作比较忙,确实是没有时间来写文章。今天忙里偷闲,总结了一款前端提示框的插件——sweetalert——推荐给大家。Sweetalert安装Sweetalert官方为我们提供了三种安装方式:方法一 通过bower安装$ bower …

构造函数必须没有代码

构造函数中应完成多少工作? 在构造函数内部进行一些计算然后封装结果似乎是合理的。 这样,当对象方法需要结果时,我们将准备好它们。 听起来是个好方法? 不,这不对。 这是一个坏主意,原因有一个&#xff1a…

一个路由器两个网段互通_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...

前几天咱们了解:三种方法告诉你项目超过255个摄像机怎么设置IP?什么是公网ip?什么又是内网ip?为什么ip地址通常以192.168开头?也学习了:二、三层交换机与路由器的区别!但是有好多人对IP这个概念还是不太清…

服务器appcrash的问题怎么修复,win7的ie出现APPCRASH问题怎么处理?

问题事件名称: APPCRASH 怎么解决?这是Win7或者是Vista特有的一个棘手的问题.APPCRASH(app是程序的意思,crash是坠机的意思。就是程序崩溃了/程序撞车……)(APPCRASH是Win7和Vista中特有的故障,就是程序崩溃引起APPCRASH错误的问题很多 如dll加载错误 软…

Jira 随便总结

一、JIRA与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 JIRA创建的问题类型包括New Feature、Bug、Task和Improvement四种,还可以自己定义,所以它也一是过程管理系统。 JIR…