[CTF-writeup] BUUCTF:极客大挑战2019_EasySQL

概要

类型:Web-SQL注入

来源:BUUCTF

知识点:万能密码;判断闭合方式


思路

首先可以看到一个比较简单的登录界面,且要求同时输入用户名和密码。

使用F12查看网页源代码,并没有发现任何有提示性的信息。

先随意输入username(用户名)和password(密码),此处我以username=admin,password=1尝试登录,页面提示登陆失败。

既然题目是EasySQL,那么就用【SQL注入】的方式来解决。

从【注入类型】来看,输入的参数应该是字符串型而不是整型,因此从字符型注入入手。

首先判断【闭合方式】,我们先假设username输入框为注入点(实际上两个输入框都是注入点),分别输入1'以及1";password则任意输入(此处为2)。

输入1"登录失败了。而输入1'登录后,页面有报错信息如下:

这是SQL的语法错误提示。若您并不太了解SQL语言,要解释为什么单引号会引发这样的错误,我们可以先假设一般的验证语句:

select * from table_name where username='xxx' and password='xxx';

此语句的语义为,在table_name这个表中,找到符合条件的数据项,并返回其所有字段的内容,此处的条件,就是同时相互匹配的用户名和密码。我们猜测后端程序的基本逻辑是,只要查询到相匹配的用户名和密码,就判定登录成功并向页面返回flag,

将我们判断闭合方式时的输入代入其中,得到的语句分别如下:

select * from table_name where username='1"' and password='2';
select * from table_name where username='1'' and password='2';

输入的是双引号时,1"是作为一整个字符串存在的,因此不会发生任何与语法错误。

然而当输入的是单引号时,显然,引号的匹配发生了错位,形成了字符串'1'和'and password=',最后剩下一个引号没有得到匹配,从而引发语法错误。

因此可以下结论,此处为【单引号闭合】方式。

接下来就可以尝试用SQL注入中十分经典的【万能密码】:

' or 1=1--

将上述字符串作为用户名,并输入任意的密码。竟然能直接得到flag。

要想理解其运行逻辑,就将其代入前面的语句中:

select * from table_name where username=''or 1=1-- and password='2';

在SQL中,-- 有单行注释的作用(在MySQL中还可以用 # 进行单行注释),因此注释后面的语句就不起作用了。而在前半句中,username=''or 1=1显然永远为真值,所以这条语句相当于:

select * from table_name;

这就是使用万能密码绕过登录验证的原理所在。而万能密码还有非常多的变式,但原理相通,对应的,也存在很多机制可以轻松防御它,比如字符的过滤等,在后面难度更高的SQL注入中,您就能体会到。

总结

总的来说,这是一道十分简单的、不需要太多知识储备的SQL注入。我们利用万能密码绕过了验证的逻辑,完成了登录,最后直接得到了flag,也确实是“EasySQL”了,当然,了解事物的过程总是循序渐进、由浅入深的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值