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

trieu.dev.da

Nguyễn Thanh Triều
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:
1680227492987.png

  • 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ị:
1680227512857.png

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

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.
1
2
$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:
1<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:
1680227605505.png

  • 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:
1680227618872.png

  • Để 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).
 

Đính kèm

Bên trên