плохая защита от инъекций SQL Server

У моего друга есть веб-сайт, и у него есть функция PHP, чтобы избежать его операторов MSSQL. Однако он не делает это должным образом. Он использует \ для своего escape-символа, когда это должно быть '. Однако, когда я пытался объяснить ему, что это неправильно, он не согласился, не стал слушать и предложил мне попробовать сделать инъекцию. Я сказал ему, что не буду делать это прямо на его сайте, но завтра запущу свой веб-сервер на своем компьютере, чтобы показать ему. Тем не менее, я не совсем уверен, как это сделать, потому что, даже если он неправильно экранируется, добавление этой обратной косой черты делает запрос недействительным с недопустимым синтаксисом и, следовательно, не будет выполняться. Мне было интересно, есть ли у кого-нибудь информация о том, как обойти это.

Мой пример запроса будет выглядеть так, как и его:

mssql_query("INSERT INTO Tbl_user (user_no,user_id,user_mail) VALUES ('".mssql_escape($dk_user_no)."','".mssql_escape($_POST['accname'])."','".mssql_escape($_POST['accmail'])."')");

person SoulMan    schedule 02.02.2011    source источник
comment
Почему бы не сделать резервную копию его базы данных и просто удалить его таблицу с помощью инъекции? Это эффективный способ показать, что его нынешний метод ошибочен...   -  person Blender    schedule 02.02.2011


Ответы (3)


Стандартные трюки для MSSQL заключаются в использовании ; для завершения текущего запроса и начала нового, и -- для удаления конца запроса и игнорирования синтаксических ошибок. Таким образом, что-то вроде этого может работать (при условии, что в используемом вами запросе нет разрывов строк):

'; DROP users --

Дополнительные приемы см. на странице http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/.

person btilly    schedule 02.02.2011

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

SELECT * FROM users WHERE username='var1' AND password='var2'

Представьте, что var2 является \''; DROP TABLE users; --. Ваш полный запрос будет:

SELECT * FROM users WHERE username='var1' AND password='\''; DROP TABLE users; --'

Это означает:

SELECT * FROM users WHERE username='var1' AND password='\''
DROP TABLE users

О нет, вы только что убили свою базу данных. Бум.


Упс, просто перечитай свой вопрос. Не могли бы вы предоставить свой запрос? Это было бы весьма полезно...

person Blender    schedule 02.02.2011
comment
Отредактировал мой пост с примером запроса. - person SoulMan; 02.02.2011

Для параметра accmail опубликуйте эту строку

'); drop table Tbl_user --

"Сбежало:" это будет \'); drop table Tbl_user --

Когда запрос формируется путем объединения строки, это даст

INSERT INTO Tbl_user (user_no,user_id,user_mail) VALUES ('$dk_user_no','accname','\'); drop table Tbl_user --
person Martin Smith    schedule 02.02.2011