当前位置:首页 > 黑客服务 > 正文内容

Laravel漏洞CVE-2021-3129分析

访客4年前 (2021-04-15)黑客服务909

0x01 前言

最近在搭建复现CVE-2021-3129踩了一些坑,在这边记录一下。顺便拓展下利用编码控制文件内容的一些姿势。

0x02 从hitcon2018的One Line PHP Challenge看CVE-2021-3129

希望直接看环境搭建和exp的可以先跳过~

其实当时在写这个漏洞POC的时候,就发现这个漏洞给我一种似曾相识的感觉,就是当年hitcon的这个经典CTF题。

区别在于one-line-php-challenge这题是通过写入session文件利用文件包含getshell。而CVE-2021-3129则是通过控制laravel.log最终反序列化执行命令。

共同点则在于都是利用编码转换清除内容,令写入的文件内容绕过特定或者冗余数据的限制。

One-line-php-challenge

赛题可以说是很简洁明了了。

通过Get传入orange参数作为文件名,系统将该文件的前6个字符与@<?php比较,若匹配则包含这个文件。
当时的条件是

  • 通过?PHP_SESSION_UPLOAD_PROGRESS控制?session 文件

  • 文件的开头必须是?@<?php

  • 这个文件是以?upload_progress_?开头的,不能直接包含,需要控制这个开头。

base64编码绕过

首先了解下base64编码。

base64编码表为:0-9,26个英文小写字母a-z,26个英文大写字母:A-Z,除此之外还有额外两个字符"+"和"/"

如果遇到非编码表中的字符则会绕过。

可以看到如",,,,"被base64解码忽略

这边我们需要绕过的文件开头为upload_progress_,只要令其最终解码为非编码表内容即可。

"upload_progress_"为16位字符。可被base64解析为14个字符,所以我们需要补两个字符。假设补充字符为"zz",则base64 decode后结果为3个可解析字符,我们需要fuzz两个字符,令其第一次解码后存在四个编码表内容,且这四个字符base64解码后的内容均不在编码表中。其中"ZZ"满足条件。

构造编码

已知我们需要三次解码才能绕过文件开头,所以将我们写入的内容编码三次即可。最后再三次解码即成功绕过。

实际题目中利用php伪协议三次base64解码判断绕过文件头,成功写入的webshell文件。

然后我们再来看CVE-2021-3129

0x03 环境build

影响范围

Laravel <=8.4.2

Ignition <2.5.2

docker搭建

目前vulhub在dockerhub上并无现成的镜像可以pull。如果后续增加了可以直接pull vulhub的Laravel镜像。

vulhub给了dockerfile

composer 的安装包网址是国外镜像,这边换成阿里的镜像源

构建镜像起容器。

访问8080端口如下则环境构建完毕。

0x04 分析

漏洞点

在Ignition(<=2.5.1)中,默认提供了一些solutions,其中可以通过MakeViewVariableOptionalSolution的file_get_contents()的可控参数利用phar伪协议反序列化。

通过控制器调用MakeViewVariableOptionalSolution传入可控parameters参数。

测试phar反序列化

显然如果存在一个可控的上传点,可以触发反序列化执行命令。

使用phpggc生成序列化利用POC

https://github.com/ambionics/phpggc

我这边将phar.log放到服务的/var/www/storage/logs路径下。

尝试反序列化成功执行命令

利用laravel.log实现phar反序列化

利用这边的file_put_contents 使用php伪协议php://filter/write达到控制log内容的效果。

首先要想利用laravel.log,清空log内容。可能会想到一直base64 decode。直到都为不可见字符解码清空。但是这个做法会有问题。因为base64在解码的时候如果等号后面还有内容则会报错。

这边大佬的做法是utf-8转utf-16 然后quoted-printable编码 然后utf-16转utf-8 完成上述操作后log中所有字符转为不可见字符,最后base64 decode即可。

利用报错写入laravel.log

给Log增加一次前缀

phpggc生成序列化利用POC

log文件转换为phar文件

利用phar伪协议反序列化

0x05 Exploit

效果如下:

0x06 参考

https://xz.aliyun.com/t/9030

https://www.ambionics.io/blog/laravel-debug-rce?

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:http://therlest.com/106605.html

分享给朋友:

“Laravel漏洞CVE-2021-3129分析” 的相关文章

贾秀东个人资料简介(简历及图片)

贾秀东人物概况 本页面提供了贾秀东个人资料简介(简历及图片),贾秀东是谁?贾秀东个人简介资料完整设计了网页求职找工作编辑个人简历作品所需要的贾秀东网站常用模板元素,不保证贾秀东人物数据真实,任何问题请联系管理员调整。 贾秀东图片 贾秀东个人资料简介 贾秀东,中国国际问题研究所特聘研究员。1...

身份证信息被黑客盗取(黑客能把手机内身份证信息盗取吗)

一、身份证信息被黑客盗取(黑客能把手机内身份证信息盗取吗)方法总结 1、黑客通过手身份姓名能否窃取别人银行卡里。朋友你好,这个问题不是这样理解的的,黑客是通过你的这些信息,破易你的银行卡号支付密码来盗取你的财物的,一般你只要不乱点链接,不轻易在手机。黑客控制了手机,窃取了身份证号码手机号姓名等所有...

古文化常识(中国古代文化常识大全)

1.中国古代文化常识 文学常识? 四本书:《论语》、《中庸》、《孟子大学》 五经:《诗经》《礼记》《周易》《春秋》 乐府双壁:木兰诗孔雀东南飞 三个字:警告世界,说真话,说真话,唤醒世界,说同样的话 第二枪:第一枪很厉害,第二枪也很厉害 三官:石渠官、潼关官、新安官 三次告别:新婚、老...

铁盖子可以放入高压锅蒸吗?装酱料的铁盖子,外面的涂层有些剥落,好

铁盖子可以放入高压锅蒸吗?装酱料的铁盖子,外面的涂层有些剥落,好 铁盖子可以放入高压锅蒸吗? 装酱料的铁盖子,外面的涂层有些剥落,好象也没锈,可以拿它盖严瓶子入高压锅蒸吗? 绝对不行!既危险又不卫生。盖住的瓶子在高压锅中加热,很容易形成压力差而爆炸;铁在高压锅中的水蒸汽作用下极易变成四氧化三...

查房网(查看房屋网的网站数据下载)

春节来临之际,查看房屋网官网2000w百度盘数据下载软件登录,有多少信息站在线签约?awSxnn北京市不动产登记信息网上查询服务于3月20日上线。 一、查房网官方网址 查房网查询的。当地建委(建设局)在房产交易大厅,可以凭身份证免费查看自己名下的房产信息。 二、查房网2000...

查开放房软件app(免费查开放房的软件)

  你仅仅坚持不懈和女孩儿入睡。假如你发觉仅有大家2个,你应该坚持不懈再开一个。可是你的迟疑说明你還是想和他发生关系。留意防护措施。   线上查询对外开放门户网应用软件,并查询对外开放门户网应用软件系统软件下载   在哪儿申请办理公共性租用住宅?   我与男友在网络上了解的。我北京市找他。他为我开过...

评论列表

弦久十驹
3年前 (2022-06-07)

~其实当时在写这个漏洞POC的时候,就发现这个漏洞给我一种似曾相识的感觉,就是当年hitcon的这个经典CTF题。区别在于one-line-php-challenge这题是通过写入session文件利用文件包含getshell。而CVE-2021-3129则是通过控制

晴枙桃靥
3年前 (2022-06-07)

调用MakeViewVariableOptionalSolution传入可控parameters参数。测试phar反序列化显然如果存在一个可控的上传点,可以触发反序列化执行命令。使用phpggc生成序列化利用POChttps://githu

笙沉桔烟
3年前 (2022-06-07)

字符。可被base64解析为14个字符,所以我们需要补两个字符。假设补充字符为"zz",则base64 decode后结果为3个可解析字符,我们需要fuzz两个字

可难眉妩
3年前 (2022-06-07)

3129希望直接看环境搭建和exp的可以先跳过~其实当时在写这个漏洞POC的时候,就发现这个漏洞给我一种似曾相识的感觉,就是当年hitcon的这个经典CTF题。区别在于one-line-php-challenge这题是通过

礼忱苍阶
3年前 (2022-06-07)

.aliyun.com/t/9030https://www.ambionics.io/blog/laravel-debug-rce?

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。