Tải bản đầy đủ (.docx) (48 trang)

Hướng dẫn chi tiết khai thác lỗi SQL injection

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.92 MB, 48 trang )

Mục lục
Table of Contents
Page 1
Web1: SQL injection - Con đường khai thác phổ biến: qua “user input”.
Giới thiệu
Wikipedia: “Sql Injection (SQLi) là một kỹ thuật cho phép những kẻ tấn công lợi
dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các
thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành
các câu lệnh SQL bất hợp pháp, Sql Injection có thể cho phép những kẻ tấn công
thực hiện các thao tác, thêm, sửa, xóa… trên cơ sở dữ liệu của ứng dụng. Lỗi này
thường xảy ra trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị
cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase ”
Sql Injection được mô tả như là một trong những lỗ hổng bảo mật web nguy hiểm
nhất. Khai thác Sql Injection, ngoài việc đoạt được quyền kiểm soát về mặt dữ liệu
như đã nói ở trên, hacker còn có thể cài đặt backdoor trên server mà ứng dụng
đang chạy, qua đó kiểm soát toàn bộ hệ thống…
Chúng ta sẽ cùng tìm hiểu về chủ đề này theo các chuyên đề nhỏ dưới đây:
Web1: SQL injection - Con đường khai thác phổ biến : qua “user input”
Web2: SQL injection - Các con đường khai thác khác
Web3: SQL injection - Kỹ thuật khai thác: Các hướng khai thác
Web4: SQL injection - Kỹ thuật khai thác: Các bước khai thác
Web5: SQL injection - Kỹ thuật khai thác: Một số kỹ thuật vượt qua cơ chế lọc
Web6: SQL injection - Một số tools khai thác
Web7: SQL injection - Các cách phòng chống & Kết luận.
W1: SQL injection - Con đường khai thác phổ biến : qua “user input”
User input điển hình thường đến từ các form nhập liệu, form search hay link…
Những dữ liệu này được web browser gửi đến server thông qua phương thức HTTP
Page 2
GET hay POST và trở thành các tham số cho ứng dụng web truy cập tới cơ sở dữ
liệu. Ví dụ như trong một form search, khi người dùng điền vào “Sql Injection”,
đơn giản ứng dụng web sẽ truy cập cơ sở dữ liệu và tìm ra các bản ghi mà nội dung


của nó chứa từ khóa “Sql Injection” để trả lại kết quả cho người dùng.
Một trường hợp khác phổ biến hơn trong kỹ thuật tấn công Sql Injection, khi người
dùng request một tài liệu mà các tham số của nó được truyền qua url (như ở ảnh
minh họa bên dưới, tham số id được truyền qua url theo phương thức HTTP GET).
Khi nhận được request, ứng dụng web tìm trong cơ sở dữ liệu và trả về cho người
dùng bài viết có id=31.
Sau đây là ví dụ về việc khai thác thông qua “user input”
Các bạn có thể truy cập vào link sau: />id=1
Page 3
Site này sẽ truy cập vào cơ sở dữ liệu và hiển thị cho người sử dụng Item ID và
Price tương ứng với giá trị của biến id trên URL (ở đây id = 1).
Dựa trên lỗ hổng của việc kiểm tra giá trị đầu vào của biến id, ta có thể khai thác
và thực thi những câu lệnh SQL. Ở đây, ta sẽ thay đổi URL để lấy được phiên bản
của hệ quản trị cơ sở dữ liệu và tên của cơ sở dữ liệu.
Thay đổi biến id thành như sau: id=1 union select @@version,database(),6 limit
1,1. Sau đó gửi request đến web server.
Page 4
Như vậy, ta xác định được phiên bản của hệ quản trị cơ sở dữ liệu là MySQL
5.1.71-community-log và tên của cơ sở dữ liệu là my_zixem.
Tùy vào các câu truy vấn chúng ta chèn vào mà chúng ta sẽ thu thập được những
thông tin mong muốn hay những hành động phá hoại như xóa bảng trong cơ sở dữ
liệu, upload shell lên web server phục vụ việc khai thác về sau. Chi tiết về các
bước thực hiện để làm được những điều này sẽ được trình bày trong các chuyên đề
sau.
Web2: SQL injection - Các con đường khai thác khác
Page 5
Thông qua cookies
Cookies là những tệp tin lưu trữ thông tin trạng thái của người dùng khi truy cập
các ứng dụng web. Những thông tin này do người lập trình quyết định, được tạo ra
ở server và lưu trữ tại client. Khi người dùng truy cập lại ứng dụng web, cookies

