Таблица News содержит три поля: ID, Title и Text, также как и в предыдущем уроке. Попробуем начать атаку SQK инъекцией на эту страницу. Для начала проверим отображаются ли ошибки на сервере. Для этого добавим кавычку после id. В зависимости от настроек сайта вам либо отобразиться, либо нет информация об ошибке, но так как я работаю под localhost в Visual Studio, то все ошибки мне отображаются. Дальше попробуем вместо номера просунуть какое — нибудь вычисляемое выражение. Например 1+1 Мы видим, что ASP.NET выводит ошибку, а символ плюса куда — то делся, соответственно запрос стал неверным с точки зрения sql. Попробуем другое выражение со знаком минус, например 2-1. Запрос выполнился отобразив новость с id = 1. То, что у нас сработала данная подстановка свидетельствует о наличии sql инъекции на данной странице. Продолжим процесс исследования сайта на предмет внедрения sql кода. Для этого попробуем узнать сколько параметров отображается. Попробуем как и в предыдущем уроке выяснить это с помощью UNION. Для этого попробуем объединить null. Тогда наш параметр будет иметь вид: id=-1 UNION SELECT null
Мы получаем ошибку исполнения. Нам говорят о том, что использовать null плохо. На всякий случай попробуем три null(так как у нас три параметра передается в select запросе). И опять нас ждет такая же ошибка. Попробуем заменить null на 1. В этом случае нам придется чуть чуть поиграться с параметрами, подобрав все так, чтобы там, где находиться число единица была без кавычек, а где строковой в кавычках. Для того, чтобы вывести три единицы на странице нужно передать следующий параметр:id=-1 UNION SELECT 1, ‘1’, ‘1’
Теперь вместо двух строковых полей выведем не единицы, а имя и пароль из таблицы Users:id=-1 UNION SELECT 1, Name, Password FROM Users
Теперь злоумышленник сможет узнать все имена и пароли пользователей.
Создадим страницу на которой пользователь сможет регистрироваться. Она будет состоять из двух текстовых полей и кнопки зарегистрироваться.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<table>
<tr>
<td>Login</td>
<td><asp:TextBox ID="tbLogin" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>Password</td>
<td><asp:TextBox ID="tbPassword" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>
<asp:Button ID="btnRegistr" runat="server" Text="Reg" onclick="btnRegistr_Click" />
</td>
<td>
<asp:Label ID="lblInfo" runat="server" Text="Label"></asp:Label>
</td>
</tr>
</table>
|
При регистрации нового пользователя опять воспользуемся сложением строк. Тогда наш запрос будет иметь следующий вид:
|
1
|
INSERT INTO Users (Name, Password, ROLE) VALUES (myname, mypassword, 0)
|
|
1
2
3
4
5
6
7
8
|
protected void btnRegistr_Click(object sender, EventArgs e)
{
string connectionString = WebConfigurationManager.ConnectionStrings["ourBase"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand("INSERT INTO Users (Name, Password, ROLE) VALUES ('" + tbLogin.Text + "', '" + tbPassword.Text + "', 0)", con);
con.Open();
lblInfo.Text = command.ExecuteNonQuery().ToString();
}
|
Label на этой странице показывает количество записей, которое было вставлено. Попробуйте сами найти и использовать уязвимость на этой странице.
В следующем уроке мы узнаем как защититься от этих уязвимостей и попробуем найти новые, чтобы злоумышленники не смогли эксплуатировать наши сайты.
|