sql注入原理
web页面通常会根据用户输出的内容生成动态的sql查询语句,如果数据库没有对用户输的语句进行合适的过滤导致攻击者可以通过特殊的sql语句来操作查询内容。
sql注入的形式
基础字符串解析:
table_schema代表数据库名
table_name代表表名
column_name代表列名
information_schema.tables可以获取关于 MySQL 实例中所有数据库和表的结构化信息
information_schema.columns可以获取关于 MySQL 实例中所有数据库和列的结构化信息
information_schema.schemata里面储存了所有的库名
group_concat()将多个行的值合并成一个单一的字符串,方便展示
extractvalue,updatexml函数在mysql数据库中处理 XML 数据的两个函数
-- 是SQL中常用的单行注释符号,后面的内容会被视为注释
#表示对后面的语句进行注释
1.联合注入
示例语句:
-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema= 'security' and table_name='users'),3
查询security数据库中的users表中的所有列
2.宽字节注入
利用不同的字符所占的字节数不同(编码之间的差异),在sql查询中插入特殊字符达到绕过过滤的目的。
-1%df%27 union select 1,database(),user()--+
%df是β的url编码
3.跨库注入
在具有root权限的情况下,绕过常规安全限制通过sql语句对同一服务器上的不同数据库进行查询。
4.二次注入
先写入一次攻击语句,然后再找到合适的点位写入sql数据库中的语句进行拼接,以达到可以注出内容的操作。恶意的SQL注入代码并不会在第一次输入时立即被执行,而是存储在数据库中,并在后续的请求或操作中被执行。通过数据库的存储和后续操作的特点来进行绕过。
5.延时注入
通过页面回显的时间变化来判断,利用sleep函数进行一个延迟,正确会延迟设置的时间返回内容,不正确立马返回内容。
6.布尔盲注
布尔盲注是在没有回显的时候进行注入的一种方式,攻击者通过向SQL查询注入布尔表达式,并根据网页响应的变化来判断条件的真假,从而推测出敏感信息。
7.报错注入
在sql数据库中的代码会返回错误的信息,我们就可以利用extractvalue,updatexml函数穿插查询语句来使数据库故意报错并返回数据内容。
常规手段被禁止的替换手段
禁止空格:
/**/ /*!*/ %20 %09 %0a %0b %0c %0d %a0 %00
通常用于替代空格
禁止=:
使用like 、rlike 、regexp 或者 使用< 或者 >,char(61)
禁止order:
使用group替代order
禁止select:
使用handler命令进行查看,预编译的方法来拼接关键字
靶场推荐
1.sqli-libs靶场
2.pikachu靶场