được browser gửi lên server giúp phục hồi lại những trạng thái của người dùng
trong lần truy cập trước đó. Do được lưu trữ ở client nên người dùng có thể chỉnh
sửa tùy ý, vì vậy nếu ứng dụng web sử dụng những thông tin lưu trong cookies để
xây dựng các truy vấn tới cơ sở dữ liệu thì hacker hoàn toàn có thể chèn vào
cookies những script sql để thực hiện một cuộc tấn công Sql Injection.
Có nhiều công cụ cho phép xem, thêm mới và chỉnh sửa cookie, trong đó addon
Cookies Manager của firefox là một công cụ khá tiện lợi. Ta có thể tải về và cài đặt
vào firefox một cách dễ dàng.
Page 6
Bây giờ, chúng ta cùng thực hiện việc khai thác thông qua cookie.
Các bạn truy cập vào link sau: />Page 7
Ở đây, ta sẽ dụng addon Live HTTP headers của firefox để thực hiện việc khai
thác.
Page 8
Sau khi khởi chạy Live HTTP headers, chúng ta tải lại trang lần nữa để Live HTTP
headers bắt các request gửi lên server. Chọn lần lượt như hình sau:
Page 9
Một cửa sổ mới hiện ra cùng với nội dung cookie: exploit=1
Page 10
Sửa giá trị của exploit thành như sau:
exploit=1'/**/union/**/select/**/1,@@version,database(),4/**/limit/**/1,1 %0b-
Chọn Replay và xem kết quả.
Page 11
Kết quả:
Page 12
Như vậy, ta xác định được phiên bản của hệ quản trị cơ sở dữ liệu là MySQL
5.1.71-community-log và tên của cơ sở dữ liệu là my_zerocoolhf.
Thông qua các biến server
Biến server có thể là một khái niệm tương đối lạ lẫm nhưng nó không hề mới. Một
số ví dụ của biến server là Http header, Network header… Không phổ biến lắm

nhưng các giá trị được lưu trong biến server có thể được ứng dụng web sử dụng
như trong việc logging truy cập hay thống kê truy cập theo user agent… Những
công việc này đều có sự tương tác với cơ sở dữ liệu nên các hacker hoàn toàn có
thể sử dụng các biến server trong việc khai thác Sql Injection.
Page 13
Các addon của firefox hỗ trợ rất tốt những việc này, Tamper Data hay Live HTTP
headers (đã được ví dụ ở trên) có thể giúp chúng ta bắt những request gửi từ client
lên web server, từ đó chúng ta có thể dễ dàng thay đổi các biến server (http
header…) trước khi gửi chúng tới server. Việc khai thác thông qua các biến server
tương tự như khai thác thông qua cookie.
Tamper Data:
Second-order Injection
Đây là kỹ thuật ít được sử dụng vì rất khó để nhận biết một ứng dụng web có bị
Page 14
mặc lỗi này hay không. Kỹ thuật này được mô tả như sau : Trước hết, ta sẽ
“inject” vào cơ sở dữ liệu một đoạn mã. Đoạn mã này chưa hề gây nguy hiểm cho
hệ thống nhưng nó sẽ được sử dụng làm bàn đạp cho lần inject tiếp theo. Chúng ta
hãy xem một ví dụ cụ thể để hiểu hơn về kỹ thuật này.
Chúng ta sẽ truy cập vào một ứng dụng web và tìm cách đăng ký một tài khoản có
username là "administrator' ". Sau đó chúng ta sẽ thực hiện thao tác thay đổi mật
khẩu. Thao tác thay đổi mật khẩu được ứng dựng web xử lý như sau :
Với username đã đăng ký ở trên, câu truy vấn trên trở thành :
Như vậy, ta có thể thay đổi được password của tài khoản administrator và hoàn
toàn có thể đăng nhập dưới tên tài khoản administrator.
Web3: SQL injection – Các hướng khai thác
1. Boolean based và Time based Blind SQL injection
Boolean based: Cơ sở của kỹ thuật này là việc so sánh đúng sai để tìm ra từng ký
tự của những thông tin như tên bảng, tên cột… Do đó, với dải giá trị chữ số, chữ
cái (bao gồm cả hoa, thường), và một số ký tự đặc biệt, việc so khớp trở nên rất
khó khăn và đòi hỏi nhiều thời gian. Do đó việc khai thác lỗi chủ yếu được tiến

