2017-2018-1 20179215《Linux內核原理與分析》第十二周作業
阿新 • • 發佈:2017-12-17
繼續 解壓 判斷語句 cti 數據信息 接下來 分組 後臺數據庫 就是
Sql註入基礎原理介紹
分組:和20179205王雅哲共同完成實驗
一、實驗說明
1.1 sql註入
?SQL註入攻擊通過構建特殊的輸入作為參數傳入Web應用程序,而這些輸入大都是SQL語法裏的一些組合,通過執行SQL語句進而執行攻擊者所要的操作。
?SQL註入即是指web應用程序對用戶輸入數據的合法性沒有判斷,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。
?●SQL註入威脅表現形式可以體現為以下幾點:
●繞過認證,獲得非法權限 ●猜解後臺數據庫全部的信息 ●註入可以借助數據庫的存儲過程進行提權等操作
?●SQL註入攻擊的典型手段:
●判斷應用程序是否存在註入漏洞
●收集信息、並判斷數據庫類型
●根據註入參數類型,重構SQL語句的原貌
●猜解表名、字段名
●獲取賬戶信息、攻擊web或為下一步攻擊做準備
1.2 web程序三層架構
三層架構(3-tier architecture) 通常意義上就是將整個業務應用劃分為:
- 界面層(User Interface layer)
- 業務邏輯層(Business Logic Layer)
- 數據訪問層(Data access layer)。
區分層次的目的即為了“高內聚低耦合”的思想。在軟件體系架構設計中,分層式結構是最常見,也是最重要的一種結構被應用於眾多類型的軟件開發。由數據庫驅動的Web應用程序依從三層架構的思想也分為了三層:
- 表示層。
- 業務邏輯層(又稱領域層)
數據訪問層(又稱存儲層)
拓撲結構如下圖所示:
?當我們訪問動態網頁時, Web 服務器會向數據訪問層發起 Sql 查詢請求,如果權限驗證通過就會執行 Sql 語句。這種網站內部直接發送的Sql請求一般不會有危險,但實際情況是很多時候需要結合用戶的輸入數據動態構造 Sql 語句,如果用戶輸入的數據被構造成惡意 Sql 代碼,Web 應用又未對動態構造的 Sql 語句使用的參數進行審查,則會帶來意想不到的危險。
二、實驗過程
?本實驗將通過 LAMP 搭建 Sql 註入環境,兩個實驗分別介紹 Sql 註入爆破數據庫、Sql 註入繞過驗證兩個知識點。
1、Sql 註入示例一.猜解數據庫
(1)如下圖所示,先下載文件並解壓運行:
(2)進入 Firefox 瀏覽器,輸入網址 : localhost/dvwasql , 點擊create/Reset Database創建數據庫:
(3)進入登錄界面,默認用戶名為:admin 密碼為:password
(4)將 Security 級別調整為 low
(5)進入 SQL injection頁面開始註入:
(6)先輸入 1 ,查看回顯 (URL中ID=1,說明php頁面通過get方法傳遞參數):
(7)那實際上後臺執行了什麽樣的Sql語句呢?點擊 view source查看源代碼 :
可以看到,實際執行的Sql語句是:
SELECT first_name, last_name FROM users WHERE user_id = ‘1‘;
我們是通過控制參數Id的值來返回我們需要的信息。如果我們不按常理出牌,比如在輸入框中輸入 1‘ order by 1#,實際執行的Sql語句就會變成:
SELECT first_name, last_name FROM users WHERE user_id = ‘1‘ order by 1#`;(按照Mysql語法,#後面會被註釋掉,使用這種方法屏蔽掉後面的單引號,避免語法錯誤)
這條語句的意思是查詢users表中user_id為1的數據並按第一字段排行。
(8)輸入 1‘ order by 1#和 1‘ order by 2#時都返回正常,當輸入 1‘ order by 3#時,返回錯誤:
由此可知,users表中只有兩個字段,數據為兩列。
?接下來我們使用 union select聯合查詢繼續獲取信息。union 運算符可以將兩個或兩個以上 select 語句的查詢結果集合合並成一個結果集合顯示,即執行聯合查詢。需要註意在使用 union 查詢的時候需要和主查詢的列數相同,而我們之前已經知道了主查詢列數為 2,接下來就好辦了。輸入1‘ union select database(),user()#進行查詢 :
- database()將會返回當前網站所使用的數據庫名字.
user()將會返回執行當前查詢的用戶名.
實際執行的Sql語句是 :
SELECT first_name, last_name FROM users WHERE user_id = ‘1‘ union select database(),user()#`;
通過上圖返回信息,我們成功獲取到:
- 當前網站使用數據庫為 dvwa .
當前執行查詢用戶名為 root@localhost .
同理我們再輸入 1‘ union select version(),@@version_compile_os#進行查詢:
- version() 獲取當前數據庫版本.
@@version_compile_os 獲取當前操作系統。
實際執行的Sql語句是:
SELECT first_name, last_name FROM users WHERE user_id = ‘1‘ union select version(),@@version_compile_os#`;
(9)接下來我們嘗試獲取 dvwa 數據庫中的表名。
由經驗我們可以大膽猜測users表的字段為 user 和 password ,所以輸入:1‘ union select user,password from users#進行查詢:
2、Sql 註入實例二.驗證繞過
(1)如下圖所示,先下載文件並解壓運行:
(2)進入 Firefox 瀏覽器,輸入網址 : localhost/sql2 , 按照順序,初始化數據:
(3)準備工作完成之後,我們進入首頁發現這是一個普通的登錄頁面,只要輸入正確的用戶名和密碼就能登錄成功。我們先嘗試隨意輸入用戶名 123 和密碼 123 登錄,發現提示錯誤。
(4)按照第一個實驗的思路,我們嘗試在用戶名中輸入 123‘ or 1=1 #, 密碼同樣輸入 123‘ or 1=1 # :
為什麽能夠成功登陸呢?因為實際執行的語句是:
select * from users where username=‘123‘ or 1=1 #‘ and password=‘123‘ or 1=1 #‘
按照 Mysql 語法,# 後面的內容會被忽略,所以以上語句等同於(實際上密碼框裏不輸入任何東西也一樣):
select * from users where username=‘123‘ or 1=1
由於判斷語句 or 1=1 恒成立,所以結果當然返回真,成功登錄。
(5)再嘗試不使用 # 屏蔽單引號,采用手動閉合的方式:我們嘗試在用戶名中輸入 123‘ or ‘1‘=‘1, 密碼同樣輸入 123‘ or ‘1‘=‘1 (不能少了單引號,否則會有語法錯誤):
實際執行的 Sql 語句是:
select * from users where username=‘123‘ or ‘1‘=‘1‘ and password=‘123‘ or ‘1‘=‘1`
兩個 or 語句使 and 前後兩個判斷永遠恒等於真,所以能夠成功登錄。
總結
?一般來說,SQL註入一般存在於形如HTTP://xxx.xxx.xxx/abc.asp?id=XX等帶有參數的ASP動態網頁中,有時一個動態網頁中可能只有一個參數,有時可能又N個參數,有時是整型參數,有時是字符串型參數,不能一概而論。總之只要是帶有參數的動態網頁且此網頁訪問了數據庫,那麽就有可能存在SQL註入。如果ASP程序員沒有安全意識,不進行必要的字符過濾,存在SQL註入的可能性就非常大。至於如何防範SQL註入攻擊:請參考http://blog.csdn.net/testeralai/article/details/26478469
2017-2018-1 20179215《Linux內核原理與分析》第十二周作業