Wpis z mikrobloga

Może ktoś wyjaśnić mi ostatni problem z bezpieczeństwem w PHPMailerze?

Dlaczego wpisanie w skrypcie czegoś podobnego do:
popen(escapeshellcmd('sendmail -f' . escapeshellarg($_POST['nadawca'])), 'w');
zamiast prawidłowego
popen('sendmail -f' . escapeshellarg($_POST['nadawca']), 'w');
czyli niepotrzebne przepuszczenie przez escapeshellcmd umożliwia uruchomienie sendmaila z argumentami innymi niż -f? Co takiego robi escapeshellcmd, że escapeshellarg staje się nieskuteczny?

Dla wejścia "Attacker\' -Param2 -Param3"@test.com
powstaje ciąg, który /bin/sh interpretuje jako:
- nazwa programu do uruchomienia sendmail
- pierwszy argument -f\"Attacker\\
- drugi argument -Param2
- trzeci argument -Param3"@test.com'
czyli użytkownik może dodawać dowolne argumenty, a nie:
- nazwa programu do uruchomienia sendmail
- pierwszy argument -f"Attacker\' -Param2 -Param3"@test.com

#php #programowanie #shell #bash #linux
  • 3
@canto: To jest proste, interesuje mnie bardziej https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html - escape jeden raz daje bezpieczny do wstawienia wewnątrz polecenia shellowego ciąg oznaczający ustawienie wartości argumentu, escape dwa razy (gdzie autor myśli, że robi jeden raz) już niebezpieczny. Przypuszczam, że ma to coś wspólnego z fragmentem w dokumentacji: ' and " are escaped only if they are not paired, escape'owanie nie jest więc prostą zamianą np. ' na \', gdzie wykonanie go