Deutsch
Germany.ruФорумы → Архив Досок→ Компьютер & Co

да возрадуются SQL-программисты...

244  
digital_pilot рядовой запаса ВС РФ30.03.04 11:10
NEW 30.03.04 11:10 
седня столкнулся с веселой попыткой взлома веб-приложения, работающего под SQL Server'ом и использующего собственный (оч-оч простой) механизм авторизации.
А именно, логин и пароль пользователя хранятся открытым текстом в таблице.
На логин подается след. строка:
' or 1=1 --
und scho sind ma drin Не повторяйте эту ошибку
--------------
Авиатор х#ев
#1 
Simple grünes Fellmonster vom Planeten Kneke-430.03.04 11:44
Simple
NEW 30.03.04 11:44 
в ответ digital_pilot 30.03.04 11:10
шо-то я не поэл прикола. Давай в деталях :)
F*ck it, Dude. Let's go bowling (c)
#2 
digital_pilot рядовой запаса ВС РФ30.03.04 11:53
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, а часть с паролем получается закомментированной :)
--------------
Авиатор х#ев
#3 
Simple grünes Fellmonster vom Planeten Kneke-430.03.04 11:58
Simple
NEW 30.03.04 11:58 
в ответ digital_pilot 30.03.04 11:53
Первую часть мог бы и опустить :)
И что, это фурычит?.. Что-то мне не верится.
F*ck it, Dude. Let's go bowling (c)
#4 
  Findеr С Луны свалился30.03.04 11:59
NEW 30.03.04 11:59 
в ответ digital_pilot 30.03.04 11:53
упс
Повезло, что у меня защита двухуровневая - скрипт пропустил, но фильтр блокировал
Но простит ли тебя Кирдык-Mирдык из Монголии, чей дух ворвался в мои кисти? (с)
#5 
Simple grünes Fellmonster vom Planeten Kneke-430.03.04 12:12
Simple
NEW 30.03.04 12:12 
в ответ digital_pilot 30.03.04 11:53
Мля, пардон. Конечно, работает.
F*ck it, Dude. Let's go bowling (c)
#6 
Simple grünes Fellmonster vom Planeten Kneke-430.03.04 12:13
Simple
NEW 30.03.04 12:13 
в ответ Findеr 30.03.04 11:59
В смысле, проверка на левые символы?
F*ck it, Dude. Let's go bowling (c)
#7 
digital_pilot рядовой запаса ВС РФ30.03.04 12:36
NEW 30.03.04 12:36 
в ответ Findеr 30.03.04 11:59
в моем случае тоже дальше не прошел, но это потому, что вся доступная информация строго привязана к каждому конкретному логину.
--------------
Авиатор х#ев
#8 
scorpi_ stranger?30.03.04 16:03
NEW 30.03.04 16:03 
в ответ digital_pilot 30.03.04 11:10, Последний раз изменено 30.03.04 16:09 (scorpi_)
Вообще никогда не следует хранить пароль. Для чего в конце концов существуют MD5, SHA и прочие hash-функции?
#9 
Sergey Schwarz знакомое лицо30.03.04 16:26
Sergey Schwarz
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 & "'"
То запрос ничего не возвращает, парольто пустой
А если доработать немного, что б пароль был не пустой
То уже интересней
...гребанный экибастус, блин...
#10 
digital_pilot .)(.30.03.04 22:36
NEW 30.03.04 22:36 
в ответ scorpi_ 30.03.04 16:03
ну хорошо, будем все дружно не пароль, а хеш хранить... речь все рно не о том. В описанной схеме неважно, хеш там или хрен с маслом :)
--------------
Авиатор х#ев
#11 
scorpi_ stranger?30.03.04 22:49
NEW 30.03.04 22:49 
в ответ digital_pilot 30.03.04 22:36
А, ну если ты так же и с хэшем собрался поступать, то тут помочь уже сложно...
#12 
digital_pilot .)(.30.03.04 22:52
NEW 30.03.04 22:52 
в ответ scorpi_ 30.03.04 22:49
мне помогать не нужно, я вообще под родную сиквельную авторизацию пишу :)
--------------
Авиатор х#ев
#13 
scorpi_ stranger?30.03.04 22:54
30.03.04 22:54 
в ответ digital_pilot 30.03.04 22:52
ну слава богу.
#14 
  Findеr С Луны свалился31.03.04 01:07
NEW 31.03.04 01:07 
в ответ Simple 30.03.04 12:13
Да не, банальный http-фильтр, который нужные странички прикрывает - делает маппинг всех юзеров сайта на двух-трех зарегистрированных в системе.
Но простит ли тебя Кирдык-Mирдык из Монголии, чей дух ворвался в мои кисти? (с)
#15 
toptop прохожий31.03.04 13:06
NEW 31.03.04 13:06 
в ответ digital_pilot 30.03.04 11:53
Так у тебя ж тогда больше 1 записи получается. Да и пароль у тебя похоже на регистр не чувствительный? Хоть большие/хоть маленькие.
#16 
digital_pilot .)(.31.03.04 13:21
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.
--------------
Авиатор х#ев
#17 
brat_po_razumu прохожий31.03.04 14:35
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 --
В действительности всё совсем не так, как на самом деле. (Станислав Ежи Лец)
#18