PDA

Orijinalini görmek için tıklayınız : CSRF açığı


Aeknasd145
23-05-2019, 23:14:33
Sitemde csrf açığı çıktı acunetix taramam sonucunda şimdi birkaç sorum var;
1 - CSRF açığı olduğunu nasıl doğrularım yani bu açık çıktısı doğrumu nasıl emin olabilirim
2 - Bu açık ile neler yapabilirim

Sorum oldukça ekleme yapıcam

metehandemir
23-05-2019, 23:18:18
Daha detaylı açıklar mısınız hocam? Web uygulamanız unique csrf mi vermiyor? Yoksa karşılaştırma mı yapmıyor?

kayademir
23-05-2019, 23:19:08
Açığın nerede olduğu önemli, örneğin şifre değiştirme bölümündeyse ve şifre değiştirirken eski şifreyi kontrol etmiyorsanız, adam kendi sitesi üzerinde bir html dosyası oluşturur
action= acıklı adres
value="yenisifre"
gibi daha sonra siz buna authken tıklarsanız adam sizin şifrenizi değiştirebilir.

Otomatize toollar kullanarak tarıyorsanız çok alakasız yerlerde CSRF alabilirsiniz örneğin search parametresinde csrf verir tek yapabileceği şey size sitede kelime arattırmak olur.


Daha önce hackerone üzerindeki bir programda bulduğum bir csrf için hazırladığım HTML şablonu atayım buraya belki çalışma mantığını anlarsınız.



<html><form enctype="application/x-www-form-urlencoded" method="POST" action="https://www.xxx.com/settings/xxx/save/"><br>
<tr><td>hesap id</td><td><input type="text" value="10000577xxx" name="id"></td></tr><br>
<tr><td>yetkilendirilecek id</td><td><input type="text" value="100000704xxx" name="__user"></td></tr><br>
</table><input type="submit" value="Gonder"></form><br></html>

Gizlilik kapsamından dolayı siteyle ilgili bir kısım veriler gizlenmiştir.

Aeknasd145
23-05-2019, 23:20:32
Daha detaylı açıklar mısınız hocam? Web uygulamanız unique csrf mi vermiyor? Yoksa karşılaştırma mı yapmıyor?
csrf koruması yok sitede bu açığın olduğunu söylüyor acunetix, bunun olduğunu nasıl kanıtlarım önce buna cevap alabilirsem iyi olur :)

metehandemir
23-05-2019, 23:21:24
Hocam session_regenerate ile yeni bir "session id" oluşturun ve kullanıcının bu session idsine random csrf atayın gerekirse ipye de kontrol ettirin hatta user agent bilgilerine dahi atayabilirsiniz, bunu veri post edildiğinde kontrol ettirin, güvenli yolları bunlar

Aeknasd145
23-05-2019, 23:21:50
Açığın nerede olduğu önemli, örneğin şifre değiştirme bölümündeyse ve şifre değiştirirken eski şifreyi kontrol etmiyorsanız, adam kendi sitesi üzerinde bir html dosyası oluşturur
action= acıklı adres
value="yenisifre"
gibi daha sonra siz buna authken tıklarsanız adam sizin şifrenizi değiştirebilir.

Otomatize toollar kullanarak tarıyorsanız çok alakasız yerlerde CSRF alabilirsiniz örneğin search parametresinde csrf verir tek yapabileceği şey size sitede kelime arattırmak olur.
hocam linkte get değeri gibi veriyi yazmıyor csrf açığı yok mu? ve şifre değişme vs değil sorgu sistemi tc girip çıktını alıyorsun

metehandemir
23-05-2019, 23:22:26
csrf koruması yok sitede bu açığın olduğunu söylüyor acunetix, bunun olduğunu nasıl kanıtlarım önce buna cevap alabilirsem iyi olur :)
Tüm postlara csrf atamayı deneyin, arkadaşımızın da dediği gibi search box'dan dolayı bile veriyor olabilir bu hatayı

kayademir
23-05-2019, 23:24:10
hocam linkte get değeri gibi veriyi yazmıyor csrf açığı yok mu? ve şifre değişme vs değil sorgu sistemi tc girip çıktını alıyorsun

Mesajımı güncelledim, bir örnek ekledim.
Temel amaç, karşıdaki kişinin oturumunu kullanarak siteye işlem yaptırabilmektir.
O zaman false positive bir değerlendirmedir büyük ihtimal. Yinede incelememi isterseniz özelden çıktıları iletebilirsiniz.




Yine madem bu kadar yazdım daha sonra arama sonuçlarında denk gelen olursa diye bir de çözüm yazayım.
CSRF token oluşturarak ve CSRF tokenlerini karşılaştırarak çözüme ulaşabilirsiniz. Tarayıcılar SOP(Same Origin Policy) kapsamında session bilgilerini direkt olarak çekilmesine izin vermezler.
Yani aslında adam sizden session bilginizi alamaz ama sizin session bilginiz ile işlem yaptırabilir. Düzgün bir şekilde konfigüre edilirse CSRF tokenide alınamaz.
Eğer site php ise input içerisinde value değeri olarak
<?php echo csrf_generate(); ?>
alın ve daha sonra
if(csrf_check($this->input->post('input name')))
şeklinde bir karşılaştırma yapın. Eğer token karşılaştırması sonucu 1 dönmezse işlem yaptırmayın.