MySQL 客户端触发读文件在PHP版本下的校验
date
Nov 18, 2021
slug
mysql-readfile-check-php
status
Published
tags
安全研究
PHP安全
summary
挖漏洞的时候突然想到这个点,想去测试一下,去探究一下到底在哪个版本这个东西被修复了,就无法触发读文件/反序列化了
type
Post
用的Mysqlist这个工具进行检验
测试demo:
<?php
class A {
public $s = '';
public function __wakeup () {
echo "pwned!!";
}
}
$m = mysqli_init();
mysqli_options($m, MYSQLI_OPT_LOCAL_INFILE, true);
$s = mysqli_real_connect($m, '127.0.0.1', 'root', '123456', 'test', 8887);
$p = mysqli_query($m, 'select 1;');
// file_get_contents('phar://./phar.phar');
众所周知,在PHP中,如果伪造的mysql服务可以让客户端读取本地文件,还可以让其读取phar连接的内容,来实现反序列化,只需要把file:///etc/passwd 改成 phar://xxx.phar 即可
这个文章测试一下在哪个版本下还能使用这个攻击
普通客户端5.7.29
可以触发(随便输密码):
PHP 5.6
PHP 7.0.33
PHP 7.2.34
此时变成Not_Found,不可读了
PHP 7.3.25
同样的结果,也不可读了
总结
PHP7.2 版本以后(包括7.2),这个攻击手法不再有效果了