Вдохновившись рассказом Chikey о том, как он вновь «сломал интернет» Егор прекрати уже ломать все подряд, займись делом каким-нибудь, решил поведать об одной истории с довольно известным за рекой онлайн-казино. Имя этой «организации» не называю, т.к. процентов на 50 уверен, что или совсем не пофиксили, или сделали кривее, чем было до этого. История очень похожа на взлом Егора, за исключением того, что это не совсем рэйс, вернее, совсем не race condition в чистом его виде. Как оно будет полностью не знаю, я больше практик, чем теоретик. Назовем его «conditional race condition» — хоть и масло масляное, но суть отражает верно. Как-то вечером, домашние уснули, по ящику одна муть, наши опять проигрывают делать было особенно нечего, на опенсорс решил на сегодня забить, захотелось чего-нибудь сломать. А что ломать (когда Егор уже все сломал), как не банк какой-нибудь или казино (эго, необходимость иногда почувствовать себя крутым парнем, все дела в общем). Это было одно из первых онлайн-казино, которое мне тогда приглянулось в поиске.
Не секрет, что экономят на программистах, тестировщиках и т.д. Я делаю временами аудиты, да и по роду деятельности такого иногда насмотришься, что волосы дыбом. Но тут-то казино! С возможностью вывода (выигранных) вечнозеленых и т.д. Т.е. контора должна вроде соответствовать. Завел себе аккаунт, и поехали… Как оказалось — здесь тоже сэкономили изрядно. Сначала решил набросить себе немного «виртуальных» денег. Виртуальная валюта там не выводится (чисто поиграть — потренироваться). При беглом просмотре страницы «покупки» (загрузив ее несколько раз) обнаружил там токен, привязанный ко времени (заметен инкремент по модулю 180), отправляющийся с капчей после нажатия «Order». Вероятно в базу для моего аккаунта писался еще и datetime времени «покупки» (чтоб значит только раз в сутки), но нам оно сейчас без надобности. Я хотел сначала попробовать чистый race (я не настолько глуп чтобы поверить про 3-и минуты, ну или 1.5 минуты если используют формулу со смещением), но у меня были сомнения, что нет даже нескольких миллисекунд, т.е. с высокой долей вероятности этот токен скорее всего тоже помечался как использованный в DB, чтобы значит совсем «до завтра» (кстати, так оно и оказалось впоследствии).
В результате решил начать пробовать сразу со своего «условного рэйс». Предположим, что токен пишется в базу int-ом (типа unixtime — т.е. целым числом), ведь они исходят из того, что следующий токен выдадут только через 3 минуты (хотя обычно оно все-таки с каким либо смещением, чтобы даже на границе срок действия его уже истек). Тут немного техники: я не люблю штуки вида Greasemonkey и ко, хоть и юзаю иногда. Но не люблю (мало что ли таких как Егор). Много можно сделать и из dev консоли firefox-а, но так, по мелочи. Я так тоже довольно редко «работаю». У меня есть собственный (ну почти) плагин, разворачивающий «полноценный» интерпретор тикля (tcl) с api к javascript текущего окна. Типа greasemonkey, только на тикле. Т.е. для каждой новой сдублированной формы делаем значение ordertoken в виде числа с плавающей точкой. Догадливый читатель уже, наверное, понял что происходит. Что там они проверяли, affected rows или просто if begin…
SQL ли это вообще, я не в курсе но в очередной раз исполнив скрипт, я стал таки «виртуальным» миллионером! Если сравнение T1 с T2 происходит целочисленно (в int) то они равны, если как float (что случается если не уследить в некоторых алгоритмах или системах или явно не указать) — то они разные! После сравнения — токен T2 легальный, и что не менее важно токен T2 не был еще использован — происходит увеличение остатка денег (платеж состоялся), а T2 переписывает T1 (токен использован), при этом он обрезается до целого если нет precision overflow. 180. И стандартным уже рэйс все повторяется снова и снова. Пока токен не устареет ну или пока время не выйдет… Постоянное же увеличение float-токена (как у меня в скрипте), позволяет «предотвратить» ситуацию, когда токен хранится все-таки не целочисленно, но проверка его в формуле «легальности» токена осуществляется все-же целочисленно, а проверка «токен изпользован» по какой-либо причине как float. Как вы думаете, как долго сайт продержался с реальным платежом? День (да и то потому, что уже баиньки хотелось очень). Там, конечно, не было time casino-real-order 50000, да и думаю, что такое они заметили бы на раз-два. Ну какой-то же мониторинг средств (читерства и т.д.) должен все-таки быть. Хоть и с десятью тысячами клиентов. Но 50 по 20 я таки исполнил разок (т.е. заплатив «всего» 20 вечнорастущих, т.к. на тот момент это была минимально-возможная оплата). Справедливости ради, надо сказать, что я естественно закрыл этот аккаунт без вывода средств, вернув только свои вложеные деньги. Тут вроде и обсуждать нечего. Единственное, что могу добавить — чистый race condition там не работал, я проверял (второй параллельный вызов выдавал «уже использован»). Но судя по «профессионализму» ребят — это была скорее защита от дурака (типа F5 после реквеста и т.д.).
У современных сайтов с азартными развлечениями адаптивный дизайн, то есть их легко можно запускать как через браузер на ПК, так и на смартфоне. Но часто посетители выбирают бесплатные приложения, так как это дает преимущества: удобный интерфейс, защищенное соединение, офлайн-доступ к контенту. Операторы выпускают 2-3 программы: одну для смартфонов с операционной системой iOS, другую — для Android, третью — для Windows Phone. Скачав бесплатное приложение казино с игровыми автоматами на Айфон на реальные деньги, пользователи получают доступ ко всему контенту без ограничений. Количество тайтлов будет таким же, как и в браузерной версии. Посетителям доступны все подборки («Популярное», «Новинки», «Рекомендованное»), а также фильтры. Они могут сделать с телефона ставки в слотах, карточных, настольных и live-играх от популярных провайдеров. Все топовые лицензированные производители разрабатывают автоматы на HTML5, поэтому они доступны как на ПК, так и смартфонах, планшетах. Старые популярные слоты (требующие установки Flash Player) тоже уже перезапущены в современном формате. Демонстрационная позволяет делать бесплатные ставки без риска.