2/26/2019 9:57:13 PM
Viewed: 121
tamkhong
2/5/2013 4:59:47 PM
SQL INJECTION LÀ GÌ ? TÌM HIỂU CÁCH THỨC TẤN CÔNG SQL INJECTION !

SQL Injection đúng như cái tên của nó, là cách thức tấn công vào lỗ hổng của website nhằm vào được cơ sở dữ liệu, bằng cách chèn thêm một đoạn query của SQL để làm sai lệch câu lệnh truy vấn, từ đó có thể phá hủy website hoặc lấy cơ sở dữ liệu. Các bạn có thể tìm hiểu thêm trên Wiki.

Mô phỏng lỗi SQL InjectionMô phỏng lỗi SQL Injection

Để cho các bạn dễ hiểu hơn, mình có thể mô tả quy trình thế này:

  1. Hacker tìm form hoặc lỗ hổng qua URL của website
  2. Hacker chèn lệnh SQL vào lỗ hổng
  3. Hacker lấy được thông tin mình mong muốn, ví dụ thông tin bài đăng hoặc thông tin của một User, hoặc thông tin đăng nhập của SQL
  4. Hacker giải mã password của admin, hoặc thay thế mật khẩu của mình vào rồi đăng nhập bằng tài khoản Admin
  5. Hacker làm những gì hắn muốn !

Các kiểu tấn công phổ thông

Tấn công bằng mệnh đề luôn đúng

Những lỗi lập trình này thường xảy ra ở các chức năng tìm kiếm hoặc đăng nhập tài khoản. Ví dụ một câu lệnh SQL như sau:

SELECT * FROM accounts WHERE userName = '{$userName}'

Câu lệnh này đầy sơ hở, chắc là ít người có thể liều lĩnh mà code như vậy, tuy nhiên thực tế thì nó cũng gần như thế mà thôi, rất nhiều trang mắc lỗi này, giờ chúng ta thử xem hacker sẽ thêm cái gì:

' or '1' = '1'

Thì khi truy vấn, câu lệnh của chúng ta sẽ trở thành mệnh đề luôn đúng như dưới đây

SELECT * FROM accounts WHERE userName = '{$userName}' OR '1' = '1'

Câu lệnh này có vế luôn trả về đúng, cho nên câu lệnh luôn thực hiện được, trong trường hợp này thì tài khoản bị mất là cái chắc chắn, hoặc hacker sẽ đăng nhập như admin mà nghịch ngợm phá hoại …

Tấn công phá hoại dữ liệu

Giả sử câu lệnh cũng như trên, nhưng không nhập ‘1’ = ‘1’ nữa mà thêm như sau:

SELECT * FROM accounts WHERE userName = '{$userName}'; DROP TABLE accounts; ''

Dấu ( ; ) dùng để phân tách câu lệnh trong SQL, điều này đồng nghĩa với việc hacker có thể hành động thêm bất kì lệnh gì vào trong câu lệnh trên, rất nguy hiểm, nếu các bạn không có bản backup thì nguy to.

 // 1. declare command object with parameter
SqlCommand cmd = new SqlCommand(
"select * from Customers where city = @City", conn);
 // 2. define parameters used in command object
SqlParameter param = new SqlParameter();
param.ParameterName = "@City";
param.Value = inputCity;
 // 3. add new parameter to command object
cmd.Parameters.Add(param);

Putting it All Together

You already know how to use SqlCommand and SqlDataReader objects. The following code demonstrates a working program that uses SqlParameter objects. So, everything should be familiar by now, except for the new parts presented in this article:


using System;
using System.Data;
using System.Data.SqlClient;

class ParamDemo
{
static void Main()
{
// conn and reader declared outside try
// block for visibility in finally block
SqlConnection conn = null;
SqlDataReader reader = null;

string inputCity = "London";
try
{
// instantiate and open connection
conn = new
SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI");
conn.Open();

// don't ever do this
// SqlCommand cmd = new SqlCommand(
// "select * from Customers where city = '" + inputCity + "'";

// 1. declare command object with parameter
SqlCommand cmd = new SqlCommand(
"select * from Customers where city = @City", conn);

// 2. define parameters used in command object
SqlParameter param = new SqlParameter();
param.ParameterName = "@City";
param.Value = inputCity;

// 3. add new parameter to command object
cmd.Parameters.Add(param);

// get data stream
reader = cmd.ExecuteReader();

// write each record
while(reader.Read())
{
Console.WriteLine("{0}, {1}",
reader["CompanyName"],
reader["ContactName"]);
}
}
finally
{
// close reader
if (reader != null)
{
reader.Close();
}

// close connection
if (conn != null)
{
conn.Close();
}
}
}
}

Gửi trả lời