Kĩ thuật tấn công SQL injection và XSS (cross-site scripting)

1.    SQL injection

1.1.  SQL injection là gì?

  • SQL injection là kĩ thuật cho phép các kẻ tấn công thực hiện các lệnh thực thi SQL bất hợp pháp (mà người phát triển không lường trước được), bằng cách lợi dụng các lỗ hổng bảo mật từ dữ liệu nhập vào của các ứng dụng.

1.2.  Cách thức hoạt động của Sql injection

  • Lỗi Sql injection thường xảy ra do sự thiếu kiểm tra dữ liệu truyền vào, điều này gây ra những tác động không mong muốn ngoài mục đích chính của câu truy vấn. Ta hãy xem xét câu truy vấn sau:
Selected_user = "SELECT * FROM users WHERE name = '" + userName + "';"
  • Ta thấy rằng, mục đích chính của câu truy vấn này là lục tìm trong bảng users những dòng dữ liệu nào mà trường name có giá trị bằng với tham số userName đã truyền vào.
  • Thoạt nhìn thì câu truy vấn này là đúng cấu trúc và không có bất cứ vấn đề gì, thế nhưng ta hãy thử phân tích một tình huống sau đây: giả sử người gọi câu truy vấn này truyền vào tham số userName có giá trị:
a' or 't'='t

Như vậy câu truy vấn của ta có được hiểu như sau:

SELECT * FROM users WHERE name = 'a' or 't'='t';

Câu truy vấn trên có ý nghĩa là gì? Mệnh đề WHERE của câu truy vấn trên luôn đúng, lí do là vì ‘t’=’t’ luôn cho ra giá trị đúng. Như vậy, thay vì trả về kết quả của 1 dòng dữ liệu mong muốn, câu truy vấn này trả về kết quả là toàn bộ dữ liệu của bảng users.

  • Nguyên nhân chính của việc truy vấn sai này chính là do dữ liệu của tham số truyền vào. Hãy tưởng tượng rằng toàn bộ dữ liệu này bị sử dụng nhằm mục đích không tốt, hậu quả thật khó lường phải không nào?

1.3.  Các trường hợp thường bị tấn công Sql injection

  • Bất cứ thao tác nào của ứng dụng có thực hiện truy vấn tới cơ sở dữ liệu đều có thể bị lợi dụng để tấn công Sql injection. Các thao tác cơ bản với CSDL là: select, insert, update đều có thể bị tấn công. Có thể kể ra vài thao tác phổ biến có thể tấn công như:
  • Kiểm tra đăng nhập ứng dụng.
  • Thao tác lưu comment của user xuống DB.
  • Thao tác truy vấn thông tin user.

1.4.  Cách phòng tránh lỗi Sql injection

  • Như đã phân tích ở trên: điểm để tấn công chính là tham số truyền vào câu truy vấn. Do vậy phải thực hiện các biện pháp phòng chống để đảm bảo việc kiểm tra dữ liệu truyền vào không thể gây ra sai lệch khi thực hiện truy vấn.
  • Giải pháp cho việc kiểm tra này là sử dụng “chuỗi escape”. Khi thực hiện escape một chuỗi, tức là mã hoá các kí tự đặc biệt của chuỗi (như kí tự ‘, &, |, …) để nó không còn được hiểu là 1 kí tự đặc biệt nữa. Mỗi ngôn ngữ lập trình đều cung cấp các hàm để thực hiện escape chuỗi, với PHP ta sẽ sử dụng hàm mysqli_real_escape_string() hoặc cũng có thể dùng addslashes() để thực hiện điều này.
  • Ví dụ về hàm addslashes(): kí tự nháy kép lúc này không còn được hiểu là kí tự điểu khiển nữa.
$str = addslashes('What does "yolo" mean?');
//$str = 'What does \"yolo\" mean?'

2.    Tấn công XSS (cross-site scripting)

2.1.  XSS là gì

  • XSS là một kĩ thuật tấn công, trong đó kẻ tấn công sẽ chèn các đoạn mã client-script độc (thường là javascript hoặc HTML) vào trang web, các đoạn mã này sẽ được thực thi khi người dùng truy cập và load trang có chứa mã độc.
  • Khác với Sql injection nơi mà mã độc được thực thi ở server, XSS là một dạng tấn công trong đó mã độc được thực thi ở máy client. Bởi vì mã độc được chứa ở server nhưng lại được thực thi ở client, do đó kĩ thuật này được gọi là “cross-site” là vì vậy.

2.2.  Cách thức hoạt động của XSS

  • Có thể chia XSS thành 2 loại: Stored-XSS và Reflected-XSS. Cả 2 đều là đưa những đoạn mã độc tới máy client để thực thi, cụ thể là việc hiển thị các nội dung được sinh ra trong quá trình trang web hoạt động, tuy nhiên cách thức có đôi chút khác biệt như sau:

