Вход на сайт
да возрадуются SQL-программисты...
244
NEW 30.03.04 11:10
седня столкнулся с веселой попыткой взлома веб-приложения, работающего под SQL Server'ом и использующего собственный (оч-оч простой) механизм авторизации.
А именно, логин и пароль пользователя хранятся открытым текстом в таблице.
На логин подается след. строка:
' or 1=1 --
und scho sind ma drin
Не повторяйте эту ошибку 
--------------
Авиатор х#ев
А именно, логин и пароль пользователя хранятся открытым текстом в таблице.
На логин подается след. строка:
' or 1=1 --
und scho sind ma drin


--------------
Авиатор х#ев
NEW 30.03.04 11:53
в ответ Simple 30.03.04 11:44
вкратце выглядит так:
при авторизации серверу посылается стейтмент с логином и паролем для проверки существования такой строки в таблице логинов:
statement = "SELECT ... FROM [my_logins] WHERE [login] = '" & varLogin "' AND [password] = '" & varPwd & "'"
(внимательно следим за апострофами, их тут плохо видно)
На логин подается
' or 1=1 --
В итоге чистый стейтмент приобретает вид
SELECT ... FROM [my_logins] WHERE [login] = '' or 1=1 --' AND [password] = 'MyPwd'
т.е. запрашивается пустой логин, но это неважно, т.к. из-за or 1=1 это всегда будет true, а часть с паролем получается закомментированной :)
--------------
Авиатор х#ев
при авторизации серверу посылается стейтмент с логином и паролем для проверки существования такой строки в таблице логинов:
statement = "SELECT ... FROM [my_logins] WHERE [login] = '" & varLogin "' AND [password] = '" & varPwd & "'"
(внимательно следим за апострофами, их тут плохо видно)
На логин подается
' or 1=1 --
В итоге чистый стейтмент приобретает вид
SELECT ... FROM [my_logins] WHERE [login] = '' or 1=1 --' AND [password] = 'MyPwd'
т.е. запрашивается пустой логин, но это неважно, т.к. из-за or 1=1 это всегда будет true, а часть с паролем получается закомментированной :)
--------------
Авиатор х#ев
NEW 30.03.04 16:26
в ответ digital_pilot 30.03.04 11:53
Вообще придумано интересно 
Я сейчас у себя сделал для проверки подобное и получилось, что если поставить вот так:
SELECT ... FROM [my_logins] WHERE [login] = '" & varLogin "' AND [password] = '" & varPwd & "'"
AND table1 = table2
AND table2 = table3
То все после ' обрезается вылетает ошибка компайлера SQL
Если поставить в конец
SELECT ... FROM [my_logins]
WHERE
table1 = table2
AND table2 = table3
AND [login] = '" & varLogin "'
AND [password] = '" & varPwd & "'"
То запрос ничего не возвращает, парольто пустой
А если доработать немного, что б пароль был не пустой
То уже интересней
...гребанный экибастус, блин...

Я сейчас у себя сделал для проверки подобное и получилось, что если поставить вот так:
SELECT ... FROM [my_logins] WHERE [login] = '" & varLogin "' AND [password] = '" & varPwd & "'"
AND table1 = table2
AND table2 = table3
То все после ' обрезается вылетает ошибка компайлера SQL
Если поставить в конец
SELECT ... FROM [my_logins]
WHERE
table1 = table2
AND table2 = table3
AND [login] = '" & varLogin "'
AND [password] = '" & varPwd & "'"
То запрос ничего не возвращает, парольто пустой

А если доработать немного, что б пароль был не пустой

То уже интересней

...гребанный экибастус, блин...
NEW 31.03.04 13:21
в ответ toptop 31.03.04 13:06
1. это не у меня. Я с этим приложением работаю исключительно в качестве техсуппортера :)
2. Да, получается полная выборка. Тут все зависит, что с ней дальше делать. Я намеренно поставил многоточия. А вдруг там SELECT TOP 1 [login] ;)
3. Чувствительность к регистру зависит от коллэйшена. В данном случае это Latin1_General_CI_AS, он case insensitive.
--------------
Авиатор х#ев
2. Да, получается полная выборка. Тут все зависит, что с ней дальше делать. Я намеренно поставил многоточия. А вдруг там SELECT TOP 1 [login] ;)
3. Чувствительность к регистру зависит от коллэйшена. В данном случае это Latin1_General_CI_AS, он case insensitive.
--------------
Авиатор х#ев
NEW 31.03.04 14:35
в ответ Sergey Schwarz 30.03.04 16:26
Если поставить в конец
SELECT ... FROM [my_logins]
WHERE
table1 = table2
AND table2 = table3
AND [login] = '" & varLogin "'
AND [password] = '" & varPwd & "'"
То запрос ничего не возвращает, парольто пустой
Ту же самую последовательность (' or 1=1 --) можно ввести и в поле "password" на маске, тогда сработает:
AND [login] = '' or 1=1 --
AND [password] = '' or 1=1 --
SELECT ... FROM [my_logins]
WHERE
table1 = table2
AND table2 = table3
AND [login] = '" & varLogin "'
AND [password] = '" & varPwd & "'"
То запрос ничего не возвращает, парольто пустой
Ту же самую последовательность (' or 1=1 --) можно ввести и в поле "password" на маске, тогда сработает:
AND [login] = '' or 1=1 --
AND [password] = '' or 1=1 --
В действительности всё совсем не так, как на самом деле. (Станислав Ежи Лец)