红队渗透测试工程师分享JSON-RPC测试方法

admin 2023年10月17日20:41:37评论91 views字数 4068阅读13分33秒阅读模式

本文是i春秋线下就业班结业学员「YongYe」分享的技术文章,公众号旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。

红队渗透测试工程师分享JSON-RPC测试方法

YongYe


i春秋渗透测试工程师成都基地线下就业班10期结业学员。通过推荐就业,已成功拿到Offer并顺利入职,目前担任红队渗透测试工程师,擅长黑盒测试。
他的往期精选>>
为什么白帽大佬热衷挖逻辑漏洞?(附案例解析)
XP_CmdShell平替CLR的基础利用


RPC介绍

RPC(Remote Procedure Call)远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序。而程序员就像调用本地程序一样,无需额外地为这个交互作用编程。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。
RPC是一种进程间通信的模式,程序分布在不同的地址空间里。如果在同一主机里,RPC可以通过不同的虚拟地址空间(即便使用相同的物理地址)进行通讯,而在不同的主机间,则通过不同的物理地址进行交互。许多技术(通常是不兼容)都是基于这种概念而实现的。 
JSON-RPC可以简单理解成通过JSON格式对后端函数/方法的调用,根据不同的函数/方法传递相应的

YongYe:刚好遇到使用JSON-RPC操作接口的情况,跟大家分享一下我的测试方式。目前针对接口测试,如JSON-RPC或XML-RPC这两种不同类型接口的测试文章比较少。

这篇文章主要是帮助大家更直观的学习在JSON-RPC中的测试方式,以及JSON-RPC的基础格式,便于大家了解这种接口的特征和错误信息的含义。

红队渗透测试工程师分享JSON-RPC测试方法


请求格式

Json-Rpc向服务器传输数据标准格式如下:

红队渗透测试工程师分享JSON-RPC测试方法


{     "jsonrpc" : 2.0,    "method" : "xxxxx",     "params" : ["xxxxx"],     "id" : xx}

jsonrpc JSON-RPC版本。
method 被调用的方法的名称。
params 调用方法需要传递的参数的数组或字典。
id 当前请求的唯一标识。服务器会返回相同ID的响应。

常见的请求方式

