HTTP
Parameter Pollution(HTTP parametre kirliliği) aslında uzun zamandır
mevcut olan, ancak web uygulama güvenliğindeki önemi son yıllarda
anlaşılan bir yöntemdir. HPP’nin ne kadar tehlikeli olabileceği OWASP
AppSec EU 2009’da Luca Carettoni ve Stefano di Paola tarafından
gösterilmiştir. Yakın zamanda Yahoo Mail’de bulunan HPP kaynaklı açık da
tehlikeyi doğrular niteliktedir.
Bir
URI’ da aynı parametre isminin birden fazla geçmesi durumunda nasıl
yorumlanması gerektiğiyle ilgili bir standart olmamasından dolayı farklı
platformlarda farklı yaklaşımlar görülmektedir.
HPP, bu farklı
yaklaşımların, uygulama geliştiricileri tarafından göz ardı edilmesi ya
da bilinmemesinden dolayı uygulamada ortaya çıkabilecek istenmeyen
durumların istismar edilmesidir. HPP doğrudan sunucu taraflı
saldırılarda kullanılabileceği gibi kullanıcıları da hedef alabilir.
URI’ da aynı parametre isminin birden fazla geçmesi durumunda nasıl
yorumlanması gerektiğiyle ilgili bir standart olmamasından dolayı farklı
platformlarda farklı yaklaşımlar görülmektedir.
HPP, bu farklı
yaklaşımların, uygulama geliştiricileri tarafından göz ardı edilmesi ya
da bilinmemesinden dolayı uygulamada ortaya çıkabilecek istenmeyen
durumların istismar edilmesidir. HPP doğrudan sunucu taraflı
saldırılarda kullanılabileceği gibi kullanıcıları da hedef alabilir.
Sunucu Taraflı HPP Örneği:
Örnek
olarak kullanıcı doğrulamasını yerel bir servisi kullanarak yapan basit
bir web uygulamasını ele alalım. Hem servis hem de web uygulaması PHP
kullanıyor olsun.
olarak kullanıcı doğrulamasını yerel bir servisi kullanarak yapan basit
bir web uygulamasını ele alalım. Hem servis hem de web uygulaması PHP
kullanıyor olsun.
Uygulama tarafındaki örnek PHP kodu(hpp1.php):
<?php
$url = “http://localhost/hpp12.php?action=verify&username={$_GET[‘username’]}”;
echo file_get_contents($url);
?>
Uygulama
GET ile gelen kullanıcı adını kullanarak dinamik olarak bir url
oluşturup kullanıcı adını doğrulamaya çalışıyor. (Olayı basitleştirmek
adına parametre olarak sadece kulanıcı adı ve komut kullanılmıştır.)
GET ile gelen kullanıcı adını kullanarak dinamik olarak bir url
oluşturup kullanıcı adını doğrulamaya çalışıyor. (Olayı basitleştirmek
adına parametre olarak sadece kulanıcı adı ve komut kullanılmıştır.)
Yerel Servis(hpp2.php):
<?php
echo “{$_GET[‘action’]} – {$_GET[‘username’]}”;
?>
Bu
senaryodaki sorun Apache PHP sunucusunun aynı HTTP parametresinin
URL’de en son görünen değerini kullanmasıdır.
“http://localhost/hpp1.php?username=newuser” isteğine
senaryodaki sorun Apache PHP sunucusunun aynı HTTP parametresinin
URL’de en son görünen değerini kullanmasıdır.
“http://localhost/hpp1.php?username=newuser” isteğine
dönen cevap “verify – newuser” şeklindedir. Ancak action parametresi için HPP uygulandığında
“http://localhost/hpp1.php?username=newuser%26action=add”
isteğine dönen cevabın “add – newuser” şeklinde olduğu görülmektedir.
Bu yöntem sadece GET metodunda değil aynı zamanda POST metodu ve HTTP
COOKIE için de geçerlidir.
isteğine dönen cevabın “add – newuser” şeklinde olduğu görülmektedir.
Bu yöntem sadece GET metodunda değil aynı zamanda POST metodu ve HTTP
COOKIE için de geçerlidir.
Sunuculara göre HPP davranışları tablosu
HPP ile WAF Atlatma:
Tabloda
da görüldüğü üzere bazı sunucular aynı isimdeki parametrelerin
değerlerini birleştirerek uygulamaya iletirler. Böyle bir durumda başka
bir saldırı yöntemine ait payloadı bölerek WAF, IPS atlatmak mümkün
olabilir.
da görüldüğü üzere bazı sunucular aynı isimdeki parametrelerin
değerlerini birleştirerek uygulamaya iletirler. Böyle bir durumda başka
bir saldırı yöntemine ait payloadı bölerek WAF, IPS atlatmak mümkün
olabilir.
ASP.NET/IIS örneğini ele alalım.
“/list.php?id=10‘ union select null,null,user,pass from users–” şeklinde bir sqli payloadını
sunucuya “/list.php?id=10’ union select
null&id=null&id=user&id=pass from users–” şeklinde ileterek
filtreleri atlatmak mümkün olabilir. Örnekler çeşitlendirilebilir.
sunucuya “/list.php?id=10’ union select
null&id=null&id=user&id=pass from users–” şeklinde ileterek
filtreleri atlatmak mümkün olabilir. Örnekler çeşitlendirilebilir.
Kullanıcı taraflı HPP Örneği:
Örnek sayfa:
<?
$param = htmlspecialchars($_GET[‘param’], ENT_QUOTES);
echo “<a href=”/target_page.php?action=view¶m={$param}”>Sayfayı Göster</a>”;
?>
Örnek
php betiğinin normal şartlarda kullanıcıya hedef sayfayı
görüntülemesini sağlayacak bir link oluşturması beklenir. Hatta XSS’ye
karşı htmlspecialchars kullanılarak önlem alınmıştır. Ancak kullanıcı
sayfaya “http://localhost/hpp2.php?param=s1” yerine “http://localhost/hpp2.php?param=s1%26action=delete” şeklinde ulaşırsa örnek betik hedef sayfayı görüntülemek yerine silmeye yarayabilecek bir link oluşturmuş olur.
php betiğinin normal şartlarda kullanıcıya hedef sayfayı
görüntülemesini sağlayacak bir link oluşturması beklenir. Hatta XSS’ye
karşı htmlspecialchars kullanılarak önlem alınmıştır. Ancak kullanıcı
sayfaya “http://localhost/hpp2.php?param=s1” yerine “http://localhost/hpp2.php?param=s1%26action=delete” şeklinde ulaşırsa örnek betik hedef sayfayı görüntülemek yerine silmeye yarayabilecek bir link oluşturmuş olur.
HPP yine kullanıcı taraflı saldırılarda XSS filtrelerini atlatmak için payloadı parçalamak amacıyla kullanılabilir.
HPP
örneklerde de görüldüğü üzere gerek kendi başına gerekse başka saldırı
yöntemleriyle birleştirildiğinde tehlikeli olabilecek bir saldırı
yöntemidir.
Onur ALANBEL<onur.alanbel@bga.com.tr>
örneklerde de görüldüğü üzere gerek kendi başına gerekse başka saldırı
yöntemleriyle birleştirildiğinde tehlikeli olabilecek bir saldırı
yöntemidir.
Onur ALANBEL<onur.alanbel@bga.com.tr>