2.登陆一下好吗??
做CTF题时,不要忽略任何信息,要先收集信息,再分解信息,对于出题者的信息,不可全信,也不可不信,具体的来说就是要仔细分析,出题者的意图。
那么,根据这一题的信息,我们了解到这是一道过滤了某些字符的登录注入题型,为了进一步了解点击链接开始答题:
打开链接,我们就能看到一个很简单的一个登录页面,我们可以按F12查看前端代码,看是否有隐藏的信息,结果没有,接下来我们就要考虑给出的信息中提到过滤了一切,我们测试一下,看是否过滤了所有的字符:
点击登录:
从返回的信息中我们了解到:1.没有过滤的字符有and 单双引号' " (注:其他字符自行测试,and关键字通常与select关键字连用才能发挥真正的效果,单独使用and和引号对于SQL注入来说局限性很大)2.我们输入的用户名和密码都会显示在点击按钮后的页面上,通过其返回的信息我们大致可推断出SQL语句为
select * from user where username='$_POST[username]' and password='$_POST[password]' //单引号字符型注入
(注:这只是推测,也有可能是双引号字符型注入,还有可能带上括号什么的,不过一般单引号居多,所以先从单引号入手)
接下来我们就要开始注入了,只要我们满足条件为'真',就可以返回正确的用户名和密码了,而这道题过滤了很多的字符,怎样才能注入成功呢?
方法一:双等号绕过
在框中输入 '='
那么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'=' 来测试
点击按钮之后:
我们就得到了我们想要的Flag,而且从下面的表单中我们看到有3个用户,也就是说user表里至少有3个用户,因为不确定本关的SQL语句后面是否有limit 0,3 这样的限制条件。
方法二:利用mysql的数据类型转换特性绕过
这个方法是我参考别人的博客发现的,很神奇竟然还有这种方法,遗憾的是没有环境测试了,这里我截取别人博客的内容:(原博客:https://blog.csdn.net/yalecaltech/article/details/63685280)
第一: mysql的数据类型转换特性。
通过这个图,应该可以看明白啦, 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数据类型转换特性:
不得不说能想到这个方法的人,真是牛!!