目录
刚刚做的一道CTF,挺有意思的
题目
进入环境,页面很简单,只有一串字符串
尝试了很多加密都没有结果,先放着吧
既然提示备份,那先看看备份文件
常见的网站源码备份文件后缀名
- .rar
- .zip
- .7z
- .tar.gz
- .bak
- .swp
- .txt
- .html
常见的网站源码备份文件名
- web
- website
- backup
- back
- www
- wwwroot
- temp
将文件下载下来后打开,进行代码审计
<?php
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
整段代码的意思是将参数中的key替换为空,在对key1和key2的值进行MD5加密之后比较,如果md5加密的值一样而未加密的值不同,就输出flag.
解题思路
- 绕过str_replace函数(使用复写便可绕过)
- 绕过MD5加密后的弱比较
MD5弱比较绕过方法
- 弱比较会将0e开头的识别为科学计数法,0的n次方均为0。所以可以输入经过MD5加密后为0e的字符串进行绕过
常用MD5加密为0e开头的:
QNKCDZO,240610708,s878926199a,aabg7XSs,aabC9RqS
2. md5()函数无法处理数组,所以传入数组,会返回NULL,两个数组均为NULL即相等
最终payload如下:
?kekeyy1=QNKCDZO&kekeyy2=s878926199a
成功得到flag
最后看看之前的那段加密后的字符串,发现是d41d8cd98f00b204e9800998ecf8427e的两次重复,尝试MD5解密一下
解密后为 “ 空 ” 也就是NULL,因为没有传入key1和key2所以为NULL