Deserialization php CTF

Đọc các tệp cục bộ với đối tượng PHP Tiêm thông qua Cookie unserialize() (Nuit du Hack 2016 web 10 writeup)

Sau một thời gian ngắn nghỉ ngơi, tôi quyết định tham gia CTF một lần nữa và tôi vô cùng hạnh phúc về điều đó. Nuit du CTF 2016 là một giải đấu hay với một số thử thách thú vị. Hãy bắt đầu với Web 100

Chúng tôi được chào đón với một trang đăng ký nơi chúng tôi có thể nhập tên người dùng và tuổi. Sau đó, nó đưa chúng tôi đến một trang đăng nhập nơi chúng tôi có thể nhập tên người dùng và nó đăng nhập chúng tôi. Tất cả các trường đầu vào đều sạch (không thể tiêm bất kỳ loại nào). Nhưng có một cookie thú vị tên là cook với giá trị Tzo0OiJVc2VyIjoyOntzOjM6ImFnZSI7aToxMDtzOjQ6Im5hbWUiO3M6MzoibG9sIjt9 trông thực sự đáng ngờ. Giải mã Base64 giá trị cho kết quả O:4:"User":2:{s:3:"age";i:10;s:4:"name";s:3:"lol";}. Điều đó trông khá giống dữ liệu nối tiếp. Vì vậy, có thể để kiểm tra các yêu cầu, họ sẽ hủy xác thực các cookie có thể dễ bị tấn công

Nhưng để tấn công thành công, chúng ta cần lấy tên lớp để có thể sử dụng nó để xây dựng một tải trọng phù hợp. Vì vậy, tôi bắt đầu tìm hiểu xem có cách nào để chúng tôi có thể lấy được mã nguồn hay không và đôi khi phải mất một thời gian tôi mới phát hiện ra có một thư mục /git/. Nhân bản git và đặt lại HEAD (

0) Tôi đã nhận được các tệp cần thiết. Nó chứa 3 tệp chính có tên userclass. php, lớp tập tin. php và ufhkistgfj. php. Tệp sau chứa cờ (trong máy chủ) mà chúng ta nên đọc. lớp tập tin. php trông rất thú vị

filename);
	}
}
?>

Vì vậy, về cơ bản, nó đọc các tệp cho chúng tôi, đó chính xác là những gì chúng tôi muốn. Hãy xây dựng dữ liệu nối tiếp

Bây giờ nội dung bên trong tệp được tuần tự hóa. txt sẽ trông như thế này.

1. Chúng tôi muốn đọc tệp có tên 
2. Vì vậy, hãy sửa đổi tải trọng một chút để nó có thể đọc ufhkistgfj. php trông như thế này. 
3. Bây giờ hãy mã hóa base64 và gửi nó qua cookie. Chúng tôi có thể lấy cờ trong phản hồi

Đối với những người không biết về lỗ hổng unserialize(), hãy đọc tiếp

(de)tuần tự hóa ()

serialize() về cơ bản chuyển đổi một đối tượng thành một chuỗi. Vì vậy, bạn có thể đoán những gì unserialize làm (nó chuyển đổi ngược dữ liệu được tuần tự hóa thành các đối tượng). Khi dữ liệu do người dùng kiểm soát đi qua unserialize() mà không được khử trùng, nó có thể dẫn đến nhiều lỗ hổng khác nhau từ việc đọc tệp cục bộ đến thực thi mã từ xa. Để khai thác thành công, phải đáp ứng 2 điều kiện

  1. Tất cả các lớp được sử dụng cho cuộc tấn công phải được khai báo và nhập đúng cách
  2. Ứng dụng phải có một lớp triển khai phương thức ma thuật PHP (__wakeup(), __sleep(), __toString(), v.v. )

Các điều kiện trên được thỏa mãn trong các trường hợp của chúng tôi (Lớp chúng tôi cần là

4 đã được xác định và nó chứa hàm ma thuật __toString). Hãy để chúng tôi lấy ví dụ trên và cố gắng hiểu (đọc các tệp tùy ý). Có một lớp người dùng được gọi là “Người dùng” được định nghĩa trong lớp người dùng. php

name . ' you have ' . $this->age . ' years old. 
'; } } ?>

Lớp này được nhập vào chỉ mục. php và sử dụng dữ liệu đến từ người dùng, nó tạo chuỗi cookie được tuần tự hóa

________số 8_______

Vì vậy, về cơ bản, một đối tượng mới có tên

5 được tạo bằng cách sử dụng chúng đặt thuộc tính tuổi và tên từ dữ liệu đầu vào của người dùng đến. Sau đó, biến được tuần tự hóa () và được đặt làm cookie khi hết hạn 1 giờ. Dữ liệu tuần tự hóa trông như thế này

O:4:"User":2:{s:3:"age";i:10;s:4:"name";s:3:"lol";}

7

Bây giờ hãy nhìn vào kết quả. php nơi

8 xảy ra

name;
     	}
     	if(isset($_POST["name_2"]) && !empty($_POST['name_2']) && $ff==$_POST['name_2'])
     	{   
?>

Bạn có thể thấy rằng cookie được unserialize() và lưu vào một biến (hiện là đối tượng) có tên là

9. Nó cũng được phản ánh vào đầu ra, điều đó có nghĩa là nếu chúng ta có thể làm cho nó đọc tệp, nó sẽ tự động lặp lại nội dung tệp cho chúng tôi. Ở đây, điều quan trọng cần lưu ý là họ cũng đang nhập 
name . ' you have ' . $this->age . ' years old. 
'; } } ?>
0 về cơ bản đọc lỗi. đăng nhập. Nhưng vì chúng tôi có thể gửi dữ liệu được tuần tự hóa qua cookie, nên chúng tôi sẽ thay đổi dữ liệu cookie để đọc tệp bằng cách sử dụng ______7_______0. Vì vậy, hãy viết một tập lệnh đơn giản tuần tự hóa dữ liệu cho chúng tôi bằng cách sử dụng fileclasse. php

Chạy đoạn script trên sẽ trả về cho chúng tôi chuỗi

1 nhưng chúng tôi muốn đọc 
2 và không báo lỗi. đăng nhập. Vì vậy, chỉ cần sửa đổi dữ liệu được tuần tự hóa thành tên tệp chúng tôi muốn và đảm bảo rằng bạn thay đổi độ dài cho phù hợp. Vì vậy, tải trọng cuối cùng trở thành. 
3. Cho phép mã hóa Base64 và đặt nó làm giá trị cookie. Làm mới trang (Tốt nhất nên sử dụng burpsuite để xem phản hồi) và trong phản hồi, bạn có thể lấy nội dung của tệp

HTTP/1.1 302 Found
Date: Sun, 03 Apr 2016 08:18:57 GMT
Server: Apache/2.4.10 (Debian) PHP/5.6.19
X-Powered-By: PHP/5.6.19
Expires: Tue, 01 Jan 1971 02:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
Pragma: no-cache
location: index.php
Content-Length: 166
Content-Type: text/html; charset=UTF-8



Bạn có thể xem nội dung tệp trong phản hồi

Người giới thiệu

Đây là một số tài liệu tham khảo tuyệt vời mà bạn có thể sử dụng để tìm hiểu thêm về PHP object Injection và unserialize()