1. 列表式请求
使用列表形式提交参数
 {    "jsonrpc":"2.0",    "method": "xxxx,    "params":[11,22],    "id": 1}

2. 键值式请求

使用键值对形式提交参数

{    "jsonrpc":"2.0",    "method": "xxx",    "params":{                "key1": 11,                "key2": 22             },     "id": 1}


响应格式

服务器返回的标准数据格式,如:
{    "jsonrpc" : 2.0,    "result" : "xxx",    "error" : xxxx,    "id" : 1}
jsonrpc JSON-RPC版本。
result 被调用的函数的返回值/结果。
error 调用发送错误时存在该值,返回错误对象。正常调用则该参数可以为空。
id 对应请求的唯一标识ID。


错误对象格式

主要由code、message、data三部分组成,需要仔细查看message、data字段,特别是在SQL注入时,可以帮助我们了解一些信息,包括不限于网站路径、SQL语句、系统信息。

红队渗透测试工程师分享JSON-RPC测试方法

{    "code" : 1,    "message" : "xxx",    "data":xxxx}
code 错误码。
message 错误的描述消息。
data 其它错误信息。


常见错误码

错误码-32768至-32000为保留值,参考一下即可,如若有错误消息时,可以直接看出来是什么错误。
代码 错误 含义
-32700 解析错误 服务器接收到无效的JSON、服务器解析JSON文本发生错误。
-32600 无效的请求 发送的JSON不是一个有效的请求。
-32601 方法未找到 方法不存在或不可见。
-36602 无效的参数 无效的方法参数。
-36603 内部错误 JSON-RPC内部错误。
-32000至-32099 服务器端错误 保留给具体实现服务器端错误。


常规测试方法

1. 参数篡改
参数篡改比较广,可以尝试修改/增加/删除参数,看是否可以获得额外的信息或访问非法接口等。下面例子就是正常的篡改方式,还可以尝试删除' "id", "name", "email", "phone" '保留空列表,在限制数据字段时看看是否可以直接爆出所有字段。
原请求:
{  "jsonrpc": "2.0",  "method": "Post",  "params": {    "model": "partner",     "args": [[1], ["name", "email"]]   },  "id": CrazyThursdayKfcVme50}
非法请求:
{  "jsonrpc": "2.0",  "method": "Post",  "params": {    "model": "User",     "args": [[2], ["id", "name", "email", "phone"]]   },  "id": CrazyThursdayKfcVme50}
2. 越权
测试JsonRpc接口是否存在会话管理缺陷,修改会话中身份参数进行横向/垂直移动。
下面例子比较典型,参数中直接看到uid。如果存在权限管理缺陷,修改uid可能存在直接越权。但是一般都是cookie/token等等+uid 双验证,仅更改uid无效果。还有一些可能不存在uid,但是可以通过控制接口参数直接越权获取数据。例:Web有一个不可用按钮,一个可以用的按钮。通过前段代码获取到不可用按钮的参数,在可用按钮的接口提交该参数。
原请求:
{  "jsonrpc": "2.0",  "params": {    "model": "partner",     "method": "search_read",    "args": [[1], ["name", "email"]] ,    "uid": 50   },  "id": CrazyThursdayKfcVme50}
非法请求:
{  "jsonrpc": "2.0",  "params": {    "model": "partner",     "method": "search_read",    "args": [[1], ["name", "email"]] ,    "uid": 1   },  "id": CrazyThursdayKfcVme50}
3. 模糊测试
这个其实跟参数篡改一样,主要是法制一些存在/不存在的参数,看是否会返回敏感信息/参数/数据,比如创建xx接口把创建改为查询等等一些方式。
原请求:
{  "jsonrpc": "2.0",  "params": {    "model": "partner",     "method": "create",    "args": [[1], ["name", "email"]] ,    "uid": 50   },  "id": CrazyThursdayKfcVme50}
非法请求:
{  "jsonrpc": "2.0",  "params": {    "model": "partner",     "method": "select",    "args": [[1], ["name", "email"]] ,    "uid": 50   },  "id": CrazyThursdayKfcVme50}
4. SQL注入
 原请求:
{  "jsonrpc": "2.0",  "params": {    "model": "partner",     "method": "create",    "args": [[1], ["name", "email"]] ,    "uid": 50   },  "id": CrazyThursdayKfcVme50}
非法请求:
{  "jsonrpc": "2.0",  "params": {    "model": "partner%27select user()--c",     "method": "create%22",    "args": [[1], ["name", "emailorder"]] ,    "uid": 50   },  "id": CrazyThursdayKfcVme50}
5. 命令执行
某些接口背后代码可能存在命令执行函数,黑盒测试时可以加入/替换参数测试是否存在命令执行。
原请求:
{  "jsonrpc": "2.0",  "method": "Post",  "params": {    "model": "exec",     "args": [["ping"], ["xxxxx.xxx"]] ,    "uid": 50   },  "id": CrazyThursdayKfcVme50}
 非法请求:
{  "jsonrpc": "2.0",  "method": "Post",  "params": {    "model": "exec",     "args": [["cmd"], ["whoami"]] ,    "uid": 50   },  "id": CrazyThursdayKfcVme50}
6. 反序列化
无公开漏洞情况下,黑盒一般不考虑。

总结

其实JSON-RPC测试并不难,但需要细心。
有个小技巧是通过各种方式找到多个接口,利用多个接口之间的参数发现数据包组成规律、参数含义,这样对参数模糊测试会简单一点,如:JS、信息泄露、爆破、抓包、代码审计等去发现接口,接口一般都先鉴权,不鉴权的情况属于运气比较好,这就需要其他的方法漏洞结合进行对抗,权限验证绕过后就是常规操作,优先找RCE、SQL注入接口。
强调一点:错误信息、参数模糊测试很重要!
红队渗透测试工程师分享JSON-RPC测试方法
以上内容来自于「YongYe」师傅投稿,「YongYe」是成都基地线下就业班10期结业学员i春秋为每一位顺利结业的学员推荐各大安全公司的入职面试机会,并提供职业规划、简历指导,总结大量面试经验,帮助学员轻松纵横职场!如果你也对渗透测试感兴趣,想在网络安全行业立足,毕业就能拿到过万的薪资,欢迎报名成都12期线下就业班

红队渗透测试工程师分享JSON-RPC测试方法

红队渗透测试工程师分享JSON-RPC测试方法
红队渗透测试工程师分享JSON-RPC测试方法
红队渗透测试工程师分享JSON-RPC测试方法
红队渗透测试工程师分享JSON-RPC测试方法

线下就业班是由i春秋教研组结合众多安全企业制定的网络攻防面授课程,拥有多年的红蓝对抗基因。课程配套150+实验靶标、6大平行仿真综合靶场真正做到学练同步、“内外兼修”。值得一提的是,学员在课程的中、后期,将由讲师带队,真正参与到实战项目和CTF比赛,锻造实战技能,为就业增添一份重要筹码

扫码咨询招生老师,一对一答疑解惑

红队渗透测试工程师分享JSON-RPC测试方法

红队渗透测试工程师分享JSON-RPC测试方法

戳这里,了解更多课程详情

原文始发于微信公众号(YongYe 安全实验室):红队渗透测试工程师分享JSON-RPC测试方法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月17日20:41:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   红队渗透测试工程师分享JSON-RPC测试方法http://cn-sec.com/archives/2121923.html

发表评论

匿名网友 填写信息