PHP相关漏洞

一、PHP漏洞原理

1.PHP命令执行漏洞

PHP应用程序有时需要调用一些执行系统命令的函数,如php中的system,exec,shell exec,passthru,popen等,当用户可以控制这些函数的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令注入攻击/命令执行漏洞。

攻击达成的两个条件:

(1)用户可以控制函数输入

(2)存在可以执行代码的危险函数

命令执行漏洞的危害:

  1. 继承web服务程序的权限去执行系统命令或读写文件
  2. 反弹shell
  3. 控制整个网站甚至服务器
  4. 进一步内网渗透

命令执行的防御:

尽量不要执行外部命令

使用自定义函数或函数库替代外部函数功能

使用escapeshellarg函数来处理命令参数

使用safe_mode_exec_dir:指定可执行文件路径

  1. safe_mode_exec_dir = /usr/local/php/bin

2.PHP文件包含漏洞

为了更好地使用代码的重用性,可以使用文件包含函数将文件包含进来,直接使用文件中的代码来提高重用性。在通过 PHP 的函数引入文件时,为了灵活包含文件,会将被包含文件设置为变量,通过动态变量来引入需要包含的文件用户可以对变量的值可控,而服务器端未对变量值进行合理地校验或者校验被绕过, 就会发生执行恶意php代码导致被攻击。

PHP中文件包含的4个函数是:

  1. include 
  2. require
  3. include_once
  4. require_once

3.PHP伪协议

PHP文件包含,支持如下的伪协议和封装协议:

file:// — 访问本地文件系统

http:// — 访问 HTTP(s) 网址

ftp:// — 访问 FTP(s) URLs

php:// — 访问各个输入/输出流(I/O streams)

zlib:// — 压缩流

data:// — 数据(RFC 2397)

glob:// — 查找匹配的文件路径模式

phar:// — PHP 归档

ssh2:// — Secure Shell 2

rar:// — RAR

ogg:// — 音频流

expect:// — 处理交互式的流

file://

这个协议可以读取本地文件系统的文件,默认目录是当前的工作目录。

file:///path/to/file.ext 在文件包含中其实也就是等价/path/to/file.ext

但是如果来个题目给你来个正则匹配../ 或/开头的时候就可以用这个方法来绕过了。

php://

(1)php://input是个可以访问请求的原始数据的只读流

(2)php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用

常见用法:

可用过滤器列表 这里面列出了各种过滤器

(1)

readfile("http://www.example.com");

等价于

readfile("php://filter/resource=http://www.example.com");

(2)

读取链

file_get_contents("php://filter/read=convert.base64-encode/resource=test.php");

写入链

file_put_contents("php://filter/write=convert.base64-decode/resource=[file]","base64");

这个点在ctf有时候会很有用,可以绕过一些waf

(3)php://input

可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

4.PHP反序列化

自从 Orange 在 2017年的 hitcon 出了一个 0day 的 php phar:// 反序列化给整个安全界开启了新世界的大门以后,php 反序列化这个漏洞就逐渐升温。

序列化的目的是方便数据的传输和存储,将对象变为字节流,调用的函数是serialize(),对对象进行序列号,只序列号对象的属性变量,不序列化对象的方法。

文件: User.php

<?php

class User{

    public $name = 'P2hm1n'; 

    protected $sex = 'secret'; 

    private $age = '20';

}

$person = new User();

$str = serialize($person);

print($str);

//序列化的字节流写入文件user.txt

file_put_contents("user.txt", $str);//save file

?>

用Winhex打开文件,发现protected 和 private的属性,序列化后含有整数0。

反序列化就是将将字节流还原为对象的过程,反序列化时要求当前作用域存在该对象的类定义。反序列号调用的函数是: unserialize()。

PHP 反序列化漏洞又叫做 PHP 对象注入漏洞,是因为程序对输入数据处理不当导致的.反序列化漏洞的成因在于代码中的 unserialize() 接收的参数可控,而序列化的对象只含有对象的属性,那利用对象属性的篡改就可以实现恶意的攻击。

PHP对象在反序列化时,会自动调用如下的魔术方法:

__construct(),类的构造函数

__destruct(),类的析构函数

__call(),在对象中调用一个不可访问方法时调用

__callStatic(),用静态方式中调用一个不可访问方法时调用

__get(),获得一个类的成员变量时调用

__set(),设置一个类的成员变量时调用

__isset(),当对不可访问属性调用isset()或empty()时调用

__unset(),当对不可访问属性调用unset()时被调用。

__

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值