1. Trang chủ
  2. » Tất cả

Hướng dẫn chi tiết khai thác lỗi SQL injection

48 1,8K 3
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 48
Dung lượng 2,37 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Web1: SQL injection - Con đường khai thác phổ biến: qua “user input”.Giới thiệu Wikipedia: “Sql Injection SQLi là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm

Trang 1

Mục lụcTable of Contents

Trang 2

Web1: SQL injection - Con đường khai thác phổ biến: qua “user input”.

Giới thiệu

Wikipedia: “Sql Injection (SQLi) là một kỹ thuật cho phép những kẻ tấn công lợi

dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào 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 trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp, Sql Injection có thể cho phép những kẻ tấn công thực hiện các thao tác, thêm, sửa, xóa… 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 ”

Sql Injection được mô tả như là một trong những lỗ hổng bảo mật web nguy hiểm nhất Khai thác Sql Injection, ngoài việc đoạt được quyền kiểm soát về mặt dữ liệu như đã nói ở trên, hacker còn có thể cài đặt backdoor trên server mà ứng dụng đang chạy, qua đó kiểm soát toàn bộ hệ thống…

Chúng ta sẽ cùng tìm hiểu về chủ đề này theo các chuyên đề nhỏ dưới đây:

Web1: SQL injection - Con đường khai thác phổ biến : qua “user input”

Web2: SQL injection - Các con đường khai thác khác

Web3: SQL injection - Kỹ thuật khai thác: Các hướng khai thác

Web4: SQL injection - Kỹ thuật khai thác: Các bước khai thác

Web5: SQL injection - Kỹ thuật khai thác: Một số kỹ thuật vượt qua cơ chế lọcWeb6: SQL injection - Một số tools khai thác

Web7: SQL injection - Các cách phòng chống & Kết luận

W1: SQL injection - Con đường khai thác phổ biến : qua “user input”

User input điển hình thường đến từ các form nhập liệu, form search hay link… Những dữ liệu này được web browser gửi đến server thông qua phương thức HTTP

Trang 3

GET hay POST và trở thành các tham số cho ứng dụng web truy cập tới cơ sở dữ liệu Ví dụ như trong một form search, khi người dùng điền vào “Sql Injection”, đơn giản ứng dụng web sẽ truy cập cơ sở dữ liệu và tìm ra các bản ghi mà nội dung của nó chứa từ khóa “Sql Injection” để trả lại kết quả cho người dùng.

Một trường hợp khác phổ biến hơn trong kỹ thuật tấn công Sql Injection, khi người dùng request một tài liệu mà các tham số của nó được truyền qua url (như ở ảnh minh họa bên dưới, tham số id được truyền qua url theo phương thức HTTP GET) Khi nhận được request, ứng dụng web tìm trong cơ sở dữ liệu và trả về cho người dùng bài viết có id=31

Sau đây là ví dụ về việc khai thác thông qua “user input”

Các bạn có thể truy cập vào link sau: http://zixem.altervista.org/SQLi/level1.php?id=1

Trang 4

Site này sẽ truy cập vào cơ sở dữ liệu và hiển thị cho người sử dụng Item ID và

Price tương ứng với giá trị của biến id trên URL (ở đây id = 1).

Dựa trên lỗ hổng của việc kiểm tra giá trị đầu vào của biến id, ta có thể khai thác

và thực thi những câu lệnh SQL Ở đây, ta sẽ thay đổi URL để lấy được phiên bản của hệ quản trị cơ sở dữ liệu và tên của cơ sở dữ liệu

Thay đổi biến id thành như sau: id=1 union select @@version,database(),6 limit

1,1 Sau đó gửi request đến web server.

Trang 5

Như vậy, ta xác định được phiên bản của hệ quản trị cơ sở dữ liệu là MySQL

5.1.71-community-log và tên của cơ sở dữ liệu là my_zixem.

Tùy vào các câu truy vấn chúng ta chèn vào mà chúng ta sẽ thu thập được những thông tin mong muốn hay những hành động phá hoại như xóa bảng trong cơ sở dữ liệu, upload shell lên web server phục vụ việc khai thác về sau Chi tiết về các bước thực hiện để làm được những điều này sẽ được trình bày trong các chuyên đề sau

Web2: SQL injection - Các con đường khai thác khác

Trang 6

Thông qua cookies

Cookies là những tệp tin lưu trữ thông tin trạng thái của người dùng khi truy cập các ứng dụng web Những thông tin này do người lập trình quyết định, được tạo ra

