การแข่งขันการเขียนโปรแกรม การแข่งขันการเขียนโปรแกรม Evasion xmlrpc php.ini

30.11.2023 เราเตอร์และโมเด็ม

WordPress มีเครื่องมือในตัวสำหรับการเข้าถึงเว็บไซต์ของคุณจากระยะไกลอยู่เสมอ แน่นอนว่าบางครั้งคุณต้องไปที่ไซต์ของคุณ แต่คอมพิวเตอร์ของคุณอยู่ไกลจากคุณ เป็นเวลานานแล้วที่วิธีแก้ปัญหาคือไฟล์ชื่อ xmlrpc.php อย่างไรก็ตาม ในช่วงไม่กี่ปีที่ผ่านมา ไฟล์นี้ได้กลายเป็นปัญหามากกว่าวิธีแก้ปัญหา

ด้านล่างนี้เราจะมาดู xmlrpc.php อย่างละเอียดยิ่งขึ้น และสาเหตุที่มันถูกสร้างขึ้น นอกจากนี้เรายังจะดูปัญหาด้านความปลอดภัยทั่วไปที่อาจเกิดขึ้นและวิธีแก้ไขสำหรับไซต์ WordPress ของคุณ

XML-RPC เป็นคุณลักษณะ WordPress ที่ช่วยให้สามารถถ่ายโอนข้อมูลได้ โดยมี HTTP ทำหน้าที่เป็นการขนส่งและ XML สำหรับการเข้ารหัส เนื่องจาก WordPress ไม่ใช่ระบบปิดและมักจะสื่อสารกับระบบอื่น ๆ จึงพบวิธีแก้ไขปัญหานี้

ตัวอย่างเช่น สมมติว่าคุณต้องการโพสต์ไปยังเว็บไซต์ของคุณจากโทรศัพท์มือถือ คุณต้องใช้การเข้าถึงระยะไกลที่จัดทำโดย xmlrpc.php

ฟังก์ชันหลักของ xmlrpc.php คือความสามารถในการเชื่อมต่อกับไซต์จากสมาร์ทโฟน การใช้งานแทร็กแบ็คและลิงก์แบ็คจากไซต์อื่น และฟังก์ชันบางอย่างที่เกี่ยวข้องกับปลั๊กอิน Jetpack

เหตุใด Xmlrpc.php จึงถูกสร้างขึ้นและใช้งานอย่างไร

การใช้งาน XML-RPC ย้อนกลับไปในยุคแรกๆ ของ WordPress และก่อนที่ WordPress จะกลายเป็น WordPress เสียอีก

ย้อนกลับไปในยุคแรกๆ ของอินเทอร์เน็ต การเชื่อมต่อทำได้ช้ามากและกระบวนการบันทึกและเผยแพร่บนเว็บก็ยากขึ้นและใช้เวลานานมาก แทนที่จะทำการเปลี่ยนแปลงโดยตรงผ่านเบราว์เซอร์ ส่วนใหญ่ทำให้การเปลี่ยนแปลงเป็นแบบออฟไลน์ จากนั้นจึงคัดลอกและวางเนื้อหาทางออนไลน์ และกระบวนการนี้ยังห่างไกลจากอุดมคติ

วิธีแก้ไข (ในขณะนั้น) คือการสร้างไคลเอ็นต์การเขียนบล็อกแบบออฟไลน์ซึ่งคุณสามารถเขียนเนื้อหา จากนั้นเชื่อมต่อกับบล็อกและเผยแพร่ได้ การเชื่อมต่อนี้ทำผ่าน XML-RPC ด้วยฟังก์ชันการทำงานหลักของ XML-RPC แอปพลิเคชันในยุคแรกๆ ที่ใช้การเชื่อมต่อเหล่านี้ทำให้ผู้คนสามารถเข้าถึงไซต์ WordPress ของตนจากอุปกรณ์อื่นๆ ได้

XML-RPC วันนี้

ในปี 2008 WordPress เวอร์ชัน 2.6 มีตัวเลือกในการเปิดหรือปิดใช้งาน XML-RPC อย่างไรก็ตาม ด้วยการเปิดตัวแอป WordPress iPhone การสนับสนุน XML-RPC จะถูกเปิดใช้งานตามค่าเริ่มต้น และไม่มีตัวเลือกให้ปิดใช้งาน วันนี้ก็ยังคงเป็นเช่นนั้น

แน่นอนว่าฟังก์ชันการทำงานของไฟล์นี้ลดลงอย่างมากเมื่อเวลาผ่านไป และขนาดไฟล์ก็ลดลงจาก 83kb เป็น 3kb จึงไม่มีบทบาทเหมือนเมื่อก่อนอีกต่อไป

คุณสมบัติ XML-RPC

ด้วย WordPress Application Programming Interface (API) ใหม่ เราคาดว่า XML-RPC จะถูกปิดใช้งานอย่างสมบูรณ์ ปัจจุบัน API ใหม่นี้ยังคงอยู่ในการทดสอบและสามารถเปิดใช้งานได้ผ่านปลั๊กอินพิเศษเท่านั้น

แม้ว่าคุณจะสามารถคาดหวังได้ว่า API จะรวมอยู่ในแกนหลักของ WordPress โดยตรงในอนาคต แต่ก็ไม่จำเป็นต้องใช้ xmlrpc.php เลย

API ใหม่ไม่สมบูรณ์แบบ แต่ให้การรักษาความปลอดภัยที่ดีและเชื่อถือได้ ไม่เหมือน xmlrpc.php

เหตุใดจึงต้องปิดการใช้งาน Xmlrpc.php

ปัญหาที่ใหญ่ที่สุดของ XML-RPC คือความปลอดภัย ปัญหาไม่เกี่ยวข้องโดยตรงกับ XML-RPC แต่สามารถใช้เพื่อเปิดการโจมตีไซต์ของคุณได้

แน่นอนคุณสามารถป้องกันตัวเองด้วยรหัสผ่านที่รัดกุมและปลั๊กอินความปลอดภัย WordPress แต่โหมดการป้องกันที่ดีที่สุดคือการปิดเครื่อง

มีจุดอ่อนหลักสองประการของ XML-RPC ที่เคยถูกนำไปใช้ในอดีต

แบบแรกใช้การโจมตีแบบกำลังดุร้ายเพื่อเข้าถึงเว็บไซต์ของคุณ ผู้โจมตีจะพยายามเข้าถึงเว็บไซต์ของคุณโดยใช้ xmlrpc.php โดยลองใช้ชื่อผู้ใช้และรหัสผ่านที่แตกต่างกัน พวกเขาสามารถใช้คำสั่งเดียวเพื่อทดสอบรหัสผ่านที่แตกต่างกันหลายร้อยรหัสได้อย่างมีประสิทธิภาพ ซึ่งช่วยให้พวกเขาสามารถข้ามเครื่องมือรักษาความปลอดภัยที่ปกติจะตรวจจับและบล็อกการโจมตีแบบดุร้าย

ประการที่สองคือทำให้ไซต์ออฟไลน์ผ่านการโจมตี DDoS แฮกเกอร์จะใช้การแจ้งเตือนแบบย้อนกลับใน WordPress เพื่อส่งไปยังไซต์หลายพันแห่งในเวลาเดียวกัน ฟังก์ชั่น xmlrpc.php นี้ทำให้แฮกเกอร์มีจำนวนที่อยู่ IP เกือบไม่จำกัดเพื่อเผยแพร่การโจมตี DDoS

