基于MySQL的Phar反序列化
背景
一直都知道MySQL
可以的LOAD DATA LOCAL INFILE
可以触发反序列化漏洞
但是都没有自己做过实验
现在跟进一下
变量
主要分为两组
关于MySqli
的测试,可以基于网上的脚本Rogue-MySql-Server-master
至于PDO
的测试需要自己分析数据,写个脚本即可
MySqli测试
首先还是尝试一下简单的文件读取
前置参数的设置
mysql.ini
无关紧要,如果在本地测试,如下

需要打开
local-infile=1
secure_file_priv=""
php.ini
必要参数,此参数非默认参数,所以想要通过mysqli
触发phar
已基本不可能
mysqli.allow_local_infile = On

测试文件读取
本地测试
直接使用查询,依赖于mysql.ini
的配置

脚本测试
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php namespace app\controller;
use app\BaseController;
class Index extends BaseController { public function test() { $m = mysqli_init(); mysqli_options($m, MYSQLI_OPT_LOCAL_INFILE, true); $s = mysqli_real_connect($m, 'localhost', 'root', '123456', 'test', 3307); $p = mysqli_query($m, 'select version();'); } }
|
成功读取

测试反序列化
脚本测试

结论
需要php.ini
的硬性支持,基本不存在
PDO测试
PDO
不依赖于php.ini
中的mysqli
的配置
但是PDO
默认禁用掉了本地文件读取
但是和mysqli
不一样的是,不需要修改配置文件,可以通过代码软加载
前置条件
必须,可以通过代码添加
PDO::MYSQL_ATTR_LOCAL_INFILE => true
不添加配置结果

开启预编译的PDO
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?php namespace app\controller;
use app\BaseController; use PDO;
class Index extends BaseController { public function test() { $user = "root"; $pass = "123456"; try { $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( PDO::MYSQL_ATTR_LOCAL_INFILE => true )); $row = $dbh->query('SELECT version();'); var_dump($row); $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } } }
|
可以看到,数据是和mysqli
一致的

成功读取

反序列化测试

关闭预编译操作的PDO
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <?php namespace app\controller;
use app\BaseController; use PDO; use think\facade\Db;
class Index extends BaseController { public function test() { $user = "root"; $pass = "123456"; $id = 1; try { $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( PDO::MYSQL_ATTR_LOCAL_INFILE => true, PDO::ATTR_EMULATE_PREPARES => false )); $pdo = $dbh->prepare('SELECT * from users where id=:id;'); $pdo->bindParam ( ':id', $id); $pdo->execute(); var_dump($pdo); $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } } }
|
多了几条

自己写下交互
成功读取文件

成功触发反序列化

end
至于为什么要做这个当然是遇到真实环境啦