ở server và lưu trữ tại client Khi người dùng truy cập lại ứng dụng web, cookies được browser gửi lên server giúp phục hồi lại những trạng thái của người dùng trong lần truy cập trước đó Do được lưu trữ ở client nên người dùng có thể chỉnh sửa tùy ý, vì vậy nếu ứng dụng web sử dụng những thông tin lưu trong cookies để xây dựng các truy vấn tới cơ sở dữ liệu thì hacker hoàn toàn có thể chèn vào

cookies những script sql để thực hiện một cuộc tấn công Sql Injection

Có nhiều công cụ cho phép xem, thêm mới và chỉnh sửa cookie, trong đó addon

Cookies Manager của firefox là một công cụ khá tiện lợi Ta có thể tải về và cài đặt

vào firefox một cách dễ dàng

Trang 7

Bây giờ, chúng ta cùng thực hiện việc khai thác thông qua cookie.

Các bạn truy cập vào link sau: http://zerocoolhf.altervista.org/level4.php?id=1

Trang 8

Ở đây, ta sẽ dụng addon Live HTTP headers của firefox để thực hiện việc khai

thác

Trang 9

Sau khi khởi chạy Live HTTP headers, chúng ta tải lại trang lần nữa để Live HTTP headers bắt các request gửi lên server Chọn lần lượt như hình sau:

Trang 10

Một cửa sổ mới hiện ra cùng với nội dung cookie: exploit=1

Trang 11

Sửa giá trị của exploit thành như sau:

exploit=1'/**/union/**/select/**/1,@@version,database(),4/**/limit/**/1,1 %0b-Chọn Replay và xem kết quả

Trang 12

Kết quả:

Trang 13

Như vậy, ta xác định được phiên bản của hệ quản trị cơ sở dữ liệu là MySQL

5.1.71-community-log và tên của cơ sở dữ liệu là my_zerocoolhf.

Thông qua các biến server

Biến server có thể là một khái niệm tương đối lạ lẫm nhưng nó không hề mới Một

số ví dụ của biến server là Http header, Network header… Không phổ biến lắm

nhưng các giá trị được lưu trong biến server có thể được ứng dụng web sử dụng

như trong việc logging truy cập hay thống kê truy cập theo user agent… Những

công việc này đều có sự tương tác với cơ sở dữ liệu nên các hacker hoàn toàn có thể sử dụng các biến server trong việc khai thác Sql Injection

Trang 14

Các addon của firefox hỗ trợ rất tốt những việc này, Tamper Data hay Live HTTP

headers (đã được ví dụ ở trên) có thể giúp chúng ta bắt những request gửi từ client

lên web server, từ đó chúng ta có thể dễ dàng thay đổi các biến server (http

header…) trước khi gửi chúng tới server Việc khai thác thông qua các biến server tương tự như khai thác thông qua cookie

Tamper Data:

Second-order Injection

Đây là kỹ thuật ít được sử dụng vì rất khó để nhận biết một ứng dụng web có bị

Trang 15

mặc lỗi này hay không Kỹ thuật này được mô tả như sau : Trước hết, ta sẽ

“inject” vào cơ sở dữ liệu một đoạn mã Đoạn mã này chưa hề gây nguy hiểm cho

hệ thống nhưng nó sẽ được sử dụng làm bàn đạp cho lần inject tiếp theo Chúng ta hãy xem một ví dụ cụ thể để hiểu hơn về kỹ thuật này

Chúng ta sẽ truy cập vào một ứng dụng web và tìm cách đăng ký một tài khoản có username là "administrator' " Sau đó chúng ta sẽ thực hiện thao tác thay đổi mật khẩu Thao tác thay đổi mật khẩu được ứng dựng web xử lý như sau :

Với username đã đăng ký ở trên, câu truy vấn trên trở thành :

Như vậy, ta có thể thay đổi được password của tài khoản administrator và hoàn toàn có thể đăng nhập dưới tên tài khoản administrator.

Web3: SQL injection – Các hướng khai thác

1 Boolean based và Time based Blind SQL injection

Boolean based: Cơ sở của kỹ thuật này là việc so sánh đúng sai để tìm ra từng ký

tự của những thông tin như tên bảng, tên cột… Do đó, với dải giá trị chữ số, chữ cái (bao gồm cả hoa, thường), và một số ký tự đặc biệt, việc so khớp trở nên rất khó khăn và đòi hỏi nhiều thời gian Do đó việc khai thác lỗi chủ yếu được tiến hành bằng tools

