Security Scan On Sitesi

5 Cevap php

Geçenlerde ben çalışmak sitelerinden birine karşı bir güvenlik denetim çalışması vardı. Bu Acunetix Web Vulnerability Scanner ile yapıldı. Bu benim yoluyla sıralama ediyorum sonuçların bir grup ile geri geldi.

XSS hit bir sürü geldi, ama onlar yanlış pozitif ya da değil ise emin değilim.

Kod gibi:

if(isset($_GET['variableNameX']))
    $var_to_use_in_app = mysql_escape_string(trim($_GET['variableNameX']));

XSS açık olarak geri geliyor. QueryString XSS potansiyel açık olarak geri geleceğim ile herhangi bir sayfa, ya da ben bu sunucu tarafında işleme olduğumu bilecek kadar akıllı?

Yardımlarınız için teşekkürler.

5 Cevap

Acunetix iyi bir araçtır ama Uygulaması Penetrasyon Testi tabanlı kılavuzu yerine DEĞİLDİR. Bu potansiyel patlatır üzerinden takip etmek mantığı yok .....

Kesinlikle bankalarda kullanılan ve ben işin biçimsel bit yapmak için (kabul edilmiş) Teklif bunu tavsiye ettik. Dinamik olarak oluşturulan sayfalar ve bütçe / zaman bir husustur çok var oldukça karmaşık App varsa, Acunetix veya App potansiyel sıcak noktalar yönde bir işaret için benzer bir araç ile kapalı çizme olacaktır. Daha sonra manuel yollarla bu alanlarda odaklanabilirsiniz - Bu manuel test veya kod boyunca adım olsun. Lütfen Kalem Testi evlerin çizgili kazanmak yerdir.

Müşteriler sadece büyük App iyice geçmesi için kaynak yok.

Oh, ve akılda yanlış pozitif bir sürü var.

HTML sorgu dizesi parametresi içine geçirilmektedir Eğer sayfada göstermek mi? Eğer öyleyse, bu bir yanlış pozitif değildir.

In other words, if you pass have something like this: http://www.example.com/?myVar=Test

And you display the results of myVar on your page without testing for HTML/Script, then it is possible someone might change it to this: http://www.example.com/?myVar=<b>Test</b&gt;

Or something along these lines: http://www.example.com/?myVar=<script>+doSomethingBad()+</script> (probably encoded...but you get the idea)

$ Var_to_use_in_app = mysql_escape_string (($ _GET ['variableNameX']) Döşeme);

Bu genellikle yapmak için yanlış bir şey. Uygulamanızda dahili kullanılan dize her zaman düz metin sürümü olmalıdır. Sonra da dize manipülasyon hiçbiri kıracak daha emin olabilirsiniz, ve sayfaya yanlış bir şey çıktısı olmayacaktır.

Örneğin, sunulan dize olsaydı:

O'Reilly

mysql_escape_string bunu kaçacak:

O\'Reilly

hangi HTML sayfası için bu dizeyi çıktı zaman, aptal olmazdı. Sonra tekrar gönderilen bir form alanı için outputted Ve eğer tekrar düzenlenmiş ise dört, sekiz dönüşecekti iki blackslashes, dönüşecekti ki, another ters eğik olsun ... ve istiyorum değil uzun tersbölülerden yüzlerce oluşan dizeleri var. Bu kötü magic_quotes açık özelliği ile kötü yazılmış CMSS ve sunucularda yaygın olarak görülen bir sorundur.

Eğer bir veritabanı sorgu koymak için adının ilk iki harfini almak istedim, altdizesine snip ediyorum:

O\

ve daha sonra sorgu içine birleştirmek:

SELECT * FROM users WHERE namefirst2='O\';

hoppala, sözdizimi hatası, bu dize şimdi sonlandırılmamıştır olduğunu. Önceden kaçtı dizeleri dize işleme Türevleri gibi kolaylıkla güvenlik sıkıntı içine alabilirsiniz.

Bu yaklaşım yerine, size SQL veya HTML bir sınırlanmış değişmez bunları birleştirmek son çıkış aşaması hariç her yerde uygulamanızda basit çıkmamış metin dizeleri olarak dizeleri tutmak. SQL için:

"SELECT * FROM users WHERE name='".mysql_real_escape_string($name)."';"

Genel olarak her zaman 'gerçek' bir sürümünü kullanmanız gerekir böylece düz eski mysql_escape_string, ANSI SQL_MODE seti ile Doğu Asya karakter setleri ve bağlantıları / veritabanları gibi bazı köşe durumlarda başarısız - 'gerçek' işlev adını not edin.

Sen mysql_real_escape_string gibi aynı ama bu biraz daha az çirkin yapmak için kısa bir ad (örn. m ()) olan bir fonksiyon tanımlayabilirsiniz. Ya da, daha iyi, mysqli yıllardan parameterised queries bakmak.

HTML, öncelemeli htmlspecialchars () işlevi kullanılarak yapılmalıdır:

<div id="greeting">
    Hello, Mr. <?php echo htmlspecialchars($name); ?>!
</div>

Sen echo (htmlspecialchars ()) yok ama bu biraz daha az çirkin yapmak için kısa bir ad (örn. h ()) olan bir fonksiyon tanımlayabilirsiniz.

Htmlspecialchars çağrısı cevapsız varsa, o zaman tarayıcı sitenizin XSS karşı savunmasız olduğunu söylüyorum kesinlikle doğrudur. Ama hemen hemen her PHP programcısı aynı hatayı yapar, çok kötü hissetmiyorum.

mysql_ [real_] escape_string '"', HTML metin patlak karakterler, çünkü burada hiç size yardımcı '&', '<' ve, nitelikleri de değil. Bunların hiçbiri özeldir SQL dizesi değişmezleri, yani mysql_escape_string tüm bunları değmeyecek bir kötü niyetli.:

<script>alert("I'm stealing your cookies! "+document.cookie);</script>

: Sadece kaçtı alır

<script>alert("I\'m stealing your cookies! "+document.cookie);</script>

Hangi kadar güvenlik söz konusu olduğunda, hiçbir yardımcı olmaktır.

Bu genel durumda denklik problem çözme gerektiren beri, sunucu tarafında idare ediyorsun o özel aracı biliyorum, ama bu "bilmek" olduğunu onun çok olası değil. Bunun yanında, araç bile mysql örneğine erişim var mı? nasıl bileyim?

Kullanmış olduğunuz araçları bir sürü yanlış pozitif geri gelecektir. Bu gerçek kod denetim eğer o potansiyel bir güvenlik açığı ve daha sonra basılmış olan olmasa bile bir $ _GET veya $ _POST değişkeni normal bir değişkene atanmış olan zaman iade olabilir.

Sadece her şeyi kontrol etmelisiniz güvenli ve hiçbir şey varsayarak bir yanlış pozitif için.