布尔表达式的语法及语义分析程序_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,一经查实,立即删除!

相关文章

【黑金原创教程】【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作为内部的日志框架,其仅仅是一个日志接口,在实际应用中需要为该接口来指…

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

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

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

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

Apache Lucene的结构

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

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

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

构造函数必须没有代码

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

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

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

http 路径 |_HTTP 请求與响应的格式及 curl 命令使用

介绍 HTTP,主要内容有HTTP 请求包括哪些部分,如何用Chrome开发者工具查看 HTTP 请求内容HTTP 响应包括哪些部分,如何用Chrome开发者工具查看 HTTP 响应内容如何使用 curl 命令HTTP 请求的格式1 动词 路径 协议/版本 2 Key1: value1 2 Key2: v…

华为y7可以人脸识别吗_华为手机经常弹出“系统更新”提示,可以不更新吗?看完涨知识了...

众所周知,无论是手机,还是电脑,我们所使用的系统到了一定的时间,都会进行“系统更新”,尤其是我们使用的苹果手机、华为手机等,就经常会跳出提示,提醒用户“更新系统”,尤其是当我们…

Apache骆驼丝攻示例

如果您想监视,调试,排除流经路由的消息,而又不必从通道中永久消耗消息,那么就需要使用电线 。 有线分流器充当接收者列表,该列表消耗输入通道之外的消息并将其发布到两个输出通道。 第一个是作为主要信道的实际目的地…

参考文献中会议名称怎么缩写_期刊缩写查询总结

介绍英文论文写作中,经常会插入参考文献。那么参考文献中的期刊名称,时常需要使用缩写。但是有时候,查了半天,怎么也查不着,让人抓狂。今天小编总结了几个查询期刊缩写的网址,方便大家进行期刊缩写的查询。…

7. SVM松弛变量

我们之前讨论的情况都是建立在样例线性可分的假设上,当样例线性不可分时,我们可以尝试使用核函数来将特征映射到高维,这样很可能就可分了。然而,映射后我们也不能100%保证可分。那怎么办呢,我们需要将模型进行调整&…

mysql 8.0认证失败_解决mysql8.0因密码认证插件导致的链接不上

简介今天在迁移zabbix的数据库,每次链接到自己的mysql都报错,mysqlAuthentication plugin caching_sha2_password cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_passwordzabbix总是提示**** MySQL server is not available. Waiting 5 secon…

ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调

近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0,现把学习结果分享一下,希望对新手有帮助。 目录 ActionScript 3.0简介 Hello World 文件读写 数据存储(SharedObject) 与JS互调 ActionScript 3.0简…

Quasar和Akka –比较

actor模型是用于容错和高度可扩展系统的设计模式。 角色是独立的工作程序模块,仅通过消息传递与其他角色进行通信,可以与其他角色隔离而失败,但是可以监视其他角色的故障并在发生这种情况时采取一些恢复措施。 参与者是简单,孤立但…

dlgdata.cpp错误提示 解决方案

1、在测试编写继承CStatic类组件时候,发现在调用调试过程中弹出一个错误,点忽略还可以继续运行。如下图: 2、dlgdata.cpp此文件是VS安装目录\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc中的文件,而出现此错误一般是所…

mysql主从复制时间配置_MySQL主从复制配置

环境CentOS 7.5Docker 1.13.1MySQL 8.0.16基于以上环境启动三个mysql容器,一个为master,二个为slavemaster和slave使用的mysql版本是完全一致的,未测试不同版本的mysql配置master编辑配置文件编辑master的配置文件my.cnf$ vim /usr/mysql/con…

C语言操作符优先级

转自:http://www.cnblogs.com/xiehy/archive/2010/02/04/1663825.html 优先级 运算符 含 义 要求运算 对象的个数 结合方向 1 () [] -> . 圆括号 下标运算符 指向结构体成员运算符 结构体成员运算符 自左至右 2 ! 逻辑非运算符 1 (单目运算符)…

Win7下硬盘安装Redhat双系统

Win7下硬盘安装Redhat Linux 形成双系统过程详解 需要软件 EasyBCD2.0 和 linux ISO 系统镜像 RedHat linux下载地址:http://www.linuxidc.com/Linux/2013-01/78017.htm 安装前准备工作: 1 一个 Windows 盘 D E F 任选其一都可以,将其格式化为FAT32 格式…