hành bằng tools.
Page 15
Trong kỹ thuật Blind SQLi, chúng ta cũng có nhiều phương pháp khác nhau. Điểm
khác biệt giữa các phương pháp này là sự tối ưu thời gian. Chúng ta sẽ cùng tìm
hiểu về blind sql injection cũng như các phương pháp của nó trong các chuyên đề
sau.
Time based: Giống như boolean based attacks chỉ khác nhau về cách suy diễn, nó
dựa thời gian xử lý của cơ sở dữ liệu sau đó trả về kết quả để xác định câu truy vấn
Sql thực hiện thành công.
2. Union query based
Đây là phương pháp phổ biến khi khai thác Sql injection. Cơ sở của nó là sử dụng
từ khóa union để gộp các kết quả của các mệnh đề select, qua đó lấy được thông tin
từ cơ sở dữ liệu. Các bạn có thể xem ví dụ về việc sử dụng phương pháp này trong
khai thác SQL injection trong các chuyên đề trước: W1: SQL injection - Con
đường khai thác phổ biến : qua “user input” và W2: SQL injection - Con đường
khai thác khác
3. Batched query
Page 16
Đây là phương pháp áp dụng khả năng thực thi cùng lúc nhiều câu lệnh Sql của
một số hệ quản trị cơ sở dữ liệu và khả năng hỗ trợ của ngôn ngữ lập trình. Phương
pháp này rất mạnh mẽ và gây nguy hiểm ngay với hệ thống. Bằng cách thêm vào
một dòng lệnh Update, Insert hay Delete, dữ liệu trong cơ sở dữ liệu của ứng dụng
web không còn toàn vẹn nữa.
Chúng ta có thể chèn vào câu lệnh Sql như sau để xóa 1 bảng trong cơ sở dữ liệu:
4. Order by clause
Không giống như các phương pháp trên, nội dung inject nằm trong mệnh đề điều
kiện where. Trong phương pháp này, chúng ta sẽ cố gắng tiêm mã script vào mệnh
Page 17
đề order. Chúng ta hãy xem đến một kịch bản sau:
Người lập trình muốn liệt kế sản phẩm của công ty bao gồm các thông tin : Mã

