PHP RCE bypass disable func

đây là một trong những bài khó nhất ở ijctf 2021

đề cung cấp source code gồm 3 file

check index.php

đầu tiên ở index.php ta có, eval với 15 ký tự, include với 32 ký tự.

ở eval thì được filter qua 2 lớp là filter() và checkLetterNums() ở file filer.php

hàm filter đơn giản chỉ ban trong blacklist, mục tiêu của hàm này là không cho chuyển payload ra GET or POST khác, còn hàm check thì chỉ giới hạn tối đa 4 chữ hoặc số có trong payload thôi.

check phpinfo.html

chú ý đầu tiên là rất nhiều function bị disable, tiếp theo mình thử diff để xem có sót hàm nào không

nhận thấy 2/3 hàm cần thiết để bypass disable function là

putenv,error_log,mail

vậy với ý tưởng của bài này sẽ sử dụng LD_PRELOAD

điểm thứ 2 cần lưu ý là:

session.upload_process.cleanup được tắt (on theo mặc định)

=> không cần phải race để ghi file vào session.

theo như link trên thì để bypass được disable function thì ta cần 2 yếu tố

file .so đã compiler ở trên hệ thống và php code để gọi lib ra.

nhưng php sesion upload process thì sẽ có những content rác nên không thể ghi lib theo cách này.

để ghi file .so vào server thì ta cần hiểu về timeline trong php

ta nhận thấy php upload temp file bị xóa ở cuối time line, vậy whatif mình break php giữa chừng thì sao? hoặc tạo vòng lặp vô hạn để php script không bao giờ ngừng? trong 2 trường hợp trên thì temp file đều sẽ không bị xóa => write .so thành công.

có 1 đặc điểm ở upload temp file này , file sẽ được lưu ở tmp với định dạng

/tmp/php+(random 6 char)

và may thay tên thư mục này được lưu vào session người upload nên sẽ không cần tới việc brute để tìm ra file name.

vậy làm sao để khiến php crash?

ở đây có nói về việc tạo ra Segmentation fault trong php

đơn giản chỉ cần $r="a";$r["a"];

lý thuyết có đủ, vào việc thôi.

đầu tiên compiler một file .c sang .so như sau

gcc -shared -fPIC pay.c -o test_x64.so

upload file này đồng thời làm crash php

xem vị trí file vừa upload bằng cách include session vào

tiếp theo như thường lệ thì sử dụng sesion upload process để write php

include this session file to get reverse shell

source: https://github.com/sqrtrev/IJCTF2021-Memory

Last updated

Was this helpful?