Trang 16

Trong kỹ thuật Blind SQLi, chúng ta cũng có nhiều phương pháp khác nhau Điểm khác biệt giữa các phương pháp này là sự tối ưu thời gian Chúng ta sẽ cùng tìm hiểu về blind sql injection cũng như các phương pháp của nó trong các chuyên đề sau

Time based: Giống như boolean based attacks chỉ khác nhau về cách suy diễn, nó dựa thời gian xử lý của cơ sở dữ liệu sau đó trả về kết quả để xác định câu truy vấn Sql thực hiện thành công

2 Union query based

Đây là phương pháp phổ biến khi khai thác Sql injection Cơ sở của nó là sử dụng

từ khóa union để gộp các kết quả của các mệnh đề select, qua đó lấy được thông tin

từ cơ sở dữ liệu Các bạn có thể xem ví dụ về việc sử dụng phương pháp này trong khai thác SQL injection trong các chuyên đề trước: W1: SQL injection - Con

đường khai thác phổ biến : qua “user input” và W2: SQL injection - Con đường khai thác khác

3 Batched query

Trang 17

Đây là phương pháp áp dụng khả năng thực thi cùng lúc nhiều câu lệnh Sql của

một số hệ quản trị cơ sở dữ liệu và khả năng hỗ trợ của ngôn ngữ lập trình Phương pháp này rất mạnh mẽ và gây nguy hiểm ngay với hệ thống Bằng cách thêm vào một dòng lệnh Update, Insert hay Delete, dữ liệu trong cơ sở dữ liệu của ứng dụng web không còn toàn vẹn nữa

Chúng ta có thể chèn vào câu lệnh Sql như sau để xóa 1 bảng trong cơ sở dữ liệu:

4 Order by clause

Không giống như các phương pháp trên, nội dung inject nằm trong mệnh đề điều

kiện where Trong phương pháp này, chúng ta sẽ cố gắng tiêm mã script vào mệnh

Trang 18

đề order Chúng ta hãy xem đến một kịch bản sau:

Người lập trình muốn liệt kế sản phẩm của công ty bao gồm các thông tin : Mã sản phẩm, Tên sản phầm, Ngày tháng… và có chức năng cho pháp người dùng tủy chỉnh xem họ muốn sắp xếp theo thứ tự ngày tháng, theo tên hay mã của sản

phẩm

Câu truy vấn được xây dựng như sau :

Trong trường hợp này chúng ta không thể thêm trực tiếp một mệnh đề sub select thông qua từ khóa union như mọi khi được Một cách khai thác đó là sử dụng

BATCHED QUERY hoặc có thể tham khảo cách sau:

Trong phương pháp trên, chúng ta đã inject được một sub select nhưng rõ ràng cách thực hiện này giờ đây phải kết hợp cả với kỹ thuật BOOLEAN BASED

BLIND SQLI

Trang 19

Web4: SQL injection - Các bước khai thác khác

1 Phát hiện

Một cách thông thường, để phát hiện một ứng dụng web có dính lỗi SQL injection

hay không là 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 (single quote), dấu nháy kép (double quote), dấu chấm phẩy (semi colon) 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

Các bạn truy cập vào link sau:http://zerocoolhf.altervista.org/level1.php?id=1

Trang 20

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://zerocoolhf.altervista.org/level1.php?id=1 '

Thông báo lỗi từ mysql xuất hiện, như vậy trang web này đã bị dính lỗi SQL injection

2 Thu thập thông tin về hệ quản trị cơ sở dữ liệu

Trang 21

Khi phát hiện ứng dụng bị dính lỗi SQL injection, công việc cần làm tiếp theo là thu thập thông tin về hệ quản trị cơ sở dữ liệu mà ứng dụng đang dùng, thông tin này bao gồm loại cơ sở dữ liệu (mysql, mssql, oracle…) và phiên bản của nó

Để xác định hệ loại quản trị mà ứng dụng đang sử dụng, chúng ta có thể đánh giá theo nhiều tiêu chí Có thể đánh giá qua thông báo lỗi:

Thông báo lỗi từ MS-SQL – IIS

Thông báo lỗi từ MySQL – ApacheTrong trường hợp ở trên, thông báo lỗi cho biết ứng dụng web sử dụng MySQL

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

Khi khai thác SQL injection, chúng ta thường sử dụng một hay nhiều mệnh đề

select phụ (subselect), điều này được thực hiện thông qua từ khóa 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 đề

