PHP RCE bypass disable func
Last updated
Was this helpful?
Last updated
Was this helpful?
đâ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: