动态焦点:[NSSRound#8 Basic]MyDoor+[NSSRound#7 Team]ec_RCE

来源:哔哩哔哩 2023-04-10 16:13:13

https://www.ctfer.vip/problem/3483

https://www.ctfer.vip/problem/3284


【资料图】

nss的域名更新了,我不会是最后一个才知道的吧,因为只登了两天,导致只能开一道round题,没办法,懒是这样的。

那么言归正传:

[NSSRound#8 Basic]MyDoor

题目标签: WEB  PHP  RCE  Trick

其实这到题打过,当时是扫描后台以为是什么漏洞题目,然后最后想起来伪协议看到源码后又构造不出来= =现在看来当时属于是了解不多。

首先一来白的一页,然后file就应该想到伪协议的,有疑惑的可以去看看伪协议入门题目,基本都长这个样子,当然也有可能是扫描后台题什么的,我忘了当时为什么会这样想了。

那么还原base64代码看到题目:

<?phperror_reporting(0);if (isset($_GET['N_S.S'])) {    eval($_GET['N_S.S']);}if(!isset($_GET['file'])) {    header('Location:/index.php?file=');} else {    $file = $_GET['file'];    if (!preg_match('/\.\.|la|data|input|glob|global|var|dict|gopher|file|http|phar|localhost|\?|\*|\~|zip|7z|compress/is', $file)) {        include $file;    } else {        die('error.');    }}

关键肯定是这句:eval($_GET['N_S.S']);因为下面的preg_much断绝了你用file构造其他伪协议或者目录穿越的可能性,至少断绝了我的。

那么问题可能那么简单吗,我们尝试执行N_S.S=phpinfo();发现并没有执行,那么这里也没有提示有后端绕过,那么可能是php对_的解析特性?

于是我们尝试寻找其他代替语句:

https://www.freebuf.com/articles/web/213359.html

PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

1)删除空白符

2)将某些字符转换为下划线(包括空格)

借用一张图来直观演示:

可以看到,在php中,这些符号都会被解析为_,这里N_S.S就会被解析为N_S_S,那么逐一替代,发现使用[的时候产生了回显,而为什么是_出现了问题,可能是因为_在解析的时候有什么我不知道的变化,因为上图没有显示当尝试'_'的语句时是直接回显foo_bar还是没有回显。

那么eval能利用后,获取flag就不在是问题了,这里发现php的环境变量里面就有flag:

还有第二种方法,我还没有弄懂,这里提供给大家:

此题另解:Gqleung :https://www.ctfer.vip/note/set/1116

可以看到用了很多base64-decode,这种方法是利用 PHP Base64 Filter 宽松的解析,通过 iconv filter 等编码组合构造出特定的 PHP 代码进而完成无需临时文件的 RCE 。

这里同样给出相关知识博客:

https://tttang.com/archive/1395/

同样附上p神对php://filter的妙用讲解,此文的原理与此解有相通之处:

https://www.leavesongs.com/PENETRATION/php-filter-magic.html

至于讲解,我就不看几分钟然后来这里误人子弟了。

[NSSRound#7 Team]ec_RCE在我发现我50金币开了一道30币的题后还有50的时候,做题的形势就发现了变化

这道题我被自己唬住了,看源码:

<!-- A EZ RCE IN REALWORLD _ FROM CHINA.TW --> <!-- By 探姬 --> <?PHP          if(!isset($_POST["action"]) && !isset($_POST["data"]))         show_source(__FILE__);     putenv('LANG=zh_TW.utf8');      $action = $_POST["action"];     $data = "'".$_POST["data"]."'";     $output = shell_exec("/var/packages/Java8/target/j2sdk-image/bin/java -jar jar/NCHU.jar $action $data");     echo $output;     ?>

首先告诉你来自真实案例,然后以为cnvd,你要是这样想就走远了,其他语句比较简单

唬人的是这句:

/var/packages/Java8/target/j2sdk-image/bin/java -jar jar/NCHU.jar

调用了一个java文件,然后接上我们传入的action和data函数。这里看了一下php手册,发现shell_exec在这里没有什么特别的特性来利用。

到这里我就被唬住去找cnvd了= =,实际上这里前面调用的java没什么特别含义,你可以把他当作ping -c 3 127.0.0.1,这样的话你就懂该怎么做了:

直接action接上连接符号,这里||也行,前后都执行,然后data接上命令

最终payload:action=||&data='cat /flag'

这里回头看jar也没看到什么东西.

好饿啊,吃饭去了= =今天还有实验课,氵一点啦。

感谢你的收看,希望能够帮到你.

那么我们下一题再见!

关键词:

返回顶部