运气真不错 牛市来了 服务就让人盯上了 教训很深刻 50w
的学费.
服务代买使用 php
CI框架 写的. 最近线上服务器出现错误
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP Fatal error: DISEVAL - Use of eval is forbidden in /data/release/project/system/View/Parser.php(526) : eval()'d code on line 1
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP Stack trace:
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 1. {main}() /data/release/project/public/index.php:0
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 2. CodeIgniter\CodeIgniter->run() /data/release/project/public/index.php:46
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 3. CodeIgniter\CodeIgniter->handleRequest() /data/release/project/system/CodeIgniter.php:203
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 4. CodeIgniter\CodeIgniter->runController() /data/release/project/system/CodeIgniter.php:248
[2019-05-15 22:03:21]127.0.0.1
content: [15-May-2019 22:03:21 Asia/Shanghai] PHP 5. App\Controllers\Member->emailActivate() /data/release/project/system/CodeIgniter.php:713
运维同学通过 nginx
日志及logtail
最后定位到 一个对外的api接口. 该接口uri中参数通过 base64 加密并通过 serialize 函数序列化.
服务端接收参数后 解base64
然后在使用 unserialize
反序列化.
正常来看实际没什么问题. 但 由于反序列化的特性 unserialize
— 从已存储的表示中创建 PHP 的值 这个php值 可以杀死对象.
经过测试 反序列化可以在已知条件下调用所有项目中存在的所有方法.
黑客 发现漏洞后 通过大量测试 , 得知当前框架, 直接就可以开始行动了
经过观察 近一周的试探及数据收集 在凌晨黑客开始对服务器进程数据篡改.
问题查找比较费劲 主要问题在于 反序列化的数据解出来可能是 php对象 真实厉害呀 会触发析构及其他魔术方法.
举个栗子 :
// 序列化对象 Ci 默认数据库配置
public function se()
{
$class = new Config/Database();
$classStr = serialize($class);
echo base64_encode($classStr);
}
// 解包
public function uns()
{
$a = $_POST['a'];
try {
$ser =$a;
$class = unserialize( base64_decode($ser));
}catch (\Exception $e){
var_dump($e->getMessage());
}
var_dump($class);
}
总结下:
线上禁用 unserialize
方法, 防止反序列化注入, 形成webshell
通过反序列化 调用 Ci 生成模板缓存的方法, 实现消息回包. 实际上代码以上可以全部获取 接收回包的方式