PDA

View Full Version : ช่องโหว่ reset admin password บน wordpress พร้อมวิธีแก้ไข



Gen0TypE
15-08-2009, 11:52 AM
เมื่อวันที่ 11/08/2009 ได้มีประกาศช่องโหว่ของ wordpress 2.8.3 ซึ่งเป็น version ล่าสุดในขณะนั้นออกมา
เป็นช่องโหว่ที่ใช้ reset admin password แต่ถ้าดูดีๆ แล้ว ช่องโหว่นี้ใช้ได้แค่ก่อกวนเฉยๆ
เพราะ password ใหม่ ก็จะถูกส่งไปยัง email ของ admin ที่เก็บไว้ใน database อยู่ดี
เราไม่สามารถกำหนดเองได้ว่าจะส่งไปให้ email ไหน (ไม่งั้นกระทู้นี้คงไปอยู่ในหมวด VIP ;) )

สำหรับ link ที่ผู้ค้นพบได้ประกาศออกมาก็ตามนี้ครับ
http://lists.grok.org.uk/pipermail/full-di...ust/070137.html (http://lists.grok.org.uk/pipermail/full-disclosure/2009-August/070137.html)


คนไหนอยากอ่านการวิเคราะห์เป็นภาษาไทย และวิธีป้องกันช่องโหว่นี้ ก็กด thank เลย :)
[hide=40]
- ช่องโหว่นี้ทำอะไรได้
[+] ช่องโหว่นี้เป็นการ force ใหม่ wordpress ส่ง password ใหม่ ไปให้ user แรกบน database ที่ไม่ได้มีการร้องขอการเปลี่ยน password ใหม่ (ปกติก็ admin นั่นแหละ)

- ปกติการร้องขอเพื่อเปลี่ยน password จะมีขั้นตอนดังนี้
[+] user ใส่ email หรือ username ลงไปใน form เพื่อร้องขอเปลี่ยน password แล้ว wordpress จะส่ง link สำหรับ reset password ไปให้ทาง email ตัวอย่าง link ที่สงไปจะเป็นดังนี้
http://www.example.com/wordpress/wp-login....cdRQnAi3O2wT0Do (http://www.example.com/wordpress/wp-login.php?action=rp&key=xHma4cdRQnAi3O2wT0Do)

เมื่อเรากด link ดังกล่าว wordpress ก็จะตรวจสอบแล้ว gen password ใหม่ให้เรา

แต่ขั้นตอนการตรวจสอบกลับมีช่องโหว่ขึ้นมาเล็กน้อย


มาดูที่ไฟล์ wp-login.php (เป็นไฟล์ที่ทำให้เกิดช่องโหว่นี้)

Line 307:
[code]
switch ($action) {
.
.
.
.
break;

case 'resetpass' :
case 'rp' :

rinetd
18-08-2009, 12:08 PM
ช่องโหว่นี้ตอนออกมาทีแรกถือเป็น 0day นะครับ milw0rm นำเอาไปไว้ที่ Highlight เลยแหละ
แต่ตอนนี้ไม่ได้อยู่แล้วคาดว่าน่าจะเป็นดพราะผลกระทบที่รหัสผ่านที่สงไปให้อีเมลอื่นไม่ได้ และปัจจุบัน wordpress ก็ออก version ปรับปรุงแล้ว
[hide=40]
ผมได้สร้างไฟล์สำหรับทดสอบช่องโหว่นี้ขึ้นมาเล่นๆดูลองเอาไปทดสอบดูได้ดังนี้ครับ (อาจจะมั่วๆหน่อยนะครับผมไม่เก่ง php)

save ไฟล์เป็น poc.php
เวลาทดสอบใช้ http://localhost/poc.php?key[]=

[code]<?php
print ("
"); print ("key is {$_GET[&#39;key&#39;]}\r\n");
print ("
"); print ("GET array is \r\n");
print ("
"); print_r ($_GET);
print ("
"); print ("Request array is \r\n");
print ("
"); print_r ($_REQUEST);
print ("
"); print ("Server query string is \r\n");
print ("
"); print ($_SERVER[&#39;QUERY_STRING&#39;]);

if ( isset($_GET[&#39;key&#39;]) ) {

wasintong
22-08-2009, 08:35 PM
จากที่ผมทำการทดสอบดู กับ version ที่ทาง wordpress ได้ ออกตัวไหม่มานะครับๆ
ซึ่งก็ยังมีช่องโว่ ในส่วนของ Remote admin reset password เหมือนเดินนะครับ
ผลการทดสอบกับ website ..... ครับ

จากการทดสอบพิมพ์ url ต่อท้ายเข้าไปแบบ version 2.8.3
**Hidden Content: Check the thread to see hidden data.**

rinetd
17-09-2009, 10:36 AM
**Hidden Content: Check the thread to see hidden data.**