sản phẩm, Tên sản phầm, Ngày tháng… và có chức năng cho pháp người dùng tủy
chỉnh xem họ muốn sắp xếp theo thứ tự ngày tháng, theo tên hay mã của sản
phẩm.
Câu truy vấn được xây dựng như sau :
Trong trường hợp này chúng ta không thể thêm trực tiếp một mệnh đề sub select
thông qua từ khóa union như mọi khi được. Một cách khai thác đó là sử dụng
BATCHED QUERY hoặc có thể tham khảo cách sau:
Trong phương pháp trên, chúng ta đã inject được một sub select nhưng rõ ràng
cách thực hiện này giờ đây phải kết hợp cả với kỹ thuật BOOLEAN BASED
BLIND SQLI.
Page 18
Web4: SQL injection - Các bước khai thác khác
1. Phát hiện
Một cách thông thường, để phát hiện một ứng dụng web có dính lỗi SQL injection
hay không là thêm vào câu truy vấn các meta character trong các hệ quản trị cơ sở
dữ liệu, chẳng hạn như dấu nháy đơn (single quote), dấu nháy kép (double quote),
dấu chấm phẩy (semi colon) và các ký tự comment ( , ##, /**/)… và chờ xem ứng
dụng web sẽ xứ lý câu truy vấn đó như thế nào.
Các bạn truy cập vào link sau: />Page 19
Thêm vào cuối liên kết trên một trong các meta character đã nói ở trên, chẳng hạn
ta thêm vào dấu nháy đơn: '
Thông báo lỗi từ mysql xuất hiện, như vậy trang web này đã bị dính lỗi SQL
injection.
2. Thu thập thông tin về hệ quản trị cơ sở dữ liệu
Page 20
Khi phát hiện ứng dụng bị dính lỗi SQL injection, công việc cần làm tiếp theo là
thu thập thông tin về hệ quản trị cơ sở dữ liệu mà ứng dụng đang dùng, thông tin
này bao gồm loại cơ sở dữ liệu (mysql, mssql, oracle…) và phiên bản của nó.
Để xác định hệ loại quản trị mà ứng dụng đang sử dụng, chúng ta có thể đánh giá
theo nhiều tiêu chí. Có thể đánh giá qua thông báo lỗi:

Thông báo lỗi từ MS-SQL – IIS
Thông báo lỗi từ MySQL – Apache
Trong trường hợp ở trên, thông báo lỗi cho biết ứng dụng web sử dụng MySQL.
3. Xác định số lượng cột trong mệnh đề select
Khi khai thác SQL injection, chúng ta thường sử dụng một hay nhiều mệnh đề
select phụ (subselect), điều này được thực hiện thông qua từ khóa union. Union là
từ khóa dùng để gộp kết quả của nhiều mệnh đề select do đó trong mỗi mệnh đề
Page 21
select đòi hỏi số lượng các trường đều phải bằng nhau và đều bằng số lượng các
trường được select trong mệnh đề select ban đầu. Xét một ví dụ cụ thể :
Ở đây, trong mệnh đề select ban đầu chọn ra 3 trường là id, content và author. Do
đó mệnh đề select sau từ khóa union cũng cần phải có đúng 3 trường. Nếu số
trường select ở mệnh đề select sau union không bằng số lượng các trường được
select trong mệnh đề select đầu tiên, chúng ta sẽ nhận được thông báo lỗi. Vậy làm
sao để biết để biết được chính xác mệnh đề select đầu tiền chọn ra bao nhiêu
trường. Chúng ta có thể thực hiện thử dần bằng cách tăng dần số lượng cột trong
mệnh đề select sau union (bắt đầu từ 1). Khi nào không thấy thông báo lỗi xuất
hiện thì đó chính là số lượng cột cần tìm.
Một cách khác để làm điều này, nhanh chóng hơn đó là sử dụng 'order by'. Trong
các hệ quản trị cơ sở dữ liệu từ khóa 'order by' được sử dụng để sắp xếp thứ tự cho
các bản ghi thu được trong mệnh để select. Sau order by có thể là tên một cột để
xác định rằng kết quả thu về sẽ được sắp xếp theo giá trị của cột đó (có thể tăng
dần hay giảm dần). Sau order by cũng có thể là số thứ tự vị trí của cột đó. Nếu giá
trị sau order lớn hơn số cột được select thì chúng ta sẽ thấy thông báo lỗi.
Quay lại với site bị dính lỗi SQL injection ở trên, ta dùng 'order by <num>', tăng
dần <num> để xác định số cột.
order by 1 - => ok
order by 2 -=> ok
order by 3 - => ok
Page 22

Tiếp tục: order by 4 - => xuất
hiện lỗi.
Page 23
Như vậy, ta xác định được số cột là 3.
4. Xác định thông tin
Page 24
Sau khi lấy được các thông tin cơ bản, chúng ta sẽ tiến hành khai thác SQL
injection để lấy cơ sở dữ liệu hay thực hiện những hành vi khác thông qua lỗ hổng
này.
Xác định tên bảng, cột: chúng ta có nhiều cách để làm được công việc này, một
trong những cách đó là “đoán” vì nó nhanh chóng và trong những trường hợp cụ
thể, đây là cách rất hữu ích. Ví dụ: một số tên bảng thông dụng như : user, users,
admin, administrator, staff, account, manager… (chú ý tiền tố tbl_ rất hay được
các lập trình viên sử dụng để đặt cho tên bảng).
Một cách chính qui hơn để biết được tên bảng, tên cột là sử dụng đối tượng
information_schema. Đối tượng này cung cấp các thông tin về tables, columns,
views và procedures… của cơ sở dữ liệu.
Bây giờ, trở lại site />Truy vấn SQL với URL trên có số cột là 3 (đã xác định ở trên).
Tiến hành request với URL sau:
union select 1,2,3 -
Page 25

×