Khai thác XSS với Javascript / JPEG Polyglot

Cũng giống như PNG, JPEG và DOC là các loại tệp hợp lệ, đa giác là sự kết hợp của hai loại tệp khác nhau. Ví dụ: Phar + JPEG (tệp lưu trữ PHP và tệp JPEG), GIFAR (tệp Gif và Rar) Javascript + JPEG, v.v.
Các ứng dụng chỉ cho phép một số loại tệp nhất định trên các tính năng như tải tệp lên và không cho phép các loại tệp khác như tệp .php hoặc .js vì chúng có thể cho phép kẻ tấn công tải lên các tệp độc hại trên ứng dụng. Các ứng dụng thực hiện kiểm tra lọc phần mở rộng như phần mở rộng kép (.jpg.php) hoặc sử dụng byte rỗng trong phần mở rộng (.php% 00.jpg), tên tệp (.htaccess, .config, v.v.) và nếu chữ ký của tệp được tải lên cũng phù hợp với loại nội dung của nó.
Ứng dụng khác nhau sử dụng các phương pháp khác nhau và đa giác có thể được sử dụng để bỏ qua một số kiểm tra xác thực này.
Cấu trúc JPEG
Hình ảnh JPEG được biểu diễn dưới dạng một chuỗi các phân đoạn trong đó mỗi phân đoạn bắt đầu bằng tiêu đề. Mỗi tiêu đề bắt đầu bằng một số byte. Trọng tải theo sau bởi tiêu đề là khác nhau tùy theo loại tiêu đề. Các loại điểm đánh dấu JPEG phổ biến như được liệt kê bên dưới:
0xffd8: “Start of Image”,
0xffe0: “Application Default Header”,
0xffdb: “Quantization Table”,
0xffc0: “Start of Frame”,
0xffc4: “Define Huffman Table”,
0xffda: “Start of Scan”,
0xffd9: “End of Image”
Phần đầu của tiêu đề hình ảnh chứa FF D8. Nếu chúng tôi không nhìn thấy nó, chúng tôi có thể cho rằng đây là một số tệp khác. Một điểm đánh dấu quan trọng khác là FF D9 cho biết phần cuối của hình ảnh.
Để làm cho tải trọng trông giống như một tệp JPEG hợp pháp, chúng tôi sẽ thêm độ dài của tiêu đề, tiêu đề nhận xét, các byte rỗng vào pad và sau đó là vectơ tấn công javascript của chúng tôi.
Giả sử vector tấn công là */=alert(“XSS”)/*
Chuyển đổi nó thành hệ thập lục phân sẽ trông như thế này.

Tải trọng trong hex: -
2A 2F 3D 61 6C 65 72 74 28 22 58 53 53 2E 22 29

Tôi có một image test.jpg và dưới đây là hexdump của test.jpg. Với sự trợ giúp của trình soạn thảo ghex , chúng tôi sẽ thay thế một số ký tự hex và lưu chúng.

Như chúng ta biết đầu tiên FF D8
là phần bắt đầu của hình ảnh, hai byte tiếp theo đại diện cho hai byte sắp tới, 00 10
đại diện cho độ dài của tiêu đề JPEG mà tính theo thập phân tương đương là 16 byte.
Thời gian tiêm
Chúng tôi sẽ đưa tải trọng của chúng tôi vào giữa FF E0
và FF DB
. Hãy bắt đầu với 2F 2A
đại diện hex của / *

Nếu bạn nhận thấy chúng tôi vừa thay thế 00 10
trước đó bằng 2F 2A
và giá trị tương đương thập phân của hex 2F 2A
là 12074 byte. Vì vậy, bây giờ tiêu đề hình ảnh được thay đổi từ 16 byte thành 12074 byte.

Từ ảnh chụp màn hình ở trên, chúng ta có thể thấy kích thước của trọng tải của chúng ta là 18 byte, vì vậy chúng ta phải xóa các byte còn lại bằng null là 12074–16–18 = 12040 byte.

Các lệnh trên sẽ đọc test.jpg, chèn trọng tải của chúng tôi vào giữa các 2F 2A FF DB
lần thay đổi hệ lục thức vào bộ đệm, thêm 12040 byte rỗng và ghi nó vào tệp test_new.jpg. Bây giờ trong trình soạn thảo ghex, hãy đóng thẻ nhận xét trướcFF D9

Code to execute image as javascript:-
<script charset="ISO-8859-1" src="test_new.jpeg">
Hãy kiểm tra nó trong trình duyệt.

Đa giác javascript / jpeg của chúng tôi hoạt động!
Cập nhật: Mozilla đã sửa lỗi này trong Firefox 51 và các phiên bản sau.
Chia sẻ với bạn bè của bạn nếu bạn thấy nó thú vị.
Cảm ơn bạn đã đọc.