Değer niteliğinde bypass htmlspecialchars'dan için XSS saldırısı () fonksiyonu

3 Cevap php

Biz bu formu var, ve kötü amaçlı kod enjekte için bir kullanıcı için olası bir parçasıdır bu altındadır diyelim

...
<input type=text name=username value=
       <?php echo htmlspecialchars($_POST['username']); ?>>
...

Biz sadece bir etiket veya bir javascript koyamazsınız: alert (); değer bir dize olarak yorumlanır ve htmlspecialchars'ın ",", <,> filtreler, böylece biz alıntılarla değerini kapatmak değil çünkü, diyoruz.

Biz tırnak etrafında almak için String.fromCode (.....) kullanabilirsiniz, ancak açılır basit bir uyarı kutusu almak için hala mümkün.

Herhangi bir fikir?

3 Cevap

Ayrıca, insanların (kaynağınız değil) sayfanızın içine HTML veya JavaScript enjekte sağlayan içkin hiçbir güvenlik riski kendisi taşıdığı söz önemlidir. Orada zaten web sayfalarında DOM ve komut dosyalarını değiştirmek için izin tarayıcı uzantıları var, ancak yalnızca istemci tarafı bu yana, onlar bilecek sadece bizleriz.

XSS olur Nerede insanlar onlara izinleri vermek için bir ACL a) istemci tarafı doğrulama veya giriş filtreleme atlamak için kullanabilirsiniz ya da insanlar girdi alanlarını işlemek için kullandığınız zaman b) (örneğin, SEÇENEK etiketleri değerlerini değiştirirken bir sorun olduğunu onlar ) olmamalıdır. Bu saldırılara karşı önlemek için SADECE şekilde dezenfekte ve sunucu tarafında girişi doğrulamak yerine, ya da, istemci tarafı doğrulama ek etmektir.

Eğer HTMLPurifier gibi bir kütüphane kullanabilirsiniz bu durumda belirli etiketleri, izin İSTİYORUM sürece girdi üzerinden HTML koruması için, htmlspecialchars'ın mükemmel yeterli. Eğer HREF, OnClick veya komut dosyalarına izin veren herhangi bir öznitelik kullanıcı girişi yerleştirerek ediyorsanız, sadece sorun için soruyorsun.

EDIT: Eğer niteliklerini alıntı değil gibi koduna baktığımızda, o görünüyor! Bu oldukça saçma. : Birisi olarak adını koyarsak

john onclick="alert('hacking your megabits!1')"

: Sonra komut olarak ayrıştırma

<input type=text name=username value=john onclick="alert('hacking your megabits!1')">

DAİMA nitelikleri tırnak kullanın. Onlar kullanıcı girilen olmasa bile, içine almak için iyi bir alışkanlık.

<input type="text" name="username" value="<?php echo htmlspecialchars($_POST['username']); ?>">

Tek yolu var. Bunu,) (üçüncü kodlama parametresini htmlspecialchars geçirerek veya doğru kodlamayı kontrol etmiyor:

$source = '<script>alert("xss")</script>';
$source = mb_convert_encoding($source, 'UTF-7');
$source = htmlspecialchars($source); //defaults to ISO-8859-1
header('Content-Type: text/html;charset=UTF-7');
echo '<html><head>' . $source . '</head></html>';

Eğer bir) çıkış UTF-7 sayfasını ayarlamak veya b)) açık bir charset set vermeden bir sayfada yani (örneğin iframe yapıyor içine sayfasını kandırmak eğer yalnızca çalışır. Çözüm tüm giriş doğru kodlama ve beklenen kodlama doğru () htmlspecialchars'dan ayarlanmış olduğundan emin olmaktır.

Nasıl çalışır? UTF-7, <> "(iconv uzantısı bakınız) güvencesi için UTF-8 için çıktıyı dönüştürecektir sürece kaçmış değil bu yüzden karakter UTF-8/ISO/ASCII farklı kod noktaları var.

value is a normal HTML attribute, and has nothing to do with Javascript.
Therefore, String.fromCharCode is interpreted as a literal value, and is not executed.

Senaryoyu enjekte etmek için, ilk >'" olmadan yapmak zor olacak, niteliğini kapatmak için ayrıştırıcı zorlamak gerekir.

Sen öznitelik değeri tırnak koymak unuttum, böylece ihtiyacınız olan tüm bir alandır.

Eğer değerini alıntı yapmak bile, yine de savunmasız olabilir; bkz this page.