题目链接:NSSCTF | 在线CTF平台
涉及工具:hackbar
涉及知识点:md5绕过
解题思路:
1.打开靶机,代码审计:
审计代码:
①highlight_file(__FILE__);
将自身的源代码以HTML的形式输出到浏览器中,这样我们可以直接查看代码。
②include ‘flag2.php’;
它包含了一个名为 flag2.php 的文件,这可能是一个包含了敏感信息(比如flag)的文件。
③if(isset($_GET['name']) && isset($_POST['password'])){
$name = $_GET['name'];
$password = $_POST['password'];
a.代码通过 $_GET['name'] 和 $_POST['password'] 获取了两个用户输入的值;
b.$_GET 用于从URL中获取参数,$_POST 用于从表单中获取参数,这里的 $_GET['name'] 表示从URL中获取名为 "name" 的参数,而 $_POST['password'] 表示从表单提交中获取名为 "password" 的参数;
c.满足条件进入内层(下一层判断).
注:
isset函数:isset() 是一个 PHP 函数,用于检查变量是否已经设置并且非 NULL。
④if($name != $password && md5($name) == md5($password)){
echo $flag;
}
else {
echo "wrong!";
}
}
如果$name 和 $password 不相等且是它们的MD5哈希值相等时,将输出flag,否则,将输出 "wrong!".(作用在从外到内第二个if判断语句)
⑤else{
echo 'wrong!';
}
如果判断条件不成立,将会输出 "wrong!".(作用在从外到内第一个if判断语句)
2.审计代码得知:
①需要用get传递一个参数‘name’,post传递一个参数‘password’;
②传入的‘name’不等于‘password’且两个的MD5值相等,即可获得flag.
两种常用题解方法(PHP md5常用两种绕过方式):
a.数组漏洞绕过:
原理:PHP md5函数接收的参数为string(字符串型),如果传入arry(数组型)就无法计算其md5值,但不会报错,导致数组md5值都相等.
b.PHP ‘==’(弱类型比较)漏洞绕过:
原理解释:PHP在进行“==”(弱类型比较)时,会先转换字符串类型,再进行字符串比较,而进行md5后以0e开头的都会被PHP识别为科学计数法,即0e*被视作0的*次方,结果都为0,故我们只需找到md5后为0e*的字符串,常用md5后为0e*的有:
字符串 对应md5值
240610708 0e462097431906509019562988736854
QLTHNDT 0e405967825401955372549139051580
QNKCDZO 0e830400451993494058024219903391
PJNPDWY 0e291529052894702774557631701704
NWWKITQ 0e763082070976038347657360817689
NOOPCJF 0e818888003657176127862245791911
MMHUWUV 0e701732711630150438129209816536
MAUXXQC 0e478478466848439040434801845361
注:以上字符串要记得两个及两个以上,对应md5值不用记.
3.知识总结:
①两种md5常用绕过方法:
a.数组绕过;
b.‘==’弱类型比较绕过。
语法:md5(string,raw)
String:必需,规定计算的字符串
raw:可选,规定十六进制或二进制输出格式
TRUE:16字符二进制格式
FALSE:32字符十六进制数
②PHP两种比较:
a.‘==’弱类型比较:
‘123’==‘123’---->true
‘123’==‘123abc....’---->true
注:只取字符串开头整数部分,特别注意*e*(科学计数法)开头的字符串取科学计数法的数值,如:
‘1e3’==‘1e3’ ---->true
‘1e3ctf’==‘1e3ctf’ ---->true
‘1e3’==‘1e4’ ---->false
‘1e3ctf’==‘1e4ctf’ ---->false
b.‘===’强类型比较:
数据类型和值都要求相等,如:
‘1e3’===‘1e3’ ---->true
‘1e3ctf1’===‘1e3ctf2’ ---->false
③两种PHP传参方法get和post;hackbar的基本使用:
(该内容在我另一篇博客具体讲述及运用过,此处不再重述,还不清楚的请弄懂!博客链接:【[SWPUCTF 2021 新生赛]jicao - 优快云 App】http://t.csdnimg.cn/CAZ0X)
④isset函数:isset() 是一个 PHP 函数,用于检查变量是否已经设置并且非 NULL。它的语法如下:
isset(mixed $var, mixed $...)
$var:要检查的变量,可以是一个或多个变量。
返回值:如果所有提供的变量都已设置且非 NULL,则返回 true,否则返回 false。
在给定的代码中,isset($_GET['name']) 和 isset($_POST['password']) 用于检查是否已经从 URL 参数中获取了 name,以及是否从 POST 表单中获取了 password。这样可以确保在尝试使用这些变量之前先检查它们是否存在,以避免产生未定义变量的错误。