一.反序列化漏洞的介绍
当用户的请求在传给反序列化函数 unserialize()之前没有被正确的过滤时就会产生漏洞。因为
PHP 允许对象序列化,攻击者就可以提交特定的序列化的字符串给一个具有该漏洞的 unserialize
函数,最终 导致一个在该应用范围内的任意 PHP 对象注入。
反序列化漏洞出现需要满足两个条件:
1. unserialize 时参数用户可控
2. 参数被传递到方法中被执行,并且方法中使用了危险函数。
什么是危险函数?比如 php 代码执行函数、文件读取函数、文件写入函数等等。
代码演示:
<?php
class Test{
var $free = "demo";
function __destruct(){
//_destruct()函数中调用 eval 执行序列化对象中的语句
@eval($this->free);
}
}
$free = $_GET['free'];
$len = strlen($free)+1;
//构造序列化对象
$ser = "O:4:\"Test\":1:{s:4:\"free\";s:".$len.":\"".$free.";\";}";
// 反序列化同时触发_destruct 函数
$xuegod = unserialize($ser);
?>
用户提交的参数作为序列化后的字符串参数,进行反序列化时触发__destruct()魔术方法,而
魔术方法中使用危险函数 eval(),$this->free 可以调用对象中的 free 属性,所以使 $free =
"phpinfo();"; 而 @eval($this->free); 则执行 free 属性中的 php 代码。

浏览器访问URL:http://192.168.112.12/free.php

这里不用加分号因为代码里面自带了。

这就导致敏感信息泄露:
PHP Version 5.4.16 |
System | Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 |
Build Date | Apr 1 2020 04:08:16 |
Server API | Apache 2.0 Handler |
Virtual Directory Support | disabled |
Configuration File (php.ini) Path | /etc |
Loaded Configuration File | /etc/php.ini |
Scan this dir for additional .ini files | /etc/php.d |
Additional .ini files parsed | /etc/php.d/curl.ini, /etc/php.d/fileinfo.ini, /etc/php.d/gd.ini, /etc/php.d/json.ini, /etc/php.d/mysql.ini, /etc/php.d/mysqli.ini, /etc/php.d/pdo.ini, /etc/php.d/pdo_mysql.ini, /etc/php.d/pdo_sqlite.ini, /etc/php.d/phar.ini, /etc/php.d/sqlite3.ini, /etc/php.d/zip.ini |
PHP API | 20100412 |
PHP Extension | 20100525 |
Zend Extension | 220100525 |
Zend Extension Build | API220100525,NTS |
PHP Extension Build | API20100525,NTS |
Debug Build | no |
Thread Safety | disabled |
Zend Signal Handling | disabled |
Zend Memory Manager | enabled |
Zend Multibyte Support | disabled |
IPv6 Support | enabled |
DTrace Support | disabled |
Registered PHP Streams | https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip |
Registered Stream Socket Transports | tcp, udp, unix, udg, ssl, sslv3, tls |
Registered Stream Filters | zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk |
This program makes use of the Zend Scripting Language Engine: Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies |
这就是简单的反序列化漏洞演示。
注意:在URL中:空白字符1可以用%00和/00来表示。