实验吧-Web2

2.登陆一下好吗??

实验吧-Web2_第1张图片

做CTF题时,不要忽略任何信息,要先收集信息,再分解信息,对于出题者的信息,不可全信,也不可不信,具体的来说就是要仔细分析,出题者的意图。

那么,根据这一题的信息,我们了解到这是一道过滤了某些字符的登录注入题型,为了进一步了解点击链接开始答题:

实验吧-Web2_第2张图片

打开链接,我们就能看到一个很简单的一个登录页面,我们可以按F12查看前端代码,看是否有隐藏的信息,结果没有,接下来我们就要考虑给出的信息中提到过滤了一切,我们测试一下,看是否过滤了所有的字符:

实验吧-Web2_第3张图片

点击登录:

实验吧-Web2_第4张图片

从返回的信息中我们了解到:1.没有过滤的字符有and  单双引号' " (注:其他字符自行测试,and关键字通常与select关键字连用才能发挥真正的效果,单独使用and和引号对于SQL注入来说局限性很大)2.我们输入的用户名和密码都会显示在点击按钮后的页面上,通过其返回的信息我们大致可推断出SQL语句为

select * from user where username='$_POST[username]' and password='$_POST[password]'  //单引号字符型注入

(注:这只是推测,也有可能是双引号字符型注入,还有可能带上括号什么的,不过一般单引号居多,所以先从单引号入手)

接下来我们就要开始注入了,只要我们满足条件为'真',就可以返回正确的用户名和密码了,而这道题过滤了很多的字符,怎样才能注入成功呢?

方法一:双等号绕过

在框中输入 '='

实验吧-Web2_第5张图片

那么SQL语句就变成了

select * from user where username=' '=' ' and password=' '=' 

也就是select * from user where username=null=null and password=null=null

根据SQL语句的等号的运算规则,我们从左往右来理解这句sql语句,首先usename=' ' 一般数据库是没有null这个用户名的所以usename=null判断为false然后usename=false=null接着 false=null 返回true 于是 select * from user where username=true and password=' '=' ' 同理password也为true

那么整个SQL语句就变成了select * from user where username=true and password=true 根据SQL语句的语法,该SQL语句可以简写成select * from user

(注: '='是最简单的写法,其他写法还有:

1='1'
1='1.0'
1='1后接字母(再后面有数字也可以)'
0='除了非0数字开头的字符串'

.....
(总体上只要前面达成false的话,要使语句为true很简单)

这里我们可以使用 1'=' 来测试

实验吧-Web2_第6张图片

点击按钮之后:

实验吧-Web2_第7张图片

我们就得到了我们想要的Flag,而且从下面的表单中我们看到有3个用户,也就是说user表里至少有3个用户,因为不确定本关的SQL语句后面是否有limit 0,3 这样的限制条件。

 

方法二:利用mysql的数据类型转换特性绕过

这个方法是我参考别人的博客发现的,很神奇竟然还有这种方法,遗憾的是没有环境测试了,这里我截取别人博客的内容:(原博客:https://blog.csdn.net/yalecaltech/article/details/63685280)

第一: mysql的数据类型转换特性。 

实验吧-Web2_第8张图片


     通过这个图,应该可以看明白啦, user是一个字符串类型的,当他接受到一个整型值其值为0的时候,就会返回数据库的所有条目。 一个字符串加一个整形,会自动的变量类型转换,变为一个整型。

所以,只需要让sql执行

select * from table where username='a'+0;

就可以返回一个ture了,但是你会发现注释符全部过滤啦,后面的部分去不掉,这时候你需要知道下面的姿势。

第二: mysql的注释符除了

-- + , # ,/**/ 之外,还有一个 ;%00 ,很多人都不知道最后一个。

所以最后的payload 是这样的: username=a'+0;%00&password= 

于是,整个SQL语句就变成了select * from user where username='a'+0;%00 and password= 

也就是select * from user where username='a'+0;

补充:这里我来验证上面的MySQL数据类型转换特性:

实验吧-Web2_第9张图片

 

实验吧-Web2_第10张图片

不得不说能想到这个方法的人,真是牛!!

 

你可能感兴趣的:(CTF-Web)