信息安全实战从0开始(三)手工SQL注入:重回Low深度学习SQL机制,成功破解Medium
本系列记述了一名信息安全专业大二学生开始自学网络安全知识的历程,最初阶段并没有学习计算机网络等专业课,所以如果遇到IP地址,端口,各种协议,证书等概念的话,我也不清楚,不过我尽量用通俗易懂的方式记录,学习顺序是按网上的一些视频来的,不行就只能恶补(或者说提前预习)一下了…而且这也是我初次尝试md文档,有问题请见谅
信息安全实战从0开始之路(day3)
经过对昨天失败的反思和通关教程的翻阅,我发现一上来就使用Kali Linux中的脚本或许不会有很大帮助,因为过于自动化不能让我清晰的理解漏洞原理。那么今天我采用手工注入的方式。
首先要真正明白SQL机理,我们回到Low级别:
在登录界面我们输入的数据会传递给后端数据库,假如后端数据库的代码是这样的
SELECT <要查询的内容> FROM <表名> WHERE <列名> = '$id';
正常输入1,会把&id替换成1,也就变成了
SELECT <要查询的内容> FROM <表名> WHERE <列名> = '1';
那么就会输出符合的成员,查询成功。但是当我们尝试输入1 AND 1=1,发现依然能查询到,说明没有对AND 1=1 这个部分进行过滤,即有SQL注入漏洞,我们可以通过将指令并入输入中来达到获取信息的目的,所以我们就可以尝试输入select user(), database()查询信息,那么代码拼接之后就会变成
SELECT <要查询的内容> FROM <表名> WHERE <列名> = 'select user(), database()';
但是我们发现如果这么输入没有输出,因为指令被包裹在’‘里面所以被当成了字符串放进了数据库进行比对,结果肯定是没有,所以我们需要一个东西来处理掉这个引号,我们就输入1’ union select user(), database(),拼接之后就变成
SELECT <要查询的内容> FROM <表名> WHERE <列名> = '1' union select user(), database()';
(union用于链接两条指令,即1和select user(), database()被当作两条指令对待,如果正确的话会先输出userID为1的用户名再输出当前数据库用户名和数据库名)
这样select user(), database()就成为了指令而不是被当作字符串,但是我们发现结尾还是有一个’没有处理,这样会导致报错,所以我们直接输入#把后面注释掉就好了,最后就成了
SELECT <要查询的内容> FROM <表名> WHERE <列名> = '1' union select user(), database()#';
这样就成功了

现在我们已经深入理解了这个漏洞的机理,开始挑战Medium级别,昨天我们已经发现了这里不能输入,但是我们可以抓取请求,使用Burp抓包后直接修改代码

首先,按照刚才的逻辑,我们应该输入1’ union select user(), database()#,但是显示报错

我们来重新确定防御类型,重新抓包并输入1’ and 1=1发现同样报错,那么我猜测Medium等级很可能没有使用引号
我们直接输入1 and 1=1发现可以输出,所以我们就不需要那个引号了,直接输入1 union select user(), database()#

成功了!经过查询得知Medium级别下后端SQL数据库的代码时用中括号,即
SELECT * FROM users WHERE user_id = [id]
另外,如果想获取表名,可以输入group_concat(table_name) from information_schema.tables where table_schema=‘dvwa’
网课的路线或许并不适合每一个人,我看很多网课直接就教一些软件脚本的使用,对于漏洞本身的讲解总是一带而过,只有自己能深入理解每个漏洞背后的原理,才能往前走,刚开始就使用自动化脚本应该不是一个明智的选择,今天的任务圆满成功!
更多推荐

所有评论(0)