Kali Linux Căn Bản – Bài 10: Demo hướng dẫn khai thác lỗ hổng SQL Injection và giới thiệu công cụ SQL Map

Xin chào,

Chào mừng các bạn đến với bài thứ 2 của chuyên đề khai thác lỗ hổng bảo mật SQL Injection. Hôm nay chúng ta sẽ thực hành khai thác lỗ hổng SQL Injection để xâm nhập vào một tài khoản ngân hàng giả định. Ở phần 2 của bài, chúng ta sẽ tìm hiểu công cụ SQLmap, một công cụ cho phép khai thác lỗi SQL Injection một cách tự động, miễn phí và vô cùng mạnh mẽ.

Chúng ta cùng vào bài.


1 – Demo khai thác và cách nhận biết lỗ hổng SQL Injection

Chúng ta hãy cùng thực hành khai thác lỗ hổng SQL Injection tại trang sau.

H1.1

Sau khi truy cập vào, các bạn sẽ thấy giao diện chính gồm 3 phần:

  1. Phần màu trắng: Phần hướng dẫn khai thác lỗi.
  2. Form đăng nhập: Bao gồm email, password và nút Log in
  3. Phần Logs màu xám: Thể hiện thông báo từ bên trong hệ thống

Trong phần demo này, chúng ta sẽ mặc định là đã có được email (username) của account cần đăng nhập rồi, cái chúng ta không có chỉ là email mà thôi. Chúng ta sẽ làm tuần tự theo hướng dẫn của trang nhé.

B1: Đăng nhập thử vào ngân hàng BANK

Chúng ta sẽ thử đăng nhập vào ngân hàng BANK bằng tài khoản sau:

Lưu ý: Các bạn gõ chứ không copy/paste phần password nhé.

  • Email: user@email.com
  • Pass: password
H1.2

Chúng ta sẽ nhận được thông báo lỗi email hoặc password không tìm thấy.

Nếu nhìn xuống màn hình logs màu nâu, bạn sẽ thấy dòng chữ sau:

Finding user in database.
Rendering login page.

Lỗi cho biết email mà chúng ta đăng nhập có được tìm thấy trong database, nhưng vì ta nhập sai password nên không thể truy cập vào account của nạn nhân được.

B2: Kiểm tra xem trang đăng nhập ngân hàng BANK có dính lỗi SQL hay không?

Theo hướng dẫn, chúng ta sẽ thử đăng nhập lại một lần nữa, tuy nhiên, lần này password sẽ có thể dấu ‘

  • Email: user@email.com
  • Pass: password’
H1.3

Lúc này chúng ta nhận được một thông báo lỗi đã xảy ra trong quá trình đăng nhập.

B3: Chúng ta bấm vào dấu > màu xám ở phần hướng dẫn để qua phần tiếp theo

H1.4

Chú ý phần Logs, bạn sẽ thấy phần hướng dẫn màu trắng cho biết đã có một lỗi về cú pháp SQL xảy ra sau khi chúng ta thêm ký tự ‘ vào sau password.

B4: Để tìm hiểu chuyện gì đã xảy ra, chúng ta bấm tiếp nút > màu xám.

Lúc này bạn sẽ thấy một cửa sổ SQL sẽ hiện ra và cho chúng ta thấy câu lệnh SQL đang được dùng trong hệ thống.

H1.5

B5: Click vào nút > màu xám ở phần hướng dẫn để qua phần tiếp theo

H1.6

Chúng ta sẽ gõ lại chuỗi ký tự password’ một lần nữa vào ô password. Sau đó bấm nút > màu xám ở phần hướng dẫn

B6: Kiểm tra code SQL

Phần hướng dẫn cho ta biết chuỗi ký tự password’ sau khi được thêm vào câu lệnh SQL đã tạo ra lỗi về cú pháp làm câu lệnh không thể thực thi được như ở B5.

H1.7

Các bạn bấm tiếp nút > màu xám

H1.8

Phần hướng dẫn cho biết đây là dấu hiện nhận biết lỗi SQL Injection. Vậy điều gì đã xảy ra?

Giải thích:

Chúng ta có câu lệnh SQL đang được sử dụng trong hệ thống như sau:

SELECT *
  FROM users
 WHERE email = 'user@email.com'
   AND pass  = 'password'' LIMIT 1

Nó cũng tương tự như câu lệnh SQL mà chúng ta đã học ở phần 2 của bài 1 thôi. Tuy nhiên ở đây nó sẽ có thêm dòng LIMIT 1.

LIMIT 1 có nghĩa là giới hạn số dòng dữ liệu có thể hiện thị là 1

Mình muốn các bạn chú ý vào dòng ‘password”, đây chính là nơi đã có lỗi xảy ra.

Lỗi này có thể hiểu như sau, trong SQL, hai dấu ngoặc đơn ‘ ‘ hoặc ngoặc kép ” ” nhằm cho hệ thống biết dạng dữ liệu bên trong dấu các dấu này là ký tự (text). Và quy tắt bất di bất dịch đó là khi bạn đã mở ngoặc thì bạn bắt buộc phải đóng ngoặc. Nếu không hệ thống sẽ báo lỗi sai cú pháp và câu lệnh sẽ không thể thực thi. Trong tất cả các hệ thống, dữ liệu mà người dùng cung cấp sẽ luôn được đặt trong hai dấu ngoặc.

Tuy nhiên, trong trường hợp của chúng ta, khi chúng ta nhập chuỗi ký tự password’ vào ô password ở form đăng nhập của B2. Chúng ta đã đồng thời đóng ngoặc và biến ngoặc đóng mặc định trở thành ngoặc mở. Cụ thể như sau:

  1. Mặc định: ‘ ‘
  2. Thêm password: ‘password’
  3. Thêm password: ‘password’

Như vậy một dấu ngoặc đơn đang mở và không được đóng lại khi chạy câu lệnh SQL, chính điều này đã gây ra lỗi cú pháp mà ta đã găp ở bước 3.

Đây cũng là cách để chúng ta kiểm tra xem một form đăng nhập có bị dính lỗi SQL Injection hay không bằng cách thêm vào cuối password dấu ngoặc đơn ‘ hoặc ngoặc kép. Nếu sau khi thử nghiệm và các bạn nhận được báo lỗi sự cố hệ thống xảy ra chứ không phải là sai username hay password thì có nghĩa là form đăng nhập này dính lỗi SQL Injection.

B7: Khai thác lỗ hổng SQL Injection

Sau khi bấm nút > màu xám, chúng ta sẽ được hướng dẫn như sau:

H1.9

Có nghĩa là chúng ta sẽ gõ chuỗi ký tự ‘ or 1=1— vào ô password. Sau đó chúng ta click Log in.

H1.10

Và chúng ta đã đăng nhập thành công vào tài khoản ngân hàng của một ai đó.

Mình sẽ giải thích ý nghĩa của chuỗi ký tự mà chúng ta đã nhập như sau:

Chúng ta có câu lệnh SQL sau khi đã nhập chuỗi ký tự ‘ or 1=1— như bên dưới:

SELECT *
  FROM users
 WHERE email = ''
   AND pass  = '' or 1=1--' LIMIT 1

Vậy, ở vế trái của OR là ‘ ‘ không có dữ liệu và sẽ trả về giá trị 0. Vế phải của OR là một phép so sánh hai chữ số với nhau; do 1 luôn luôn bằng 1 nến vế này sẽ trả về giá trị 1. Theo bảng giá trị của OR bên dưới:

1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0

(TRUE = 1 và FALSE = 0)

Chúng ta có 0 OR 1 = 1. Để giải quyết dấu ngoặc đơn còn lại ‘ được hệ thống mặc định để đóng ngoặc, chúng ta sẽ dùng hai ký tự — ngụ ý tất cả các dòng từ sau 2 dấu — đều là comment và hệ thống có thể bỏ qua mà không cần quan tâm nội dung của nó là gì.

Giải thích thêm: Khi viết code hoặc script, các lập trình viên thường thêm vào các comments (bình luận) mô tả những điều cần chú ý hoặc cách code hoặc động để sau này khi nhìn lại, họ vẫn sẽ hiểu chức năng của những đoạn code mà họ đã viết. Mỗi ngôn ngữ lập trình hoặc script sẽ có các cách comment khác nhau, và hệ thống máy tính khi gặp các comments sẽ tự động bỏ qua nội dung của nó.

Có 2 dạng comments chính là one-line comments (bình luận một dòng) và multiple-line comments (bình luận nhiều dòng). Với bình luận một dòng, hầu hết các trường hợp bạn chỉ cần mở mà không cần đóng dấu comment vì khi xuống dòng, hệ thống sẽ tự động hiểu là đã hết comment. Với bình luận nhiều dòng, bạn bắt buộc phải có dấu đóng comment, nếu không hệ thống có thể sẽ bị lỗi khi chạy đoạn code hoặc script đó.

Quay trở lại trường hợp của chúng ta, khi chúng ta dùng dấu — chúng ta cũng đã đồng thời vô hiệu hóa luôn LIMIT 1. Tất cả các phần nằm sau dấu — như ‘ LIMIT 1 hiện tại đều là comment nên sẽ bị hệ thống bỏ qua. Điều này cho phép chúng ta xem được nhiều dữ liệu trả về hơn thay vì chỉ xem được 1 như khi có LIMIT 1.

2 – Công cụ SQLmap

2a – Giới thiệu SQLmap

Tất cả những ví dụ về SQL Injection mà ta đã học ở bài trước và phần 1 của bài này đều là những cách thức cơ bản và đơn giản nhất để khai thác lỗ hổng SQL Injection. Trong thực tế, lỗ hổng SQL Injection có 3 dạng khác nhau:

  • In-band SQL Injection
  • Inferential (Blind) SQL Injection
  • Out-of-band SQL Injection

Các bạn có thể đọc thêm chi tiết của mỗi dạng tại đây.

Và cách khai thác sẽ không dễ như chúng ta đã làm ở phần 1 của bài này. Có rất nhiều nguyên nhân dẫn đến tình trạng này ví dụ như:

  • Cách hệ thống cơ sở dữ liệu được thiết lập
  • Hãng cung cấp cơ sở dữ liệu sử dụng dòng lệnh SQL được cải tiến
  • v.v

Khi các bạn chơi CTF, sẽ rất nhiều trường hợp những dãy ký tự khai thác lỗ hổng SQL Injection mà chúng ta đã học như bên dưới sẽ không hoạt động:

' or 1=1--
" or ""="
105" OR "1=1

Những lúc như vậy, chúng ta sẽ cần một công cụ được thiết kế chuyên cho việc khai thác lỗ hổng SQL Injection từ cơ bản đến nâng cao. Công cụ ấy có tên là SQLmap.

SQLmap là một công cụ trên giao diện dòng lệnh. SQLmap là một công cụ mã nguồn mở và miễn phí được tích hợp sẵn vào Kali Linux (Bạn nào muốn nghiên cứu mã nguồn của SQLmap thì có thể vào Github này) nhằm mục đích tự động phát hiện và khai thác lỗ hổng SQL Injection dựa vào URL form đăng nhập được cung cấp bởi người dùng.

Lưu ý:

Để tăng xác suất khai thác lỗi thành công khi dùng SQLmap, bạn nên cố gắng xác định xem mục tiêu có sử dụng cơ sở dữ liệu SQL hay không. 2 cách dễ nhất đó là:

  1. Sử dụng Wappalyzer mà mình đã giới thiệu ở phần 1 bài tấn công server RootMe.
  2. Google để xác đinh xem nền tảng web mà nạn nhân sử dụng có dùng cơ sở dữ liệu SQL hay không? Một số nền tảng web phổ biến như WordPress mặc định sử dụng cơ sở dữ liệu SQL. Và bạn có thể xác định nền tảng web đang được dùng bằng Wappalyzer.

2b – Cách sử dụng SQLmap

Trên giao diện dòng lệnh, các bạn gõ câu lệnh sau:

sqlmap 
H2b.1

Đây chính là giao diện chính của công cụ SQLmap.

Chúng ta cùng khám phá các chức năng của công cụ SQL map thông qua câu lệnh sau:

man sqlmap 

H2b.2

Đây chính là giao diện hướng dẫn sử dụng của công cụ SQL map. Cú pháp một câu lệnh của SQLmap như sau:

sqlmap -u "url-mục-tiêu?form-parameter"

Trong câu lệnh trên, flag -u dùng để cho biết URL của form đăng nhập mà bạn muốn tấn công SQL Injection. Đây là flag bắt buộc phải có khi dùng công cụ SQLmap.

Về form-parameter, mình sẽ trình bày trong bài tiếp theo khi chúng ta thực hành khai thác lỗi SQL Injection.

Khi chạy câu lệnh trên, SQLmap sẽ tự động kiểm tra xem mục tiêu có dính lỗi SQL Injection hay không? Đồng thời, trong nhiều trường hợp, nó sẽ cung cấp một vài thông tin khá hữu ích như:

  • Tên hệ điều hành
  • Tên và version của cơ sở dữ liệu SQL
  • Tên web server
  • v.v

Ở bài tới, thực hành khai thác SQL Injection, mình sẽ hướng dẫn sâu hơn về các tính năng của SQLmap. Còn với task16 của phòng CC:Pentesting. Các bạn hãy dùng thông tin xuất ra từ câu lệnh bên dưới để trả lời nhé.

man sqlmap

Cám ơn các bạn đã theo dõi,

Vincent Nguyễn

Advertisement

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 )

Twitter picture

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

Facebook photo

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

Connecting to %s