Trang 22

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 Xét một ví dụ cụ thể :

Ở đây, trong mệnh đề select ban đầu chọn ra 3 trường là id, content và author Do

đó mệnh đề select sau từ khóa union cũng cần phải có đúng 3 trường Nếu số trường select ở mệnh đề select sau union không bằng số lượng các trường được select trong mệnh đề select đầu tiên, chúng ta sẽ nhận được thông báo lỗi Vậy làm sao để biết để biết được chính xác mệnh đề select đầu tiền chọn ra bao nhiêu

trường Chúng ta có thể thực hiện thử dần bằng cách tăng dần số lượng cột trong mệnh đề select sau union (bắt đầu từ 1) Khi nào không thấy thông báo lỗi xuất hiện thì đó chính là số lượng cột cần tìm

Một cách khác để làm điều này, nhanh chóng hơn đó là sử dụng 'order by' Trong các hệ quản trị cơ sở dữ liệu từ khóa 'order by' được sử 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 đó (có thể tăng

dần hay 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 báo lỗi

Quay lại với site bị dính lỗi SQL injection ở trên, ta dùng 'order by <num>', tăng dần <num> để xác định số cột

http://zerocoolhf.altervista.org/level1.php?id=1' order by 1 - => ok

http://zerocoolhf.altervista.org/level1.php?id=1' order by 2 -=> ok

http://zerocoolhf.altervista.org/level1.php?id=1' order by 3 - => ok

Trang 23

Tiếp tục: http://zerocoolhf.altervista.org/level1.php?id=1' order by 4 - => xuất hiện lỗi.

Trang 24

Như vậy, ta xác định được số cột là 3.

4 Xác định thông tin

Trang 25

Sau khi lấy được các thông tin cơ bản, chúng ta sẽ tiến hành khai thác SQL

injection để lấy cơ sở dữ liệu hay thực hiện những hành vi khác thông qua lỗ hổng này

Xác định tên bảng, cột: chúng ta có nhiều cách để làm được công việc này, một

trong những cách đó là “đoán” vì nó nhanh chóng và trong những trường hợp cụ thể, đây là cách rất hữu ích Ví dụ: một số tên bảng thông dụng như : user, users,

admin, administrator, staff, account, manager… (chú ý tiền tố tbl_ rất hay được

các lập trình viên sử dụng để đặt cho tên bảng)

Một cách chính qui hơn để biết được tên bảng, tên cột là 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

Bây giờ, trở lại site http://zerocoolhf.altervista.org/level1.php?id=1

Truy vấn SQL với URL trên có số cột là 3 (đã xác định ở trên)

Tiến hành request với URL sau: http://zerocoolhf.altervista.org/level1.php?id=-1' union select 1,2,3 -

Trang 26

Lỗi trả về cho ta thấy có vẻ như ‘unio’ đã bị xóa mất.

Thử lại với request: http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select 1,2,3 -

Trang 27

Thành công Ta thấy cột số 2 và 3 bị lỗi.

Lấy phiên bản của hệ quản trị cơ sở dữ liệu và tên cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select 1,version(),database() -

Trang 28

Như vậy tên cơ sở dữ liệu là my_zerocoolhf và phiên bản của hệ quản trị cơ sở dữ liệu là MySQL 5.1.71-community-log.

Tiếp tục, lấy tên các bảng trong cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select all

1,group_concat(table_name),3 from information_schema.tables where

table_schema=database()

Trang 29

-Cơ sở dữ liệu có 2 bảng là auth và book Chúng ta sẽ thử lấy nội dung các bản ghi trong bảng book Trước hết xác định các trường của bảng book

Thực hiện request:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select all

1,group_concat(column_name),3 from information_schema.columns where

table_name=0x626f6f6b

-(0x626f6f6b là mã hex của tên bảng book, tương tự nếu muốn lấy tên các trường của bảng auth thì chỉ cần thay mã hex của auth vào vị trí của 0x626f6f6b)

Trang 30

Tên các trường: id, title, price, author Bây giờ ta sẽ lấy nội dung các bản ghi trong

cơ sở dữ liệu:

http://zerocoolhf.altervista.org/level1.php?id=-1' uniounion select all

1,group_concat(id,0x3a,title,0x3a,price,0x3a,autho r),3 from book

-(group_concat để nối nhiều giá trị với nhau 0x3a là dấu “:”, để ngăn cách cho dễ

nhìn)

Ngày đăng: 14/12/2021, 19:33

TỪ KHÓA LIÊN QUAN

w