2.2.1.      Stored-XSS

  • Loại tấn công XSS này lợi dụng các lỗ hổng bảo mật của trang web để lưu trữ các đoạn mã độc trên server, mỗi khi người dùng tải trang về thì các đoạn mã độc này sẽ được thực thi. Điển hình nhất của loại tấn công này là lợi dụng các điểm chứa dữ liệu nhập vào từ người dùng như: các ô comment trong trang blog, các ô điền nội dung của thông tin tài khoản công khai, …
  • Giả sử trang web của chúng ta có ô nhập nội dung comment như sau:
1

Thay vì nhập comment như bình thường, kẻ tấn công sẽ chèn mã độc, ví dụ như đoạn script sau:

<script>alert("XSS");</script>

Khi đó, nếu một người dùng khác truy cập vào trang web này, đoạn script sẽ được kích hoạt, và kết quả của nó như sau:

2
  • Trên đây chỉ là 1 ví dụ đơn giản về kĩ thuật tấn công XSS, tất nhiên là kẻ tấn công hoàn toàn có thể chèn vào các đoạn mã nguy hiểm hơn để khai thác thông tin của người dùng. Ta thấy rằng, mặc dù đoạn mã độc này được lưu ở server, nhưng nó lại được thực thi tại máy tính của client, do đó nó được gọi là stored-XSS.

2.2.2.      Reflected-XSS

  • Ở kĩ thuật tấn công này, mã độc được gắn trực tiếp vào link trang web, một khi bạn truy cập vào đường link có chứa mã độc, thì đoạn mã độc sẽ được thực thi.
  • Giả sử ta có link trang web sau:

xyz.abc.vn/xss/reflected/index?qid=alert(‘XSS’);

  • Nếu như trang web này dùng giá trị của tham số qid để hiển thị, thì khi truy cập vào đường link này, ta sẽ bị lỗi XSS.

2.3.  Các phòng tránh XSS

  • Như đã đề cập ở trên, mấu chốt của kĩ thuật tấn công này nằm ở chỗ hiển thị các nội dung được nhập vào ở client, do vậy để phòng tránh thì ta sẽ kiểm soát chặt chẽ các nơi có thể hiển thị nội dung.
  • Cũng tương tự như cách phòng chống Sql injection, mỗi khi nhận vào dữ liệu, ta sẽ thực hiện kiểm tra và mã hoá các kí tự đặc biệt và các kí tự điều khiển có nguy cơ gây hại cho chương trình. Khi đó những kí tự đặc biệt sẽ được biến đổi một cách tương tự như sau:
<script> sẽ được đổi thành &lt;script&gt;
  • Để làm được điều này, trước khi hiển thị thông tin nào đó ra một thẻ HTML, ta luôn thực hiện escape trước ở server để biến đổi các kí tự đặc biệt thành html entity (trong PHP ta có thể sử dụng hàm htmlentities() để làm việc này).

Tham khảo:

  1. XSS: http://www.acunetix.com/websitesecurity/cross-site-scripting/
  2. SQL injection: http://www.w3schools.com/sql/sql_injection.asp

Vcttai

5 thoughts on “Kĩ thuật tấn công SQL injection và XSS (cross-site scripting)

  1. Hồ Quốc Toản

    Em cảm ơn anh ạ :D.. Bài viết rất đầy đủ thông tin và phân loại giúp dễ nhớ và dễ tiếp cận cho người đọc ạ 😀 :D..

    Bên cạnh đó em có một ý kiến cho việc khắc phục SQLInjection như sau ạ:

    Parameter for Protection, giúp phòng tránh SQL Injection:
    Là một phương pháp sử dụng các thư viện kết nối database (driver), chuyển việc đảm nhiệm phòng tránh lỗi này cho driver mà hệ quản trị cơ sở dữ liệu cung cấp. Thực hiện truyền tham số vào câu truy vấn qua các biến số tương ứng, việc còn lại sẽ do hệ quản trị đảm nhiệm. Cụ thể hơn được thể hiện như ví dụ đưới đây.
    Ví dụ:
    Quere query = “SELECT * FROM User Where username = :un_var and password = :pw_var”;
    query.setParams(“:un_var”, username cần truy vấn);
    query.setParams(“:pw_var”, password của user trên);
    result = query.execute();

    Like

    1. Cảm ơn góp ý của Toản.
      Việc chuyển các biến input đầu vào cho các thư viện kết nối DB xử lí cũng là 1 cách làm tốt. Tóm lại thì ta phải xử lí kiểm tra biến input đầu vào để tránh các lỗi có thể xảy ra.

      Like

  2. Pingback: [Mừng 5000 views đầu tiên] Những bài viết đáng chú ý trong thời gian qua & dự định sắp tới. – Webbynat

  3. Pingback: [ Giới thiệu sách ] The pragmatic programmer – Lập trình viên … tiêu biểu. (P1) – Những dòng code vui

  4. Pingback: Điều gì làm bạn trở thành một lập trình viên tiêu biểu – CodeGym Blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s