#ruby #slqi
Только посмотрите, как круто в коде RubyOnRails выглядит SQLi в ORDER BY:
Т.е. Active Record Query Interface после такого вызова построит следующий запрос:
, где #{params[:first_name]} - это user input.
Метод .order() не фильтрует и не экранирует получаемые данные. А значит, в таком случае мы легко можем раскрутить Blind SQLi c подзапросом вроде:
, где дальше можно крутить Boolean-based, Time-based и пр.
P.S. Почему это круто?!
Потому что разработчики, когда пишет код, даже не подозревает, что вызов вроде
Только посмотрите, как круто в коде RubyOnRails выглядит SQLi в ORDER BY:
Client.order(params[:first_name])
Т.е. Active Record Query Interface после такого вызова построит следующий запрос:
'SELECT * FROM Clients ORDER BY #{params[:first_name]}’
, где #{params[:first_name]} - это user input.
Метод .order() не фильтрует и не экранирует получаемые данные. А значит, в таком случае мы легко можем раскрутить Blind SQLi c подзапросом вроде:
ORDER BY 1,(SELECT 1 FROM SLEEP(5))--
, где дальше можно крутить Boolean-based, Time-based и пр.
P.S. Почему это круто?!
Потому что разработчики, когда пишет код, даже не подозревает, что вызов вроде
Client.order(params[:first_name])
приведет к SQLi. Тут ничего не режет глаз, нет конкатенации, нет опасных функций, казалось бы и пр.