หากต้องการตรวจสอบว่า XML-RPC ทำงานบนไซต์ของคุณหรือไม่ คุณสามารถเรียกใช้โดยใช้เครื่องมือที่เรียกว่า XML-RPC Validator เรียกใช้ไซต์ของคุณด้วยเครื่องมือนี้ และหากคุณได้รับข้อผิดพลาด แสดงว่าคุณไม่รองรับ XML-RPC

หากคุณได้รับข้อความแสดงความสำเร็จ คุณสามารถหยุด xmlrpc.php ได้โดยใช้วิธีใดวิธีหนึ่งจากสองวิธีด้านล่าง

วิธีที่ 1: ปิดการใช้งาน Xmlrpc.php โดยใช้ปลั๊กอิน

การปิดใช้งาน XML-RPC บนไซต์ WordPress ของคุณนั้นง่ายมาก

ไปที่ส่วน ปลั๊กอิน › เพิ่มใหม่ในคอนโซลผู้ดูแลระบบ WordPress ของคุณ ค้นหาปลั๊กอิน ปิดการใช้งาน XML-RPCและติดตั้งแล้วจะได้ดังภาพด้านล่าง:

เปิดใช้งานปลั๊กอินและคุณทำเสร็จแล้ว ปลั๊กอินนี้จะแทรกโค้ดที่จำเป็นโดยอัตโนมัติเพื่อปิดใช้งาน XML-RPC

อย่างไรก็ตาม โปรดจำไว้ว่าปลั๊กอินที่ติดตั้งอาจใช้บางส่วนของ XML-RPC จากนั้นการปิดใช้งานอาจทำให้เกิดข้อขัดแย้งระหว่างปลั๊กอินหรือแต่ละส่วน และนำออกจากโหมดการทำงาน

หากคุณต้องการปิดการใช้งานองค์ประกอบ XML-RPC แต่ละรายการ แต่อนุญาตให้ปลั๊กอินและคุณสมบัติอื่นๆ ทำงาน ให้มองหาปลั๊กอินลักษณะนี้:

  • หยุดการโจมตี XML-RPC ปลั๊กอินนี้จะหยุดการโจมตี XML-RPC ทั้งหมด แต่จะอนุญาตให้ปลั๊กอินเช่น Jetpack และเครื่องมืออัตโนมัติและปลั๊กอินอื่น ๆ ทำงานต่อไปโดยให้สิทธิ์การเข้าถึงไฟล์ xmlrpc.php
  • ควบคุมการเผยแพร่ XML-RPC สิ่งนี้ช่วยให้คุณรักษาการควบคุมและเผยแพร่จากระยะไกลได้

วิธีที่ 2: การปิดใช้งาน Xmlrpc.php ด้วยตนเอง

หากคุณไม่ต้องการใช้ปลั๊กอินและต้องการใช้ด้วยตนเอง ให้ปฏิบัติตามแนวทางนี้ มันจะหยุดคำขอ xmlrpc.php ขาเข้าทั้งหมดก่อนที่จะส่งต่อไปยัง WordPress

เปิดไฟล์ .htaccess คุณอาจต้องเปิดใช้งาน 'แสดงไฟล์ที่ซ่อน' ในตัวจัดการไฟล์หรือไคลเอนต์ FTP เพื่อค้นหาไฟล์นี้

วางรหัสนี้ลงในไฟล์ .htaccess:

# บล็อกคำขอ WordPress xmlrpc.php ปฏิเสธคำสั่งอนุญาตให้ปฏิเสธจากอนุญาตทั้งหมดจาก 123.123.123.123

ความคิดสุดท้าย

โดยรวมแล้ว XML-RPC เป็นทางออกที่ดีสำหรับปัญหาบางประการที่มาพร้อมกับการเผยแพร่ระยะไกลบนไซต์ WordPress ของคุณ อย่างไรก็ตาม ในขณะเดียวกันก็ปรากฏว่ามีช่องโหว่ด้านความปลอดภัยซึ่งค่อนข้างอันตรายสำหรับเจ้าของเว็บไซต์ WordPress บางราย

เพื่อให้ไซต์ของคุณปลอดภัย ขอแนะนำให้ปิดใช้งาน xmlrpc.php โดยสมบูรณ์ เว้นแต่คุณต้องการคุณสมบัติบางอย่างที่จำเป็นสำหรับการเผยแพร่ระยะไกลและปลั๊กอิน Jetpack จากนั้นคุณสามารถใช้ปลั๊กอินวิธีแก้ปัญหาที่ช่วยให้คุณสามารถใช้คุณสมบัติเหล่านี้ในขณะที่แก้ไขช่องโหว่ด้านความปลอดภัยได้

เมื่อเวลาผ่านไป เราคาดหวังได้ว่าฟังก์ชัน XML-RPC จะถูกรวมเข้ากับ WordPress API ใหม่ ซึ่งจะรองรับการเข้าถึงระยะไกลโดยไม่กระทบต่อความปลอดภัย

คุณได้บล็อกการเข้าถึง XML-RPC ผ่านปลั๊กอินหรือด้วยตนเองหรือไม่? หรือมีปัญหาด้านความปลอดภัยเนื่องจากเคยใช้งานมาก่อน? แบ่งปันประสบการณ์ของคุณในความคิดเห็นด้านล่าง

ทุกคนที่มีเว็บไซต์ของตัวเองต้องการเพิ่มความปลอดภัย ถ้าไม่เช่นนั้นก็อยากให้มันปลอดภัยเสมอ... จริงๆแล้วในบทความนี้เราจะวิเคราะห์หลักการและพื้นฐานของการปกป้องกลไก WordPress และโดยเฉพาะเราจะดูใน รายละเอียดเพิ่มเติมที่ไฟล์ xmlrpc.php- อย่าลืมสำรองข้อมูลเมื่อทำการเปลี่ยนแปลงหรือทำการเปลี่ยนแปลงไฟล์ เริ่มกันเลย.

ช่องโหว่ WordPress ผ่านไฟล์ xmlrpc.php วิธีแก้ไขปัญหา:

ผมขออธิบายสำหรับผู้ที่ไม่ทราบหรือไม่เข้าใจวัตถุประสงค์ของไฟล์นี้ ด้วยความช่วยเหลือนี้ คุณสามารถจัดการบล็อก WordPress ของคุณผ่านแอปพลิเคชันต่างๆ แน่นอนว่าฉันไม่รู้เกี่ยวกับคนส่วนใหญ่ แต่โดยส่วนตัวแล้วฉันไม่ได้ใช้สิ่งนี้ และเหตุใดฉันจึงควรปล่อยให้โอกาสพิเศษในการแฮ็กไซต์ ฉันจะลบมันออก... ท้ายที่สุด ไฟล์นี้คือ ค่อนข้างอ่อนแอ อย่างไรก็ตาม โปรดจำไว้ว่า คุณสามารถนำออกจากการใช้งานได้ และคุณสามารถส่งคืนได้ในภายหลังหากต้องการ

