绝杀 GETPOST 嵌套的 JSON 参数

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

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

 

背景

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

我们以一个很经典的实际案例来说明这种情况,如果一个数据包长这个样子:

GET / HTTP/1.1
Host: www.example.com
Content-Type: application/json; charset=UTF-8
User-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 代码很简单地实现这个功能:

熟悉 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.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/83.0.4103.116

那么这种情况,其实就非常令人恐惧了。我们这个数据包中,包含 4 个 GET 参数,虽然表面上包含四个参数,但是参数中有一个obj其实非常复杂,他是被编码的,并且还包含了abckeyInQuery这两个隐藏参数。

也就是说,上面这个数据包,实际包含了 6 个参数:

  1. GET 参数:a

  2. GET 参数:b

  3. GET 参数:key

  4. GET 参数:obj

  5. GET 参数嵌套 JSON 参数:obj.abc

  6. 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.1
Host: www.example.com
Content-Type: application/json; charset=UTF-8
User-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 打印出来。

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

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

仿真测试

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

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

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

全自动化测试

我们编写一个表达式注入的通用测试脚本:

freq = fuzz.HTTPRequest(`
GET /expr/injection?b={"a":1} HTTP/1.1
Host: 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 OK
Date: Mon, 15 May 2023 06:25:56 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 282-----------------ORIGIN PACKET---------------
GET /expr/injection?b=%7B%22a%22%3A%222011-03-9%22%7D HTTP/1.1
Host: 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.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

 

 (都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。 

 因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。 

 还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

 最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

 因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取 

  

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

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

相关文章

Kimichat使用案例019:15个Kimichat提示词案例

文章目录 一、扮演招聘经理二、扮演英语教师三、文章修改润色四、模仿特定作者写文章五、扮演任何一个角色六、像董宇辉一样介绍一本书七、写商业计划书的大纲八、头脑风暴九、总结文章十、推荐书籍十一、写电子邮件十二、学习Python编程十三、Python编程十四、制作菜谱十五、写…

网格布局之重复轨道

网格布局之重复轨道 欢迎关注:xssy5431 小拾岁月 参考链接:https://mp.weixin.qq.com/s/FQboZRMhdOFWqVDZ5JScDg 点击查看 使用场景 在网页开发中,我们尝尝会遇到宫格布局,比如:3 * 3,4 * 4布局等等。 …

串扰(二)

三、感性串扰 首先看下串扰模型及电流方向: 由于电感是阻碍电流变化,受害线的电流方向和攻击线的电流方向相反。同时由于受害线阻抗均匀,故有Vb-Vf(感应电流属于电池内部电流)。 分析感性串扰大小仍然是按微分的方法…

C++11(下):线程库

线程库 1.线程1.1线程类介绍以及简单使用1.2线程函数参数1.3如何获取线程函数返回值 2.锁2.1锁的种类2.2 lock_guard与unique_lock 3.原子库3.1介绍与基本使用3.2CAS(原子操作原理) 4.条件变量 1.线程 1.1线程类介绍以及简单使用 在C11之前&#xff0c…

2024年仿真建模与多媒体技术国际学术会议(ISMMT 2024)

全称:2024年仿真建模与多媒体技术国际学术会议(ISMMT 2024) 会议网址:http://www.ismmt.com 会议时间:最终通知见官网! 会议地点: 深圳 投稿邮箱:ismmtsub-conf.com投稿标题:ArticleTEL。投稿时…

LabVIEW在中国航天中的应用

​LabVIEW是一种系统设计平台及开发环境,由美国国家仪器公司(NI)开发。它在中国航天领域的应用非常广泛,涵盖了测试与测量、数据采集、控制系统设计等多个方面。以下是LabVIEW在中国航天中的几个主要应用实例: 1. 测试…

QT系列教程(11) TextEdit实现Qt 文本高亮

文本高亮 对于textedit里录入的部分单词我们可以实现高亮,实现高亮主要依赖于QSyntaxHighlighter。 我们先创建一个Qt Application类,类名MainWindow, 然后新增一个C类,类名为MySyntaxHighlighter。 #ifndef MYSYNTAXHIGHLIGHTER_H #define …

麻省理工IOT教授撰写的1058页Python程序设计人工智能实践手册!

为什么要学习Python? Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。此外,Python还具有免费开源、跨平台、面向对象、胶水…

网络安全ctf比赛_学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!..._给一个照片,可以考虑的解题方向网络安全

对于想学习或者参加CTF比赛的朋友来说,CTF工具、练习靶场必不可少,今天给大家分享自己收藏的CTF资源,希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站,内容齐全,收藏备用。 1、C…

!力扣105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,null,15,7] …

ARM架构简明教程

目录 一、ARM架构 1、RISC指令集 2、ARM架构数据类型的约定 2.1 ARM-v7架构数据类型的约定 2.2 ARM-v8架构数据类型的约定 3、CPU内部寄存器 4、特殊寄存器 4.1 SP寄存器 4.2 LR寄存器 4.3 PC寄存器 二、汇编 1、汇编指令(常用) 2、C函数的…

oracle数据库日常保养或巡检语句实践整理汇总

目录 1.目的 2.操作工具 3.实践说明 1.检查Oracle实例状态 2.检查Oracle在线日志状态 3.检查Oracle表空间状态 4.检查Oracle所有数据文件状态 5.检查Oracle数据库连接情况 6.检查Oracle表容量占用大小 7.检查Oracle备份 8.检查数据库表空间的使用情况 4.总结 1.目的 …

TSINGSEE青犀云边端技术如何助力视频监控实现高效管理与安全监控

随着信息技术的飞速发展,视频监控作为维护公共安全的重要手段,正逐渐融入人们的日常生活。在这个大数据、云计算、物联网等技术深度融合的时代,云边端技术作为一种新兴的技术架构,为视频监控带来了前所未有的变革与机遇。本文将以…

matlab 路面点云标线提取

目录 一、算法原理二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 算法来自本人自创。实现效果如下图所示,具体实现原理看代码即可。 二、代码实现 clc; cle…

办公楼导航系统:设计要点、功能实现与效益评估

随着现代办公楼的日益复杂化和规模化,如何高效、便捷地在楼宇内部进行定位和导航,已成为众多企业和员工关注的焦点。维小帮办公楼定位导航系统通过精准的定位和智能的导航功能,能够显著提升办公环境的智能化水平和办公效率。 一、维小帮办公…

k8s快速上手实操

前言 Kubernetes(简称K8s)是由Google开源的一个用于自动化部署、扩展和管理容器化应用程序的系统。自2014年发布以来,Kubernetes已经迅速成长为容器编排领域的标准,并在全球范围内得到了广泛的采用和认可。 Kubernetes作为现代容…

Mcgs屏幕脚本程序

目录 1.脚本程序概述1.1 脚本程序简介1.2 脚本程序编辑环境 2.脚本程序语言要素2.1 变量和常量2.2 对象2.3 事件2.4 表达式2.5 联行符2.6 运算符2.7 系统函数 3. 基本语句3.1 赋值语句3.2 条件语句3.3 循环语句3.4 跳出语句3.5 退出语句3.6 注释语句3.7 声明语句3.6 命名规则 1…

threejs视频融合 webgl

threejs三维视频融合 let objList []; const clock new THREE.Clock(); const container document.getElementById( container );const stats new Stats(); container.appendChild( stats.dom );const renderer new THREE.WebGLRenderer( { antialias: true } ); rendere…

Linux 防火墙 Firewall 和 Iptables 的使用

如果我们在Linux服务器的某个端口上运行了个服务,需要外网能访问到,就必须通过防火墙将服务运行端口给开启。Linux中有两种防火墙软件,CentOS7.0以上使用的是firewall,CentOS7.0以下使用的是iptables(使用较少且不建议…

Jenkins+K8s实现持续集成(三)

接上面一篇JenkinsK8s实现持续集成(二),K8s创建秘钥。 看secret kubectl get secret 删除secret kubectl delete secret hello-secret -n train 创建secret kubectl create secret docker-registry hello-secret --docker-server镜像仓库…