绝杀 GETPOST 嵌套的 JSON 参数

news2024/9/20 0:56:29

JSON(JavaScript Object
Notation)是一种轻量级的数据交换格式,常用于Web应用程序中的数据传输。在HTTP数据包信息传递时,JSON扮演着非常正常的角色,因为它是一种通用的数据格式,可以被多种编程语言和应用程序所支持。

当客户端向服务器发送HTTP请求时,请求头中可以指定请求体的数据格式为JSON。服务器在接收到请求后,可以解析JSON数据并进行相应的处理。同样地,当服务器向客户端返回HTTP响应时,响应头中可以指定响应体的数据格式为JSON。客户端可以解析JSON数据并进行相应的处理。

背景

我们平时遇到的 JSON 接口非常多,但是 JSON 中的各种字段测试以及不同深度的 JSON
测试其实非常难自动化测试。在安全服务测试和漏洞挖掘中,遇到这种情况,大多数可能只能手动测试,或者只测试少数几层。当然这个问题其实由来已久,在一些场景下这种情况大多数通过堆人力来解决,我们如何解决这个问题?或者我们有没有一些更优秀的解决方案?

我们以一个很经典的实际案例来说明这种情况,如果一个数据包长这个样子:GET / HTTP/1.1Host: www.example.comContent-Type: application/json; charset=UTF-8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36{“abc”: 123,“foo”: “bar”,“obj”: {“deep1”: 1,“deep2”: “deepStr”,“depth3”: {“ccc”: 1,“ddd”: 1}}}

那么我们如何对这个数据包进行测试呢?比如说我们的 payload 是{{payload}}那么,我们希望获得如下结果{“abc”: {{payload}},“foo”: “bar”,“obj”: {“deep1”: 1,“deep2”: “deepStr”,“depth3”: {“ccc”: 1,“ddd”: 1}}}

甚至{“abc”: 123,“foo”: “bar”,“obj”: {“deep1”: {{payload}},“deep2”: “deepStr”,“depth3”: {“ccc”: 1,“ddd”: 1}}}

基础方法

先说结论吧,我们在 Yaklang 的 fuzz 模块中实现了这样的变换,可以递归深度遍历 JSON 的
Key/Value,并且同时实现替换的功能。很简单地,我们可以编写一段 Yaklang 代码很简单地实现这个功能:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzJha1X9-1690876785375)(https://image.3001.net/images/20230616/1686898189_648c060dec98aafe4b582.png!small)]

熟悉 Yaklang Fuzz 模块的同学对上述的结果其实并不陌生,实际上这个问题已经得到了很好的解决。但是往往渗透测试中遇到的 JSON
可并不是这么简单。

难度升级:如果 JSON 内容是在 GET/POST 参数中呢?

如果本身参数是a=123&&b=123&&key=value1&&obj={"abc": 123, "keyInQuery": "ccc"}这种情况呢?我们再来看另一个数据包GET /file.php?a=123&&b=123&&key=value1&&obj=%7B%22abc%22%3A+123%2C+%22keyInQuery%22%3A+%22ccc%22%7D HTTP/1.1Host: www.example.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) … Chrome/83.0.4103.116那么这种情况,其实就非常令人恐惧了。我们这个数据包中,包含 4 个 GET
参数,虽然表面上包含四个参数,但是参数中有一个obj其实非常复杂,他是被编码的,并且还包含了abckeyInQuery这两个隐藏参数。

也就是说,上面这个数据包,实际包含了 6 个参数:1. GET 参数:a2. GET 参数:b3. GET 参数:key4. GET 参数:obj5. GET 参数嵌套 JSON 参数:obj.abc6. GET 参数嵌套 JSON 参数:obj.keyInQuery

一般来说,我们可能只能测试到a, b, key, obj这四个参数,并不能测试到obj.abcobj.keyInQuery参数。如果遇到这种情况,原有的方法可能就无法生效了,那么我们如何解决呢?

Show Me the CODE!freq = fuzz.HTTPRequest(GET /file.php?a=123&&b=123&&key=value1&&obj=%7B%22abc%22%3A+123%2C+%22keyInQuery%22%3A+%22ccc%22%7D HTTP/1.1Host: www.example.comContent-Type: application/json; charset=UTF-8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36)~for param in freq.GetGetQueryParams() {req = param.Fuzz(““).GetFirstFuzzHTTPRequest()println(codec.DecodeUrl(req.GetRequestURI()))}/*/file.php?a=123&b=123&key=value1&obj={“abc”:””,“keyInQuery”:“ccc”}/file.php?a=123&b=123&key=value1&obj={“abc”:123,“keyInQuery”:""}/file.php?a=123&b=123&key=value1&obj=/file.php?a=&b=123&key=value1&obj={“abc”: 123, “keyInQuery”: “ccc”}/file.php?a=123&b=&key=value1&obj={“abc”: 123, “keyInQuery”: “ccc”}/file.php?a=123&b=123&key=___________&obj={“abc”: 123, “keyInQuery”: “ccc”}*/

我们按上面描述的内容,如果可以进行 payload 替换的话,我们应该有 6
个参数需要替换,通过fuzz模块中HTTPRequest构造一个模糊测试模版,然后通过内置的获取GetQueryParams方法。使用获取到的参数调用
Fuzz 方法,在每次 Fuzzing 后,使用 GetFirstFuzzHTTPRequest 方法获取第一个 Fuzzing 后的 HTTP
请求,并使用 DecodeUrl 方法解码请求 URI。最终,使用 println 方法将解码后的请求 URI 打印出来。

最后我们获取到的结果非常明显:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLKlVdEb-1690876785376)(https://image.3001.net/images/20230616/1686898494_648c073ebd20b26ca7f75.png!small)]

这两个参数已经可以成功被我们手动覆盖了,因此我们可以尝试对这类的所有数据包进行很精密的测试了。

仿真测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0o8lSu3y-1690876785376)(https://image.3001.net/images/20230616/1686898522_648c075a503ac758af0ea.png!small)]

我们首先手造了一个/expr/injection的路由,其中有三个参数,我们把 b 参数中的内容作为 JSON 进行反序列化,并且把 JSON 后对象的
“a” 参数取出来。然后把 “a” 的内容作为一个沙箱表达式进行执行。

我们对刚刚编写的靶场进行简单的测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nksx5xRF-1690876785376)(https://image.3001.net/images/20230616/1686898545_648c07718dcd9b8728283.png!small)]

发现只要有 b-json 参数的内容中的 a 为数值表达式的时候,他的结果为运算结果。这种漏洞如何进行自动发现呢?

全自动化测试

我们编写一个表达式注入的通用测试脚本:freq = fuzz.HTTPRequest(GET /expr/injection?b={"a":1} HTTP/1.1Host: 127.0.0.1:8787)~for param in freq.GetGetQueryParams() {try {exprParams = fuzz.FuzzCalcExpr()result := param.Fuzz(exprParams.expr).ExecFirst()~if exprParams.result in string(result.ResponseRaw) {println(“----------------------------------”)println(“----------------------------------”)println(“--------------表达式执行------------”)println(“----------------------------------”)println(“----------------------------------”)}} catch err {dump(err)}}

我们在这个脚本中,需要测试表达式,通过fuzz.FuzzCalcExpr生成一个减法(加性)表达式,为了让表达式更加简单,我们认为他是一个“日期表达式”,类似2012-12-21这样的减法,这样他的计算结果为1979。如果表达式执行了,页面应该会有
1979 的字样。

我们执行上述内容:[INFO] 2023-05-15 14:25:56 [http_pool:612] start to send to http://127.0.0.1:8787/expr/injection?b=%7B%22a%22%3A%222011-03-9%22%7D(:0) (packet mode)----------------------------------------------------------------------------------表达式执行--------------------------------------------------------------------------------HTTP/1.1 200 OKDate: Mon, 15 May 2023 06:25:56 GMTContent-Type: text/plain; charset=utf-8Content-Length: 282-----------------ORIGIN PACKET---------------GET /expr/injection?b=%7B%22a%22%3A%222011-03-9%22%7D HTTP/1.1Host: 127.0.0.1:8787-----------------Handled---------------a[]: last Stack Value is nil/undefinedb[{“a”:“2011-03-9”}]: 1999c[]: last Stack Value is nil/undefined[INFO] 2023-05-15 14:25:56 [http_pool:612] start to send to http://127.0.0.1:8787/expr/injection?b=2018-05-9(:0) (packet mode)确实,我们发送的数据包参数部分为b=%7B%22a%22%3A%222011-03-9%22%7D解码后为b={"a":"2011-03-9"},并且数据包中也有
“1999” 作为测试结果,这很符合我们的测试要求。

我们的代码最精彩的部分在于,没有写明测试的路径,仅仅是写明了测试的原始数据包,当然这个原始数据包的来源可以是任何地方,比如 Yakit MITM 模块中。

当然选取了一个 JSON
中的表达式注入作为测试案例,这个案例其实是非常具有代表性的,他很难被正常的扫描器,甚至启发式扫描算法检测到,并且甚至作为手动测试的时候,如果测试者忽略了这个小点也会漏掉;甚至很多通用框架型的漏洞也具有这个特征。

核心原理

这个算法看起来非常 amazing!但是他的核心原理其实并不复杂:代码部分开源在 https://github.com/yaklang/yaklang
仓库中的如下位置:1. common/mutate/…2. common/jsonpath/…

我们先用 JSON 对象的递归方法构建出它每个字段的 JSONPATH,然后我们使用构造出的一组 JSONPATH 对数据进行
Replace。因为递归构建参数的原因,并且 JSON 本身的数据是不存在环结构的,因此我们只要递归结束,就可以构建出所有的字段的 JSONPath
标记位置。

当每一个位置都可以被精确定位,只需要每个位置依次替换,就可以对任何位置的 JSON 进行替换了。

JSONPath 是一种用于在 JSON 数据中进行数据查询的语言。它类似于 XPath,但是针对 JSON 格式的数据。使用 JSONPath
可以方便地从 JSON 数据中提取出所需要的数据,非常适合用于 API 开发和数据分析等场景。例如,可以使用 JSONPath 从 JSON
数据中提取出特定字段的值,或者根据条件过滤出符合要求的数据。JSONPath 语法简洁易懂,可以通过点号和方括号来访问 JSON 对象和数组中的元素。

fuzz.HTTPRequest我们设计了一套链式 API 以达到模糊测试的目的,这种模糊测试可以自动提取所有的参数,我们寻找到 GET/POST
中参数的时候,可以检查它参数中的值是否是 JSON,如果是 JSON 的话,可以采用上面提到的 JSONPath
标记法生成对应的可模糊测试的模版对象。这样就接入了我们已有的基础设施中。

我们把上面提到的所有技术实现,开放在 YakVM 中,就可以在 Yaklang 中直接使用到这一套组合算法,并且它可以完美融合进 MITM
的测试过程和任何爬虫过程。

最后

分享一个快速学习【网络安全】的方法,「也许是」最全面的学习方法:
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

在这里插入图片描述

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
扫下方二维码,免费领取

有了这些基础,如果你要深入学习,可以参考下方这个超详细学习路线图,按照这个路线学习,完全够支撑你成为一名优秀的中高级网络安全工程师:

高清学习路线图或XMIND文件(点击下载原文件)

还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要的可以【扫下方二维码免费领取】

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

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

相关文章

Linux远程连接mysql 出错plugin caching_sha2_password could not be loaded:

问题描述: 今天使用SQLyog远程连接mysql时出错plugin caching_sha2_password could not be loaded问题。 但在本地cmd 进入命令行窗口:输入命令连接远程连接mysql,发现可以顺利连接。 主要问题是 MySQL可视化工具(如&#xff1a…

Excel技巧 - 管理规则设置一行变色

如何设置某一列单元格的值大于一个值时,该单元格所在的一整行都变色呢? 1、先框选内容区域,点击开始,条件格式,新建规则 2、如果销量大于20,则该行都变为绿色 编辑格式选择:使用公式确定要设置…

Centos7 如何用命令直接更改配置文件里面内容

环境: Centos7.7 问题描述: Centos7 如何用命令直接更改配置文件里面内容 ifcfg-bond1文件里面DNS想替换改成114 解决方案: 1.使用sed命令 sed -i -e "s:匹配参数.*:匹配参数替换后的内容:g" 对应的文件路径本案例命令 se…

2022年全国硕士研究生入学统一考试管理类专业学位联考写作试题——解析版

四、写作:第56~57小题,共65分。其中论证有效性分析30分,论说文35分。 56.论证有效性分析:分析下述论证中存在的缺陷和漏洞,选择若干要点,写一篇600字左右的文章,对该论证的有效性进…

【iOS】多线程 锁问题总结

文章目录 前言1. 你理解的多线程优点缺点 2. atomic 和 nonatomic 的区别及其作用3. GCD的队列类型 - 三种队列类型4. GCD的死锁问题5. 多线程之间的区别和联系6. 进程和线程?进程间的通信方式线程间的通信方式 6. iOS的线程安全手段如何保证 前言 iOS 锁和多线程的…

【python小知识】python同一个函数并行计算

在Python中,我们可以使用多种方式来实现并行计算,例如使用多进程、多线程和协程等。在本文中,我们将重点介绍如何使用Python内置模块multiprocessing来实现同一个函数的并行计算,带有详细的代码和讲解。 multiprocessing模块是Pyt…

python与深度学习(十三):CNN和IKUN模型

目录 1. 说明2. IKUN模型2.1 导入相关库2.2 建立模型2.3 模型编译2.4 数据生成器2.5 模型训练2.6 模型保存2.7 模型训练结果的可视化 3. IKUN的CNN模型可视化结果图4. 完整代码 1. 说明 本篇文章是CNN的另外一个例子,IKUN模型,是自制数据集的例子。之前…

网络基础-认识每层的设备和每层的特点用途

目录 网络层次常见设备各层介绍数据链路层网络层传输层应用层 网络层次 常见设备 各层介绍 数据链路层 有了MAC地址。数据链路层工作在局域网中的,以帧为单位进行传输和处理数据。 网络层 网络层有了IP。不同的网络通过路由器连接成为互联网 路由器的功能:   …

element-ui中Notification 通知自定义样式、按钮及点击事件

Notification 通知用于悬浮出现在页面角落,显示全局的通知提醒消息。 一、自定义html页面 element-ui官方文档中说明Notification 通知组件的message 属性支持传入 HTML 片段,但是示例只展示了简单的html片段,通常不能满足开发中的更深入需要…

企业如何做好供应商管理?

在现代商业竞争激烈的环境下,供应商管理成为企业取得成功的重要因素之一。十年的供应商管理经验告诉我,建立稳固的合作关系并且持续改进供应链是企业蓬勃发展的关键。 阅读本文您将可以了解:1、供应商管理的重要性;2、管理供应商…

基于多线程实现服务器并发

看大丙老师的B站视频总结的笔记19-基于多线程实现服务器并发分析_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1F64y1U7A2/?p19&spm_id_frompageDriver&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 思路:首先accept是有一个线程的,另外…

apple pencil一代的平替有哪些品牌?好用的苹果平替笔

现在几乎每个人都有一台平板iPad,这可以帮助他们解决很多工作和学习上的问题,比如在工作中处理文件,做一些简单的PPT,如果只用一根手指在iPad上触控的话,就会出现一些点触不准确的地方。所以,为iPad配备一支…

MySQL下载安装与配置以及卸载(最简单最详细的步骤)

目录 引言 一,下载8.0数据库 二,下载5.6系列数据库 三,启动数据库 四,MySQL卸载 引言 The worlds most popular open source database:世界上最流行的开源数据库! 一,下载8.0数据库 目前MySQ…

Spark-SortShuffle原理

总结: 每个Task会先把数据发送到缓冲区中,缓冲区满了会排序溢写到临时文件,等到Task计算完成之后,会把这些临时文件合并成一个大文件,和一个index文件,文件内容是有序的,等到所有的Task计算完成之后&#…

华为数通HCIA-华为VRP系统基础

什么是VRP? VRP是华为公司数据通信产品的通用操作系统平台,作为华为公司从低端到核心的全系列路由器、以太网交换机、业务网关等产品的软件核心引擎。 VRP提供以下功能: 实现统一的用户界面和管理界面 实现控制平面功能,并定义转发平面接口…

fork函数 创建子进程

fork&#xff1a; fork函数调用一次&#xff0c;返回两次&#xff1b;对于子进程&#xff0c;返回值0&#xff1b; 对于父进程&#xff0c;返回的是子进程的进程ID。 #include<iostream> #include<string.h> #include<sys/unistd.h> #include<syscall.h&…

MongDB文档--基本概念

阿丹&#xff1a; 不断拓展自己的技术栈&#xff0c;不断学习新技术。 基本概念 MongoDB中文手册|官方文档中文版 - MongoDB-CN-Manual mongdb是文档数据库 MongoDB中的记录是一个文档&#xff0c;它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包…

解读北鼎股份2023上半年财报:稳营收,高品质才是重点?

从上半年大部分公司的财报来看&#xff0c;降本增效仍是主旋律。这其中北鼎股份走出了自己的风格&#xff0c;在小红书等电商平台上推出了热度颇高的话题活动&#xff0c;借用户之力完成产品推广&#xff0c;北鼎股份将消费者的价值发挥到了最大。 从2023年7月19日北鼎股份披露…

面试题:说一说深拷贝和浅拷贝?

JavaScript中存在两大数据类型&#xff1a; 基本类型 和 引用类型 基本类型数据保存在在栈内存中 引用类型数据保存在堆内存中&#xff0c;引用数据类型的变量是一个指向堆内存中实际对象的引用&#xff0c;存在栈中 深拷贝和浅拷贝都只针对于引用类型。 一、 浅拷贝&#xff1…

31.利用linprog 解决 投资问题(matlab程序)

1.简述 语法&#xff1a;[X,FVAL] linprog(f,a,b,Aeq,Beq,LB,UB,X0)&#xff1b; X 为最终解 &#xff0c; FVAL为最终解对应的函数值 *注意&#xff1a;求最大值时&#xff0c;结果FVAL需要取反* f 为决策函数的系数矩阵。 *注意&#xff1a;当所求为最大值…