ก่อนอื่น เรามาปิดการใช้งานไฟล์กันก่อน xmlrpc.phpมีการโจมตีไซต์ผ่านเข้ามาค่อนข้างมาก และนี่ไม่ดีเลย ตามปกติมี 2 ตัวเลือกในการทำเช่นนี้ วิธีแรกคือการเปลี่ยนแปลงไฟล์ .htaccess และ function.php รวมถึง header.php (วิธีที่ถูกต้องที่สุดในความคิดของฉัน) และวิธีการติดตั้งปลั๊กอิน แต่จะเพิ่มเติมในภายหลัง ไปที่การแก้ไขไฟล์กันดีกว่า

ในไฟล์ function.php เราแทรก:

// ปิดการใช้งาน xmlrpc.php add_filter("xmlrpc_enabled", "__return_false"); Remove_action("wp_head", "rsd_link");

ในไฟล์ header.php เราลบ:

คำสั่งปฏิเสธ อนุญาตให้ปฏิเสธจากทั้งหมด

นอกเหนือจากวิธีนี้แล้ว ยังมีวิธีอัตโนมัติอีกด้วยซึ่งฉันได้พูดถึงไปแล้วก่อนหน้านี้ สิ่งสำคัญคือเราติดตั้งปลั๊กอินเพิ่มเติม วิธีนี้ดีและค่อนข้างง่ายอย่างแน่นอน แต่ฉันไม่แนะนำให้ใช้ ทำไม ง่ายมาก ปลั๊กอินเพิ่มเติมถือเป็นภาระเพิ่มเติม และทำไมต้องติดตั้งปลั๊กอิน โดยการเพิ่มสองสามบรรทัด เราจะกำจัดฟังก์ชันที่เราไม่ต้องการ และทำให้ไซต์มีประสิทธิผลและง่ายขึ้น


