การโจมตีเป็นไปได้ในการกำหนดค่า nginx ซึ่งการส่งต่อไปยัง PHP-FPM ดำเนินการโดยการแยกส่วนของ URL โดยใช้ "fastcgi_split_path_info" และกำหนดตัวแปรสภาพแวดล้อม PATH_INFO แต่ไม่ได้ตรวจสอบการมีอยู่ของไฟล์ก่อนโดยใช้ "try_files $fastcgi_script_name" คำสั่งหรือ “if (!-f $) document_root$fastcgi_script_name)" ปัญหาก็คือเช่นกัน
ตำแหน่ง ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
คุณสามารถติดตามวิธีแก้ปัญหาได้ในชุดการแจกจ่ายในหน้าเหล่านี้:
try_files $fastcgi_script_name =404;
ปัญหาเกิดจากข้อผิดพลาดเมื่อจัดการพอยน์เตอร์ในไฟล์
หากคำสั่ง fastcgi_split_path_info ระบุการแยกเส้นทางสคริปต์โดยใช้นิพจน์ทั่วไปที่ไวต่อการขึ้นบรรทัดใหม่ (ตัวอย่างเช่น หลายตัวอย่างแนะนำให้ใช้ "^(.+?\.php)(/.*)$") ผู้โจมตีสามารถมั่นใจได้ว่า ค่าว่างถูกเขียนลงในตัวแปรสภาพแวดล้อม PATH_INFO ในกรณีนี้ให้ดำเนินการต่อไป
ด้วยการร้องขอ URL ที่จัดรูปแบบด้วยวิธีใดวิธีหนึ่ง ผู้โจมตีสามารถเปลี่ยนตัวชี้ path_info ไปเป็นไบต์แรกของโครงสร้าง “_fcgi_data_seg” และการเขียนเลขศูนย์ลงในไบต์นี้จะนำไปสู่การเคลื่อนไหวของ “char* pos” ชี้ไปยังพื้นที่หน่วยความจำที่อยู่ก่อนหน้านี้ ถัดไปที่เรียกว่า FCGI_PUTENV จะเขียนทับข้อมูลในหน่วยความจำนี้ด้วยค่าที่ผู้โจมตีสามารถควบคุมได้ หน่วยความจำที่ระบุยังเก็บค่าของตัวแปร FastCGI อื่น ๆ ด้วย และด้วยการเขียนข้อมูล ผู้โจมตีสามารถสร้างตัวแปร PHP_VALUE สมมติและบรรลุการเรียกใช้โค้ดของพวกเขา
ที่มา: opennet.ru