SQL — INJECTION Урок 2. SQL — инъекции в ASP.NET 1.2

В данном уроке создадим страницы, которые будут уязвимы для SQL инъекций и проверим работоспособность теории, которую мы прочитали в предыдущем уроке, а в следующем уроке попробуем защитить наши страницы от подобных атак.
Создадим страницу авторизации. На ней расположим два текстовых поля и кнопку войти. При нажатии на кнопку войти у нас должен запускаться скрипт, который будет проверять имя и пароль в базе данных. Для реализации данной страницы создадим следующую разметку:

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="btnLogin" runat="server" Text="Login" onclick="btnLogin_Click" />
    </td>
    <td>
    <asp:Label ID="lblInfo" runat="server" Text="Label"></asp:Label>
    </td>
  </tr>
</table>

Вот как она будет выглядеть:

Label на данной странице используется для того, чтобы узнать смог ли авторизоваться пользователей. Если да, то она показывает true, если нет, то она показывает false.
Как мы и говорили до этого, проверка имени и пароля в базе данных будут осуществляться с помощью следующего sql запроса:

1
SELECT * FROM Users WHERE Name = 'name' AND Password = 'password'

Теперь если запрос вернет нам больше нуля записей, то мы говорим, что пользователь прошел авторизацию. При создании запроса мы конечно должны допустить ошибку и произвести конкатенацию строк.
Поместим на страницу следующий код:

1
2
3
4
5
6
7
8
9
protected void btnLogin_Click(object sender, EventArgs e)
{
    string connectionString = WebConfigurationManager.ConnectionStrings["ourBase"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    SqlCommand command = new SqlCommand("SELECT * FROM Users WHERE Name = '"+tbLogin.Text+"' AND Password = '"+tbPassword.Text+"'", con);
    con.Open();
    SqlDataReader reader = command.ExecuteReader();
    lblInfo.Text = reader.Read().ToString();
}

Проверим этот код на уязвимость. Попробуем вместо имени написать ‘ OR 1 = 1—
SQL инъекция сработала и неизвестный злоумышленник проник в нашу систему.(Конечно же в нашей базе данных должны быть какие — то записи, а то никто не сможет проникнуть в столь неприступную систему, если не добавит туда своих записей)
Следующая страница будет заниматься тем, что выводит информацию об одной новости. В качестве параметра она принимает id записи. Для реализации данной страницы нам достаточно будет один label, который будет выводить новость, в случае, если такая новость есть и нет данных в противном случае.

1
<asp:Label ID="lblInfo" runat="server" Text="Label"></asp:Label>


Код страницы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
protected void Page_Load(object sender, EventArgs e)
{
    String ID = Request.QueryString["id"];
    if (ID == null)
    {
        ID = "0";
    }
    string connectionString = WebConfigurationManager.ConnectionStrings["ourBase"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    SqlCommand command = new SqlCommand("SELECT * FROM News WHERE ID =" + ID , con);
    con.Open();
    SqlDataReader reader = command.ExecuteReader();
    if (reader.Read())
    {
        lblInfo.Text = reader.GetInt32(0).ToString() + reader.GetString(1) + reader.GetString(2);
    }
    else
    {
        lblInfo.Text = "Нет данных";
    }
}

 

Категория: SQL — INJECTION | Добавил: ghost_mod (29.09.2016)
Просмотров: 451 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email:
Подписка:1
Код *: