动态焦点:[NSSRound#8 Basic]MyDoor+[NSSRound#7 Team]ec_RCE
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也没看到什么东西.
好饿啊,吃饭去了= =今天还有实验课,氵一点啦。
感谢你的收看,希望能够帮到你.
那么我们下一题再见!
关键词: