| |
|
|
| | Есть два поля и кнопка :
.................................................. ..
.................................................. ..
<table class="wide_table">
<tr>
<td class="side_td"></td>
<td class="lable_td">Введите логин</td>
<td class="form_td"><input type=text name=login></td>
<td class="side_td"></td>
</rt>
<tr>
<td class="side_td"></td>
<td class="lable_td">Введите пароль</td>
<td class="form_td"><input type=password name=passwd></td>
<td class="side_td"></td>
</tr>
</table>
.................................................. ..
.................................................. ..
<p align="center">
<input type=submit value=Войти name=submit id=submit class="button">
.................................................. ..
.................................................. ..
|
При нажатии на кнопку входа выполняется код:
if (isset($submit))
{
$query = "SELECT * FROM users WHERE login='$login'";
if ($result = mysql_query($query,db_connect()))
{
if (mysql_num_rows($result) > 0)
{
if ($user=mysql_fetch_array($result))
{
$temp_id=$user["id"];
$query2="SELECT * FROM users,groups,user_group WHERE user_group.id_user=$temp_id AND user_group.id_group=groups.id";
$result2=mysql_query($query2,db_connect());
if ($groups=mysql_fetch_array($result2))
{
if ($login === $user["login"])
{
if (md5($passwd) === $user["passwd"])
{
session_start();
$cur_user=$user["login"];
$cur_group=$groups["groups"];
$cur_user_group_c=gzcompress(serialize($groups));
setcookie("cur_user_group_c",$cur_user_group_c,tim e()+7200);
setcookie("cur_group",$cur_group,time()+7200);
setcookie("cur_user",$cur_user,time()+7200);
//session_register('cur_user_group');
?><script language="javaScript">
document.location.replace("main.php");
</script>
<?
exit;
}
else {print "<center><font size=5 color=#CC0000>Неправильный пароль!!!</font></center>";}
}
else {print "<center><font size=5 color=#CC0000>Неправильный логин!!!</font></center>";}
}
else {print mysql_error();}
}
}
}
else {die("Couldn't retrieve authorization data, please try again later");}
}
| ВОПРОС: Можна ли взломать такую реализацию! Тобиш ввести в поля ввода такие значия чтобы мы смогли перейти на main.php. | |
| |
|
|
| |
|
|
| |
для: abdyla_v
(20.07.2007 в 18:44)
| | | Через SQL инъекцию можно прочитать таблицу users, поэтому сначала переменную $login нужно отфильтровать через mysql_escape_string. И вообще от глобальных переменных лучше отказаться. имхо безопаснее использовать $_POST $_GET массивы | |
| |
|
|
| |
|
|
| |
для: abdyla_v
(20.07.2007 в 18:44)
| | | как выше определсяется переменная $login? | |
| |
|
|
| |
|
|
| |
для: Unreal
(20.07.2007 в 19:12)
| | | ili $_REQUEST mossiv ispol'zovat' pri otklyuchennyh register_globals! | |
| |
|
|
| |
|
|
| |
для: abdyla_v
(20.07.2007 в 18:44)
| | | в общем если вверху $login никак не обрабатывается и код примерно такой
<?php $login = $_REQUEST['login'];
|
в таком случае злоумышленник посылает такой логин: ' OR '1=1'
в итоге запрос получается в виде
"SELECT * FROM users WHERE login='' OR '1=1';
получается вся таблица
А если есть желание получить ответ как полностью все это происходит копируйте сюда весь код, чтобы не гадать откуда берется $login, $password итд | |
| |
|
|
| |
|
|
| |
для: Unreal
(20.07.2007 в 20:14)
| | | Я так понял, это с квеста античата взято.
Там нифига из базы не получишь, только нужно как то иньекцию подбирать. Сделал десятки инъекций: на локал хосте пашет, на серваке - нет.
Так я и забил на это дело. | |
| |
|
|
| |
|
|
| |
для: Unreal
(20.07.2007 в 20:14)
| | | "SELECT * FROM users WHERE login='' OR '1=1';
получается вся таблица
Вы знаете, это глупость. В Вашем случае "1=1" не условие 1 == 1, а строка. А в MySQL просто строку как условие не пропустит парсер. | |
| |
|
|
| |
|
|
| |
для: Unkind
(21.07.2007 в 11:23)
| | | можно ввести не ' OR '1 = 1' а ' OR '1' = '1, то получиться уже
"SELECT * FROM users WHERE login='' OR '1'='1';
|
хотя и так вряд ли получится вывести всю таблицу на экран. но шансов на НСД будет больше. в любом случае лучше использовать mysql_escape_string или magic_quotes. Но я предпочитаю mysql_escape_string. так как в magic_quotes тож баг есть. | |
| |
|
|
| |
|
|
| |
для: Unkind
(21.07.2007 в 11:23)
| | | Unkinnd:
Вы знаете, это глупость. В Вашем случае "1=1" не условие 1 == 1, а строка. А в MySQL просто строку как условие не пропустит парсер.
Прежде чем что-то утверждать попробуйте это сделать а потом пишите то что написали
SELECT FROM table WHERE existing_field = '' OR 1=1 надеюсь так понятнее, то что там выведет или не выведет php надо смотреть весь исходный код, а не тот огрызок что тут привели. Я показал общую идею, что касается реализации еще раз повторю что надо смотреть код. Проверить запрос можно в MySQL Query Browser например. | |
| |
|
|
| |
|
|
| |
для: Unreal
(22.07.2007 в 02:41)
| | | Не искажайте мой ник.
Прежде чем отправлять данные, проверяйте их сами.
SELECT FROM table WHERE existing_field = '' OR 1=1 надеюсь так понятнее
Вы так говорите, как будто эти два запроса аналогичны. Вообще, более поздние версии MySQL может и пропустят строку как условие, но там можно будет тогда написать отнюдь не только "1=1". Здесь "=" не является никаким оператором. Это просто символ. Хоть напишите "Usama Bin Laden is good boy" и это будет true.
И вообще почему 1=1, а не просто 1, допустим? Так на форумах для крутых взломшиков не объясняли? Странно. | |
| |
|
|
| |
|
|
| |
для: Unkind
(22.07.2007 в 02:46)
| | | Вот код который просили:
<?
include "functions.php";
include("options.php");
if (isset($logout))
{
setcookie("cur_user","",time()-60);
setcookie("cur_group","",time()-60);
unset($cur_user_group);
}
if (isset($cur_user) && isset($cur_group))
{
?><script language="javaScript">
document.location.replace("main.php");
</script><?
exit();
}
if (isset($submit))
{
$query = "SELECT * FROM users WHERE login='$login'";
if ($result = mysql_query($query,db_connect()))
{
if (mysql_num_rows($result) > 0)
{
if ($user=mysql_fetch_array($result))
{
$temp_id=$user["id"];
$query2="SELECT * FROM users,groups,user_group WHERE user_group.id_user=$temp_id AND user_group.id_group=groups.id";
$result2=mysql_query($query2,db_connect());
if ($groups=mysql_fetch_array($result2))
{
if ($login === $user["login"])
{
if (md5($passwd) === $user["passwd"])
{
session_start();
$cur_user=$user["login"];
$cur_group=$groups["groups"];
$cur_user_group_c=gzcompress(serialize($groups));
setcookie("cur_user_group_c",$cur_user_group_c,time()+7200);
setcookie("cur_group",$cur_group,time()+7200);
setcookie("cur_user",$cur_user,time()+7200);
//session_register('cur_user_group');
?><script language="javaScript">
document.location.replace("main.php");
</script>
<?
exit;
}
else {print "<center><font size=5 color=#CC0000>Неправильный пароль!!!</font></center>";}
}
else {print "<center><font size=5 color=#CC0000>Неправильный логин!!!</font></center>";}
}
else {print mysql_error();}
}
}
}
else {die("Couldn't retrieve authorization data, please try again later");}
}
?>
<html>
<head>
<link rel=stylesheet type=text/css href=styles.css>
<meta http-equiv="Content-Language" content="ru">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Task Manager</title>
</head>
<body>
<form method="POST" action="<?echo $PHP_SELF?>">
<br><br><br><br><br>
<table class="wide_table">
<tr>
<td class="side_td"></td>
<td class="lable_td">Введите логин</td>
<td class="form_td"><input type=text name=login></td>
<td class="side_td"></td>
</rt>
<tr>
<td class="side_td"></td>
<td class="lable_td">Введите пароль</td>
<td class="form_td"><input type=password name=passwd></td>
<td class="side_td"></td>
</tr>
</table>
<p align="center">
<input type=submit value=Войти name=submit id=submit class="button">
<input type=reset value=Очистить name=reset id="reset" class="button"></p>
</form>
<SCRIPT>onload=function(){document.getElementById('login').focus();}</SCRIPT>
<?
footer();
?>
|
Замечу что если ввести в поле login следующее значени то все пройдет - 1' and '1 !!!
А как теперь взломать пароль?
Пароли для пользователей хранятся в базе в зашифрованом ввиде. Как видно из кода
md5($passwd) === $user["passwd"]
|
используэтся функция md5! | |
| |
|
|
| |
|
|
| |
для: abdyla_v
(23.07.2007 в 09:40)
| | | Ну что больше никаких предложений нету? Может как то можна обойти ту реализацию что я привел? Помогите!!!! | |
| |
|
|
| |
|
|
| |
для: abdyla_v
(23.07.2007 в 19:26)
| | | Да так не надо делать. Вы просто храните в буфере массу ненужной информации. | |
| |
|
|