โพสต์ของเขายังแสดงวิธีการตรวจสอบสิทธิ์เบราว์เซอร์ดังต่อไปนี้:
$request = xmlrpc_encode_request("methodName" , array("methodParam" ));
$auth = base64_encode ($ชื่อผู้ใช้ . /// . $password );
$header = (version_compare(phpversion(), "5.2.8"))
- array("ประเภทเนื้อหา: text/xml" , "การอนุญาต: พื้นฐาน $auth " )
: "ประเภทเนื้อหา: text/xml\r\nการอนุญาต: พื้นฐาน$auth " ; //
$context = stream_context_create (array("http" => array(
"method" => "โพสต์" ,
"ส่วนหัว" => $ส่วนหัว ,
"เนื้อหา" => $คำขอ
)));
$บริการเว็บ = "http://www.example.com/rpc";
$file = file_get_contents($บริการเว็บ, false, $context);
$response = xmlrpc_decode ($ไฟล์);
ถ้า (xmlrpc_is_fault($ตอบกลับ)) (
return "xmlrpc: $response [ errorString ] ($response [ รหัสข้อผิดพลาด ] )" ;
) อื่น (
ส่งคืน $ ตอบกลับ ;
}
?>
1 - หมายเหตุบรรณาธิการ: นี่เป็นการแก้ไขจาก "SandersWang dt php ที่ gmail dot com"

16 ปีที่แล้ว

สตริงไบนารี่ (ตั้งค่าด้วย xmlrpc_set_type) เข้าไปใน ...บล็อกอย่างที่คุณคาดหวัง แต่หลังจากทุก ๆ อักขระที่ 80 ฟังก์ชันนี้จะแทรกเอนทิตี XML " " ซึ่งเป็นการขึ้นบรรทัดใหม่ของ Unicode ราวกับว่าจะทำให้เกิดการตัดบรรทัดซึ่งเป็นที่ยอมรับว่าโง่

แม้จะโง่เขลา แต่ก็ทำให้เกิดปัญหาที่แท้จริงสำหรับเซิร์ฟเวอร์ XML-RPC บางตัว เช่น http://jakarta.apache.org/xmlrpc/ (nee Helma) กำจัดเอนทิตีเหล่านั้นด้วยสิ่งที่ชอบ

$req = preg_replace("/ /", "", xmlrpc_encode_request("my.method", $args));

แก้ไขปัญหาได้

11 ปีที่แล้ว

ควรสังเกตว่าการเข้ารหัสดูเหมือนจะไม่เข้ารหัสอะไรเลย เพียงระบุสิ่งที่จะเข้าไปในส่วนหัว XML

เรามีปัญหากับการบันทึกสตริง UTF ที่เข้ารหัสสองครั้งลงในฐานข้อมูลเมื่อใช้ฟังก์ชันนี้ โดยส่งไปยังเซิร์ฟเล็ต apache xml-rpc และจัดเก็บไว้ในฐานข้อมูล mysql แก้ไขได้โดยการตั้งค่า "escaping" เป็น "markup" และ "encoding" เป็น "UTF-8" (อย่าลืมตั้งค่า "utf-8" ใน xmlrpc_decode ด้วย)

ดูเหมือนว่าสตริงที่เข้ารหัส UTF-8 จะถูกหลีกหนีโดยมีไบต์เป็นเอนทิตี แทนที่จะเป็นอักขระที่เป็นเอนทิตี

9 ปีที่แล้ว

เคยลองส่งอาร์เรย์ดังต่อไปนี้ด้วย xmlrpc หรือไม่?
$var1=array(7=>14,9=>18);

อาร์เรย์เอาท์พุตดูแตกต่างออกไปมาก! มันจะมีลักษณะเช่นนี้:
$var2=อาร์เรย์(14,18);

ทางออกเดียวที่ฉันพบคือเติมช่องว่างหน้าดัชนี:
$var3=array(" 7"=>14," 9"=>18);

การใช้วิธีนี้คุณจะได้ผลลัพธ์ที่ถูกต้อง ($var1)

16 ปีที่แล้ว

ไคลเอ็นต์ XML-RPC ควรใช้ฟังก์ชันนี้เพื่อสร้างเพย์โหลด XML สำหรับคำขอ XML-RPC

$params = "system.methodSignature" ;
$method = "system.methodHelp" ;
$request = xmlrpc_encode_request ($วิธี, $params);
เสียงสะท้อน ($ คำขอ);
?>

ผลิต;



system.methodช่วยเหลือ

system.methodลายเซ็น



อาร์กิวเมนต์ที่สองรู้จักประเภทของตัวแปรและสร้างโครงสร้าง XML-RPC ที่ถูกต้อง ดู xmlrpc_encode() สำหรับรายละเอียดเพิ่มเติม

12 ปีที่แล้ว

ไคลเอ็นต์ OO แบบธรรมดาพร้อมฟังก์ชันโอเวอร์โหลด:

เมธอด php test_helloworld ถูกแปลเป็นเมธอด xmlrpc test.helloworld

คลาส RpcClient(

$_methods ส่วนตัว;
$_context ส่วนตัว;
ส่วนตัว $_url;

ฟังก์ชั่น __construct ($url, $user, $passwd) (
$auth = base64_encode(sprintf("%s:%s", $user,$passwd));
$this->_context = stream_context_create(array(
"http" => อาร์เรย์(
"วิธีการ" => "โพสต์",
"header" => "ประเภทเนื้อหา: text/xml\r\n"
"การอนุญาต: พื้นฐาน $auth" ,

)
));
$นี่->_url = $url;

$this->registerMethod("Test_HelloWorld");

ฟังก์ชัน __call($methodName, $params) (
ถ้า (array_key_exists($methodName,$this->_methods)) (
// บน appelle la fonction RPC
$m = str_replace("_", ".", $methodName);
$r = xmlrpc_encode_request($m, $params,array("verbosity"=>"newlines_only"));
$c = $this->_context;
stream_context_set_option($c,"http", "เนื้อหา",$r);
$f = file_get_contents($this->_url,false,$c);
$resp = xmlrpc_decode($f);
ส่งคืน $resp;
) อื่น (
// บน appelle la fonction de l"objet
call_user_method_array($methodName, $this,$params);
}
}

ฟังก์ชั่นส่วนตัว registerMethod ($method) (
$this->_methods[$method] = จริง;
}

เทคโนโลยี XML-RPC ใช้ในระบบ WordPress สำหรับคุณสมบัติที่ดีต่างๆ เช่น pingbacks, trackbacks, การจัดการไซต์ระยะไกลโดยไม่ต้องเข้าสู่แผงผู้ดูแลระบบ ฯลฯ น่าเสียดายที่ผู้โจมตีสามารถใช้เพื่อโจมตี DDoS บนเว็บไซต์ได้ นั่นคือคุณสร้างโครงการ WP ที่สวยงามและน่าสนใจสำหรับตัวคุณเองหรือสั่งซื้อและในขณะเดียวกันคุณสามารถเป็นส่วนหนึ่งของบอตเน็ต DDoS ได้โดยไม่ต้องสงสัยอะไรเลย ด้วยการเชื่อมต่อเว็บไซต์หลายหมื่นแห่งเข้าด้วยกัน คนไม่ดีจะสร้างการโจมตีที่ทรงพลังต่อเหยื่อของพวกเขา แม้ว่าในขณะเดียวกันเว็บไซต์ของคุณก็ประสบปัญหาเช่นกันเพราะ... โหลดไปที่โฮสต์ที่มันตั้งอยู่

หลักฐานของกิจกรรมที่ไม่ดีดังกล่าวอาจอยู่ในบันทึกของเซิร์ฟเวอร์ (access.log ใน nginx) ซึ่งมีบรรทัดต่อไปนี้:

103.238.80.27 - - "POST /wp-login.php HTTP/1.0" 200 5791 "-" "-"

แต่กลับมาที่ช่องโหว่ XML-RPC กัน มองเห็นได้ชัดเจนในการเปิดไซต์บนเซิร์ฟเวอร์ของคุณช้าหรือไม่สามารถโหลดได้เลย (ข้อผิดพลาด 502 Bad Gateway) การสนับสนุนทางเทคนิคของโฮสต์ FASTVPS ของฉันยืนยันการเดาของฉันและแนะนำ:

  1. อัปเดต WordPress เป็นเวอร์ชันล่าสุดพร้อมกับปลั๊กอิน โดยทั่วไป หากคุณติดตาม คุณอาจได้อ่านเกี่ยวกับความจำเป็นในการติดตั้งเวอร์ชัน 4.2.3 ล่าสุดแล้ว เนื่องจากการวิพากษ์วิจารณ์ด้านความปลอดภัย (เช่นเดียวกับเวอร์ชันก่อน ๆ ) สรุปคือดีที่ได้อัพครับ
  1. ติดตั้งปลั๊กอินปิดใช้งาน XML-RPC Pingback

ปิดการใช้งาน XML-RPC ใน WordPress

ก่อนหน้านี้ สำหรับฉันดูเหมือนว่าตัวเลือกในการเปิด/ปิดการใช้งาน XML-RPC อยู่ที่ไหนสักแห่งในการตั้งค่าระบบ แต่ตอนนี้ฉันหามันไม่เจอแล้ว ดังนั้นวิธีที่ง่ายที่สุดในการกำจัดมันคือการใช้ปลั๊กอินที่เหมาะสม

ค้นหาและดาวน์โหลด ปิดการใช้งาน XML-RPC Pingback หรือติดตั้งโดยตรงจากแผงผู้ดูแลระบบ คุณไม่จำเป็นต้องกำหนดค่าใดๆ เพิ่มเติม โมดูลจะเริ่มทำงานทันที โดยจะลบเมธอด pingback.ping และ pingback.extensions.getPingbacks ออกจากอินเทอร์เฟซ XML-RPC นอกจากนี้ยังลบ X-Pingback ออกจากส่วนหัว HTTP

ในบล็อกแห่งหนึ่ง ฉันพบตัวเลือกเพิ่มเติมสองสามตัวเลือกในการลบการปิดใช้งาน XML-RPC

1. ปิดการใช้งาน XML-RPC ในเทมเพลต

เมื่อต้องการทำเช่นนี้ ให้เพิ่มบรรทัดต่อไปนี้ในไฟล์ Functions.php ของธีม:

คำสั่งปฏิเสธ อนุญาตให้ปฏิเสธจากทั้งหมด

โดยส่วนตัวแล้วไม่ได้ใช้สองวิธีหลังนี้เพราะ... ฉันเชื่อมต่อปลั๊กอิน Disable XML-RPC Pingback - ฉันคิดว่าเพียงพอแล้ว สำหรับผู้ที่ไม่ชอบการติดตั้งที่ไม่จำเป็น ฉันขอแนะนำตัวเลือกอื่น

  • รองรับการสร้างทั้งไคลเอนต์ xmlrpc และเซิร์ฟเวอร์
  • การเข้ารหัสและถอดรหัสแบบละเอียดแบบอัตโนมัติหรือแบบแมนนวลเต็มรูปแบบจากค่า php ไปเป็น xmlrpc
  • รองรับการเข้ารหัสอักขระ UTF8, Latin-1 และ ASCII เมื่อเปิดใช้งานส่วนขยาย php mbstring จะรองรับชุดอักขระเพิ่มมากขึ้น
  • รองรับการบีบอัด http ของทั้งคำขอและการตอบกลับ คุกกี้ พร็อกซี การรับรองความถูกต้องพื้นฐานและ https การรับรองความถูกต้อง ntlm และ Keepalives ด้วยส่วนขยาย php cURL
  • การตรวจสอบทางเลือกของประเภทพารามิเตอร์ของคำร้องขอ xmlrpc ขาเข้า
  • รองรับเมธอด system.listMethods, system.methodHelp, system.multicall และ system.getCapabilities
  • การสนับสนุนสำหรับ และ ส่วนขยายเป็น xmlrpc
  • ความเป็นไปได้ในการลงทะเบียนฟังก์ชัน php หรือวิธีการเรียนที่มีอยู่เป็นเว็บเซอร์วิส โดยดึงข้อมูลที่เพิ่มมูลค่าจากความคิดเห็นของ phpdoc
  • ดีบักเกอร์แบบเห็นภาพบนเว็บจะรวมอยู่ในไลบรารี

ความต้องการ

  • PHP 5.3.0 หรือใหม่กว่า; แนะนำ 5.5 หรือใหม่กว่า
  • จำเป็นต้องใช้ส่วนขยาย php "curl" หากคุณต้องการใช้ SSL หรือ HTTP 1.1 เพื่อสื่อสารกับเซิร์ฟเวอร์ระยะไกล
  • จำเป็นต้องใช้ส่วนขยาย php "mbstring" เพื่อให้สามารถรับคำขอ/ตอบกลับในชุดอักขระอื่นที่ไม่ใช่ ASCII, Latin-1, UTF-8
  • ไม่จำเป็นต้องใช้ส่วนขยายเนทิฟ php "xmlrpc" แต่ถ้าติดตั้งไว้ จะไม่มีการรบกวนการทำงานของไลบรารีนี้

ดาวน์โหลด

ข่าว

  • วันที่ 1 กรกฎาคม 2017
    เปิดตัว lib เวอร์ชัน 4.2.0 และ 3.1.0
    บันทึกประจำรุ่นมีอยู่ใน Github
  • วันที่ 20 มกราคม 2559
    เปิดตัว lib เวอร์ชัน 4.0.0
    นี่เป็นครั้งแรกที่ API เห็นการเปลี่ยนแปลงครั้งใหญ่ โดยละทิ้งอดีต และเริ่มเปลี่ยนไปใช้ php ยุคใหม่
    มีการแนะนำเนมสเปซและชุดอักขระเริ่มต้นที่ใช้หาก UTF-8; เพิ่มการรองรับ mbstring และอีกมากมาย
    หากต้องการดูรายการการเปลี่ยนแปลงทั้งหมด โปรดไปที่ Github
  • วันที่ 19 เมษายน 2558
    เปิดตัว lib เวอร์ชัน 3.0.1
  • วันที่ 15 มิถุนายน 2557
    เปิดตัว lib เวอร์ชัน 3.0.0
  • วันที่ 15 ธันวาคม 2556
    โครงการย้ายไปที่ GitHub

    ดีบักเกอร์ xmlrpc ออนไลน์

    แอปพลิเคชันดีบักเกอร์ xmlrpc สาธิตที่สร้างขึ้นจากไลบรารีนี้ มีการใช้งานอยู่ที่ที่อยู่ http://gggeek.altervista.org/sw/xmlrpc/debugger/ คุณสามารถใช้ดีบักเกอร์เพื่อเช่น สอบถามเซิร์ฟเวอร์สาธิต SF หรือตรวจแก้จุดบกพร่องเซิร์ฟเวอร์ xmlrpc ส่วนตัวของคุณเอง หากสามารถเข้าถึงได้บนเน็ต

    การพัฒนา

    คำอธิบายสถานะ - อัปเดตเมื่อ 26/07/2009
    อัปเดตเอกสารประกอบสำหรับคุณสมบัติทั้งหมดที่เพิ่มตั้งแต่เวอร์ชัน 2ดำเนินไปอย่างช้าๆ...
    เพิ่มความเป็นไปได้ในการเลือกการจัดรูปแบบของข้อความ xmlคล้ายกับสิ่งที่ส่วนขยาย xmlrpc ดั้งเดิมของ php ทำ
    แก้ไขคำเตือนที่ปล่อยออกมาเมื่อรันด้วย PHP 5 ในโหมด STRICTอาจทำไปแล้วในเวอร์ชัน 3.0 โดยละทิ้งความเข้ากันได้ของ php 4 ...
    ขยายฟังก์ชัน php อัตโนมัติเป็น wrapper วิธี xmlrpc เพื่อใช้ประโยชน์จากการจัดการข้อยกเว้นและส่งคืนการตอบกลับข้อผิดพลาด xmlrpc
    ขยายตัวสร้าง stub อัตโนมัติสำหรับการแปลงฟังก์ชัน php เป็นวิธี xmlrpc สำหรับ PHP โดยอัตโนมัติ<= 5.0.2 ดูรหัส AMFPHP เกี่ยวกับวิธีการทำ
    การปรับปรุงมากมายในเวอร์ชัน 2.1
    ตอนนี้เซิร์ฟเวอร์สามารถลงทะเบียนฟังก์ชัน php ได้โดยอัตโนมัติแล้ว จึงมีความจำเป็นน้อยลง...
    รองรับ mbstring ได้ดีขึ้นเมื่อเปิดใช้งานควรทำเช่น การเข้ารหัสชุดอักขระคาดเดาได้เร็วขึ้น
    ปรับปรุงการรองรับคุกกี้ "เวอร์ชัน 1"
    เพิ่มความเป็นไปได้ที่จะใช้แทนรหัสข้อผิดพลาดดั้งเดิม
    ความเข้ากันได้ของ PEAR: เพิ่มคำพ้องความหมายสำหรับฟังก์ชันที่มีอยู่ในชื่อที่แตกต่างกันใน lib เวอร์ชัน PEAR
    เพิ่มการสนับสนุนสำหรับส่วนขยาย xmlrpc
    เพิ่มความสามารถในการเรียกใช้ชุดการทดสอบ validator1 ให้กับดีบักเกอร์
    ตรวจสอบการใช้งาน WSDL เพื่ออธิบายบริการที่เปิดเผยและการแปลเป็น/จาก system.methodSignature และ system.describeMethodsมีปัญหาบางประการในการใช้ XSD เพื่อกำหนด xmlrpc อย่างเคร่งครัด Relax NG เป็นทางเลือกที่ดีกว่าอย่างแน่นอน แต่ชุดเครื่องมืออื่น ๆ สำหรับการใช้งานร่วมกับไฟล์ WSDL แทบไม่ได้รับการรองรับ...
    รองรับการเปลี่ยนเส้นทาง http (302)
    เพิ่มฐานข้อมูลขนาดเล็กลงใน sf.net เพื่อให้เราสามารถใช้หน้าตรวจสอบความถูกต้องที่บันทึกผู้ใช้ที่เข้ามา เช่น มีอยู่บนไซต์ xmlrpc.com
    เพิ่มชุดมาตรฐานความสามารถในการอัปโหลดผลลัพธ์ไปยัง sf.net
    เขียนส่วนขยาย php ที่จะเร่งฟังก์ชั่นที่มีการใช้งานหนักที่สุดของ libดูตัวอย่างว่า adodb ทำได้อย่างไร
    ทดสอบความเร็ว/หน่วยความจำที่เพิ่มขึ้นโดยใช้ simplexml และ Relaxng แทนการแยกวิเคราะห์ xml ด้วยมือ

    ความปลอดภัย

    การละเมิดความปลอดภัยครั้งที่สาม: สิงหาคม 2548

    นี่เป็นการตอบสนองเชิงรุกเพิ่มเติมต่อการละเมิดความปลอดภัยครั้งที่สองด้านล่าง การใช้ eval() ทั้งหมดได้ถูกลบออกไปแล้ว เนื่องจากยังคงเป็นช่องโหว่ที่อาจเกิดขึ้นได้

    เมื่อไลบรารีถูกเขียนครั้งแรก เวอร์ชันของ php ที่มีอยู่ในขณะนั้นไม่รวม call_user_func() และคณะ ดังนั้นจึงถูกเขียนภายในข้อจำกัดเหล่านั้นเพื่อใช้ eval() ในสองฟังก์ชันที่เรียกโดย xml parser เนื่องจากการใช้งานนี้ คลาสเซิร์ฟเวอร์จึงใช้ eval() เนื่องจากต้องแยกวิเคราะห์ xml โดยใช้ฟังก์ชันเดียวกัน

    ฟังก์ชั่นตัวจัดการเหล่านี้และอาร์เรย์ที่ใช้เพื่อรักษาเนื้อหาของข้อความต้นฉบับได้ถูกเขียนใหม่เพื่อสร้างค่า php แทนที่จะสร้างโค้ด php เพื่อการประเมินผล สิ่งนี้ควรลบศักยภาพในการเรียกใช้โค้ด

    การละเมิดความปลอดภัยครั้งที่สอง: กรกฎาคม 2548

    ช่องโหว่ด้านความปลอดภัยที่ค้นพบโดย James Bercegay จาก GulfTech Security Research เมื่อวันที่ 27 มิถุนายน พ.ศ. 2548 ทำให้เกิดความปั่นป่วนอย่างมาก ได้ขึ้นหน้าแรกของ Salshdot ได้รับการกล่าวถึงใน Netcraft, LWN และไซต์อื่นๆ อีกมากมาย

    คำแนะนำโดยละเอียดเกี่ยวกับการสร้างโค้ดช่องโหว่ได้รับการเผยแพร่บนอินเทอร์เน็ต และผู้ดูแลระบบเว็บโฮสติ้งจำนวนมากยังคงสงสัยว่าอะไรคือแผนการป้องกันที่ดีที่สุด และอะไรคือความเสี่ยงที่แท้จริง นี่คือคำตอบบางส่วน

    ขอบเขตของปัญหา

    • จุดบกพร่องนี้ส่งผลต่อไลบรารีทั้งสองที่เรียกว่า PEAR::XMLRPC และ PHPXMLRMPC
      ไม่ส่งผลกระทบต่อการใช้งาน xmlrpc ซึ่งมีอยู่ใน php และเปิดใช้งานในเวลาคอมไพล์ด้วยตัวเลือก "--with-xmlrpc" (บน Unix บน windows โดยทั่วไปจะเปิด / ปิดการใช้งานโดยการเปลี่ยนบรรทัดที่เหมาะสมใน php.ini )
    • จุดบกพร่อง (การดำเนินการของโค้ด php ที่ถูกแทรกโดยโฮสต์ระยะไกล) อยู่ในไฟล์โดยเฉพาะ xmlrpc.incในการแจกแจง phpxmlrpc และ RPC.phpในการจำหน่ายลูกแพร์
    • ทั้ง PEAR::XMLRPC และ PHPXMLRMPC ได้เปิดตัวไลบรารีเวอร์ชันอัปเดตที่แก้ไขปัญหาแล้ว
    • ไลบรารีทั้งสองถูกใช้ในแอปพลิเคชัน php จำนวนมาก (ดูรายการที่ไม่สมบูรณ์ด้านบน)
      เนื่องจาก lib ทั้งหมดประกอบด้วยไฟล์ง่ายๆ 2 ไฟล์ ทุกคนจึงมีแนวโน้มที่จะแพตช์ไฟล์เหล่านั้นตามรสนิยม/ความต้องการของตนเอง และรวมกลุ่มไฟล์เหล่านั้นเมื่อเผยแพร่แอปของตน
      โปรเจ็กต์ที่มีชื่อเสียงส่วนใหญ่มักออกแอปเวอร์ชันใหม่อย่างรวดเร็วมาก แต่ผู้ใช้ทุกคนจะใช้เวลานานกว่ามากในการอัปเดตระบบของเขา
      ต้องบอกว่ามีแอปพลิเคชั่นจำนวนมากถูกจัดส่งจนกระทั่งเมื่อเร็ว ๆ นี้โดยมีไลบรารี phpxmlrpc เวอร์ชันที่ล้าสมัยอย่างมากรวมอยู่ด้วย ข้อผิดพลาดในการฉีดครั้งแรกได้รับการแก้ไขในปี 2544โดยไม่มีใครสังเกตเห็น (...)

      สิ่งนี้ทำให้น่าเสียดายที่ผู้ดูแลระบบจะหาวิธีแก้ปัญหาง่ายๆ ได้ยากขึ้นมาก: มีโอกาสมากที่ไฟล์ดังกล่าวจะพบได้ในไดเร็กทอรีที่แตกต่างกันและในเวอร์ชันต่างๆ บนเซิร์ฟเวอร์โฮสติ้งสาธารณะ

    ช่องโหว่ถูกกระตุ้นอย่างไร

    • เพื่อกระตุ้นจุดบกพร่อง ผู้โจมตีจำเป็นต้องมีการประเมิน xml ที่จัดทำขึ้นเป็นพิเศษในกระบวนการสร้างอ็อบเจ็กต์ xmlrpcval ออบเจ็กต์ Xmlrpcval ถูกสร้างขึ้นเมื่อสคริปต์เซิร์ฟเวอร์ถอดรหัสคำขอ xmlrpc หรือเมื่อสคริปต์ php บางตัวทำหน้าที่เป็นไคลเอ็นต์ xmlrpc และถอดรหัสการตอบสนองที่ส่งโดยเซิร์ฟเวอร์
      สคริปต์เซิร์ฟเวอร์เป็นแอปพลิเคชันเฉพาะ และมักมีชื่อว่า server.php (แต่อาจมีตัวแปรโปรเจ็กต์หรือตัวเลือกที่ผู้ใช้เลือกก็ได้) และจะต้องรวมทั้งไฟล์ xmlrpc.inc และ xmlrpcs.inc (สำหรับเวอร์ชันแพร์ เซิร์ฟเวอร์ .php เทียบเท่ากับ xmlrpcs.inc)
    • การรวมเฉพาะ xmlrpc.inc และ xmlrpcs.inc ในสคริปต์ php เท่านั้น (afaik...) ปลอดภัยอย่างสมบูรณ์ รวมถึงการเรียกโดยตรงผ่านการร้องขอ http เนื่องจากมีเพียงคำจำกัดความของฟังก์ชัน ตัวแปร และคลาสเท่านั้นที่จะดำเนินการในสองไฟล์นั้น กล่าวคือ ไม่มีการเรียกใช้โค้ดทันที
    • ไฟล์ server.php และ Discus.php ที่กระจายด้วย phpxmlrpc lib จริง ๆ แล้วใช้เซิร์ฟเวอร์ xmlrpc ที่ใช้งานจริง ดังนั้นคุณอาจพิจารณาบล็อกการเข้าถึงไฟล์เหล่านั้นหรือลบออกดีกว่าถ้าคุณพบว่าไฟล์เหล่านี้ใช้งานบนเซิร์ฟเวอร์ที่ใช้งานจริง (นอกเหนือจากด้านบนสุดของฉัน โปรดทราบว่าฉันสามารถนึกถึงการโจมตีบางประเภทที่เกี่ยวข้องกับแอป php ตัวที่สองที่ทุกข์ทรมานจากการละเมิดการรวมไฟล์ php เทคโอเวอร์เพื่อดึงพวกมันเข้ามา + ใช้ประโยชน์จากข้อบกพร่องที่รู้จักของ lib)

    หมายถึงการป้องกัน

    • ให้สิทธิ์ระบบแก่กระบวนการเว็บเซิร์ฟเวอร์ของคุณน้อยที่สุดเท่าที่จะทำได้ โดยทั่วไปบน Unix สิ่งนี้เกี่ยวข้องกับการเรียกใช้ Apache ในฐานะผู้ใช้ไม่มีใครและ/หรือในสภาพแวดล้อมที่ถูกเจลรูท/chrooted เนื่องจากกลไก PHP ทำงานภายใต้ผู้ใช้รายเดียวกับเว็บเซิร์ฟเวอร์ นี่คือแนวป้องกันแรก: โค้ด PHP ใด ๆ ที่ถูกแทรกโดยผู้โจมตีจะทำงานบนเซิร์ฟเวอร์ในฐานะผู้ใช้ที่ได้รับสิทธิ์น้อยที่สุด และความเสียหายทั้งหมดที่สามารถทำได้จะถูกจำกัดอยู่ที่ รบกวนการทำงานของแอปพลิเคชัน php เอง
    • เรียกใช้ php ในเซฟโหมด หากคุณเป็นโฮสต์สาธารณะและไม่ได้ทำเช่นนี้ มีโอกาสที่เซิร์ฟเวอร์ของคุณจะถูกรูทอยู่แล้ว วิธีนี้จะป้องกันไม่ให้สคริปต์ php ใช้ฟังก์ชันใดๆ ที่คุณคิดว่าไม่ปลอดภัย เช่น system() หรือ eval()
    • ฮาร์ดบล็อก: ค้นหาไฟล์ phpxmlrpc ที่มีอยู่ทั้งหมด (xmlrpc.inc และ xmlrpcs.inc) และปิดการใช้งาน (chmod 0) ทั่วทั้งระบบ
      แน่นอนว่านี่อาจทำให้แอปพลิเคชันผู้ใช้บางตัวไม่ทำงาน ดังนั้นคุณควรแจ้งให้ผู้ใช้ทราบเมื่อคุณดำเนินการ
    • ซอฟต์บล็อก: แทนที่สำเนาทั้งหมดของไฟล์ phpxmlrpc ที่มีอยู่ (xmlrpc.inc และ xmlrpcs.inc) ด้วยสำเนาที่มาจากเวอร์ชัน 1.1.1
      น่าเสียดายที่วิธีนี้ไม่รับประกัน 100% ว่าแอปทั้งหมดจะทำงานต่อไปได้ ภายในบางส่วนของออบเจ็กต์ lib เปลี่ยนจากเวอร์ชัน 0.9 เป็น 1.0 เป็น 1.1 (เช่น การแสดงส่วนหัว http ที่จัดเก็บไว้ในออบเจ็กต์ xmlrpcresp) และหากโค้ดที่คุณปรับใช้บนเซิร์ฟเวอร์ของคุณมีคลาสย่อยเหล่านั้น ก็อาจพบว่าตัวเองประสบปัญหา xml ที่ส่งแบบ over-the-wire ก็เปลี่ยนไปเช่นกันเมื่อเทียบกับ lib เวอร์ชันเก่าบางเวอร์ชัน (โดยเฉพาะ: เวอร์ชัน 1.0.99.2 มีการเข้ารหัสตัวอักษรอย่างไม่ถูกต้องนอกช่วง ASCII เป็นเอนทิตี html ในขณะที่ตอนนี้พวกมันถูกเข้ารหัสเป็นเอนทิตีชุดอักขระ xml) มีการเพิ่มรหัสตอบกลับข้อผิดพลาดใหม่สองสามรหัสด้วย ต้องบอกว่าคุณควรจะปลอดภัย 95% ในการใช้งานสคริปต์นั้นและนั่งอยู่ที่นั่นรอให้ผู้ใช้เริ่มตะโกนว่ามีบางอย่างเสียหาย...
    • ไลบรารี PHP PEAR สามารถอัปเกรดได้ด้วยคำสั่งบรรทัดเดียว ดังนั้นนั่นจึงไม่ใช่ปัญหาใหญ่จริงๆ:
      ลูกแพร์อัพเกรด XML_RPC และเพื่อบอกว่าได้รับการอัพเกรดแล้ว (1.3.1 หรือใหม่กว่าก็โอเค ล่าสุด ณ ตอนนี้คือ 1.3.2):
      รายการลูกแพร์ | grep RPC

    ข้อควรพิจารณาเพิ่มเติมบางประการ

    ไฟล์ xmlrpcs.inc ก็ได้รับการแก้ไขเช่นกันในรุ่น 1.1.1 เพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ดียิ่งขึ้น รายละเอียดเพิ่มเติม: การส่ง xml ที่มีรูปแบบไม่ถูกต้องที่จัดทำขึ้นเป็นพิเศษไปยังเซิร์ฟเวอร์จะทำให้สคริปต์ php ส่งข้อผิดพลาด php แทนที่จะส่งคืนการตอบกลับ xml ที่เหมาะสม
    ตามที่กล่าวไว้ จริงๆ แล้วสิ่งนี้นำมาซึ่ง "การละเมิดความปลอดภัยในการเปิดเผยเส้นทาง" (เช่น ข้อความแสดงข้อผิดพลาด php ที่แสดงมักจะมีข้อมูลที่ละเอียดอ่อนเกี่ยวกับเส้นทางของระบบไฟล์) แต่สคริปต์ PHP ใด ๆ ก็ตามจะประสบปัญหาด้านความปลอดภัยเดียวกันหากผู้ดูแลระบบใช้งานเซิร์ฟเวอร์ที่ใช้งานจริงด้วย คำสั่ง ini display_errors=On
    ฉันรู้ด้วยว่ามีหลายที่ใน xmlrpc.inc ที่การเรียกใช้ฟังก์ชันด้วยพารามิเตอร์ที่ไม่คาดคิดจะสร้างคำเตือนหรือข้อผิดพลาด php และฉันไม่ได้วางแผนที่จะใช้การตรวจสอบพารามิเตอร์ที่เข้มงวดสำหรับทุก ๆ ฟังก์ชันในเร็วๆ นี้ - หากคุณ ตั้งเป้าไปที่สิ่งนั้น คุณอาจจะเขียนโค้ดใน java ในตอนแรกก็ได้

    นี่คือจุดสิ้นสุดของโลกใช่ไหม?

    ฉันหวังว่าจะไม่
    เหตุผลก็คือ มีแอปพลิเคชั่น PHP หลายสิบตัวที่ประสบปัญหาจากการเจาะโค้ด ลองดูที่เส้นทางการรักษาความปลอดภัยของกระดานข่าว... แต่ผู้คนจำนวนมากยังคงคิดว่า PHP เป็นตัวเลือกที่ดีสำหรับการพัฒนาเว็บ
    ข้อควรจำ: การรักษาความปลอดภัยเป็นกระบวนการ ไม่ใช่สถานะที่สามารถเข้าถึงได้

    การละเมิดความปลอดภัยครั้งแรก: กันยายน 2544

    ฉันได้รับคำแนะนำนี้จาก Dan Libby โดยได้รับอนุญาตจากเขา จะมีการทำซ้ำที่นี่ โปรดทราบว่าการหาประโยชน์นี้ได้รับการแก้ไขแล้วในเวอร์ชัน 1.01 และเวอร์ชันที่สูงกว่าของ XML-RPC สำหรับ PHP -- Edd Dumbill อังคาร 24 ก.ย. 2544 ============= ช่องโหว่ด้านความปลอดภัยของ PHP: การใช้ประโยชน์จาก XML-RPC ที่เป็นไปได้ ================== == ======================== บทคัดย่อ: การใช้ไลบรารี php xmlrpc ของ Useful Inc เวอร์ชัน 1.0 รุ่นล่าสุด ทำให้ผู้โจมตีสามารถจัดโครงสร้างได้ xml ในลักษณะที่จะหลอกไลบรารี xml-rpc ให้รันโค้ด php บนเว็บเซิร์ฟเวอร์ ฉันสามารถรันโค้ด php ได้ตามใจชอบ และเมื่อปิดโหมดปลอดภัยของ php คำสั่งของระบบ ผู้โจมตีสามารถใช้สิ่งนี้เป็นช่องทางในการแพร่ไวรัสได้อย่างง่ายดาย รายละเอียด: ฉันสาธิตปัญหาโดยการแก้ไขสคริปต์ตัวอย่าง server.php ที่มาพร้อมกับการแจกจ่าย xmlrpc จากนั้นเรียกใช้ผ่านสคริปต์ client.php ซึ่งเป็นส่วนหนึ่งของการแจกจ่ายด้วย ฉันข้ามรหัสเซิร์ฟเวอร์มาตรฐาน และเพียงแค่สะท้อนการตอบกลับไปยังไคลเอนต์ ฉันสามารถให้ไคลเอนต์รันโค้ด php ได้ตามใจชอบ จากนั้น ฉันกู้คืนตัวอย่าง server.php กลับสู่สถานะดั้งเดิม และใช้ telnet เพื่อส่งไฟล์ที่แก้ไขแล้ว คำขอ ฉันยังสามารถรันโค้ดบนเซิร์ฟเวอร์ได้ แม้ว่าจะต้องใช้ไวยากรณ์ที่แตกต่างกันเล็กน้อยก็ตาม เนื่องจากฉันรู้ว่าไลบรารี xml-rpc ใช้ eval เพื่อสร้างโครงสร้างข้อมูลจากอินพุต xml มันเป็นเพียงเรื่องของการจัดโครงสร้างอินพุต xml ในลักษณะที่: a) ไม่ถูกหลีกหนีก่อนที่จะส่งผ่านไปยัง eval b) ทำ ไม่สร้างข้อผิดพลาดทางไวยากรณ์ php โดยปกติแล้ว ข้อมูลที่ไม่ใช่ตัวเลขทั้งหมดจะถูกหลีกหนีโดยไลบรารีก่อนที่จะถูกส่งไปยัง eval อย่างไรก็ตามปรากฎว่าหากคุณส่ง ตามด้วยแท็กที่ไม่คาดคิด เช่น โค้ด Escape จะถูกข้ามและข้อมูล "ดิบ" จะได้รับการประเมินแทน การใช้ประโยชน์จากไคลเอนต์: นี่คือการตอบสนอง xml-rpc ทั่วไป: สวัสดีชาวโลก เมื่อการตอบสนองดังกล่าวได้รับการประเมิน "ed ดูเหมือนว่า: new xmlrpcval("hello world", "string") นี่คือการตอบสนอง xml-rpc ที่จะรันโค้ด php เพื่อสะท้อน "

    สวัสดีชาวโลก

    " ทางฝั่งไคลเอ็นต์: ", "สตริง"); เสียงก้อง "

    สวัสดีชาวโลก

    ; \$waste = array("
    ในกรณีนี้ สตริงที่จะ eval"ed คือ: new xmlrpcval("", "string"); echo "

    สวัสดีชาวโลก

    "; $waste = array("", "string") มันเป็นไปได้ที่จะแทนที่ทุกสิ่งระหว่าง "string"); และ \$waste ด้วยโค้ดที่กำหนดเองซึ่งมีความยาวเท่าใดก็ได้ สุดท้ายนี้ นี่คืออันที่จะพิมพ์เนื้อหา ของไดเร็กทอรีปัจจุบัน: ", "สตริง"); เสียงก้อง "

    "; echo `ls -al`; echo "

    "; exit; \$waste = array("
    การใช้ประโยชน์จากเซิร์ฟเวอร์: การใช้ประโยชน์จากเซิร์ฟเวอร์นั้นเกือบจะเหมือนกับไคลเอนต์ ยกเว้นว่าเซิร์ฟเวอร์ใช้คำสั่ง eval ที่แตกต่างกัน ดังนั้นจึงต้องใช้ไวยากรณ์เริ่มต้นและสิ้นสุดที่แตกต่างกันเล็กน้อยเพื่อหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์ php นี่คือโค้ดเดียวกันกับข้างบน แต่จะทำงานกับเซิร์ฟเวอร์ได้ system.listMethods "," สตริง ")); เสียงก้อง "

    หากคุณเห็นรายการไดเร็กทอรี ฉันเพิ่งรัน php และโค้ดระบบผ่าน xml-rpc

    "; echo "ตอนนี้ฉันจะพยายามสร้างรายการไดเร็กทอรีโดยใช้ ls -al:\n "; echo `ls -al`; echo ""; echo "ฉันสามารถเรียกใช้ rm -rf ได้อย่างง่ายดายหรือเขียนโปรแกรมลงดิสก์แล้วดำเนินการ (เช่นไวรัส) หรืออ่านไฟล์บางไฟล์ ขอให้เป็นวันที่ดี.

    "; exit; $waste = array(array("
    พื้นที่ปัญหา: ใน xmlrpc.inc มีฟังก์ชันที่เรียกว่า xmlrpc_cd() ซึ่งเรียกใช้โดย xml parser เพื่อจัดการข้อมูลอักขระ ฟังก์ชั่น xmlrpc_cd($parser, $data) ( global $_xh, $xmlrpc_backslash, $xmlrpc_twoslash; //if (ereg("^[\n\r \t]+$", $data)) return; // print " เพิ่ม [$(data)]\n"; if ($_xh[$parser]["lv"]==1) ( $_xh[$parser]["qt"]=1; $_xh[$parser][ "lv"]=2; ) if ($_xh[$parser]["qt"]) ( // สตริงที่ยกมา $_xh[$parser]["ac"].=str_replace("\$", "\\ $", str_replace(""", "\"", str_replace(chr(92),$xmlrpc_backslash, $data))); ) else $_xh[$parser]["ac"].=$data; ) มัน เป็นสิ่งสุดท้ายที่ทำให้ข้อมูลถูกเพิ่มโดยไม่หลบหนี การมีสิ่งนี้เป็นอันตรายมาก ดูเหมือนว่าสิ่งนี้มีไว้สำหรับข้อมูลตัวเลข และต้องใช้ความพยายามอย่างมากในการตั้งค่าและยกเลิกการตั้งค่าตัวแปร "qt" (เครื่องหมายคำพูด) ซึ่งจะเปิดและปิดการ Escape อย่างไรก็ตาม ฉันยังไม่ชัดเจนในทันทีว่าทำไมข้อมูลตัวเลขจึงไม่ควรถูกหลีกหนีในลักษณะเดียวกัน และหาก/อย่างอื่นถูกลบออก ซึ่งจะทำให้มีโอกาสเป็นศูนย์สำหรับการโจมตีประเภทนี้