1. 程式人生 > >2017-2018-2 20179305《網絡攻防技術》第十一周作業

2017-2018-2 20179305《網絡攻防技術》第十一周作業

variable rep 錯誤 表單 程序設計 query inter 目的 date

SQL註入實驗

實驗介紹

在本次實驗中,我們修改 phpBB的web應用程序,並且關閉了phpBB實現的一些對抗SQL註入的功能。因而我們創建了一個可以被SQL註入的phpBB版本。盡管我們的修改是人工的,但是它們代表著web開發人員的一些共同錯誤。學生的任務是發現SQL註入漏洞,實現攻擊者可以達到的破壞,同時學習抵擋這樣的攻擊的技術。

預備知識

1、 SQL語言

結構化查詢語言(Structured Query Language)簡稱SQL:是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系數據庫系統;同時也是數據庫腳本文件的擴展名。

常見SQL語句

2、SQL註入

SQL註入:SQL註入能使攻擊者繞過認證機制,完全控制遠程服務器上的數據庫。SQL是結構化查詢語言的簡稱,它是訪問數據庫的事實標準。目前,大多數Web應用都使用SQL數據庫來存放應用程序的數據。幾乎所有的Web應用在後臺都使用某種SQL數據庫。跟大多數語言一樣,SQL語法允許數據庫命令和用戶數據混雜在一起的。如果開發人員不細心的話,用戶數據就有可能被解釋成命令,這樣的話,遠程用戶就不僅能向Web應用輸入數據,而且還可以在數據庫上執行任意命令了。
sql註入原理講解

3、SQL註入危害

非法讀取、篡改、添加、刪除數據庫中的數據。
盜取用戶的各類敏感信息,獲取利益。
通過修改數據庫來修改網頁上的內容。
私自添加或刪除賬號。
註入木馬等等。

環境配置

實驗需要三樣東西, Firefox、 apache、 phpBB2(鏡像中已有):

① 運行 Apache Server:鏡像已經安裝,只需運行命令sudo service apache2 start

技術分享圖片

② phpBB2 web 應用:鏡像已經安裝,通過 http://www.sqllabmysqlphpbb.com 訪問,應用程序源代碼位於/var/www/SQL/SQLLabMysqlPhpbb/

③ 配置 DNS: 上述的 URL 僅僅在鏡像內部可以訪問,原因是我們修改了/etc/hosts文件使 http://www.sqllabmysqlphpbb.com 指向本機 IP。如果需要在其他機器訪問,應該修改 hosts 文件,使 URL 映射到 phpBB2 所在機器的 IP。

④ 關閉對抗措施
PHP 提供了自動對抗 SQL 註入的機制,被稱為 magic quote,我們需要關閉它:

找到/etc/php5/apache2/php.ini

技術分享圖片
找到 magic_quotes_gpc = On 這一行改為 magic_quotes_gpc = Off

技術分享圖片

重啟 Apache:sudo service apache2 restart

技術分享圖片

實驗任務

① 對 SELECT 語句的攻擊

首先訪問虛擬機內的URL:www.sqllabmysqlphpbb.com。在進入phpBB之前系統會要求你登陸。這個登陸認證由服務器上的 login.php 實現,需要用戶輸入用戶名
和密碼來通過認證。用戶鍵入用戶名和密碼後,login.php 會將它們與 mysql 數據庫中的 username 和user_password 字段進行比較,如果匹配就登陸主界面。和其他大多數 web 應用程序一樣, PHP程序使用 SQL 語言與背後的數據庫交互。在 phpBB2 中,下面的語句實現了對用戶的認證。

SELECTuser_id,username,user_password,user_active,user_level,
user_login_tries,user_last_login_try
FROMUSERS_TABLE
WHEREusername=?$username?ANDuser_password=?md5($password)?;
if(foundonerecord)
then{allowtheusertologin}

按常理來說,如果輸入錯誤的用戶名或密碼,肯定是登錄不了的。但是對於有SQL註入漏洞的網站來說,只要構造特殊的“字符串”,就能夠成功登錄。如在用戶名輸入框中輸入‘ or 1=1#,密碼隨便輸入,此時合成的SQL查詢語句為:select * from users where username=‘‘ or 1=1#‘ and password=md5(‘‘)

“#”在mysql中是註釋符,這樣井號後面的內容將被mysql視為註釋內容,不會去執行。即select * from users where username=‘‘ or 1=1#‘ and password=md5(‘‘)等價於select * from users where username=‘‘ or 1=1,因為1=1永遠成立的,即where子句總是為真,該sql語句進一步簡化之後,等價於select * from users。由於該頁面不讓輸入“=”,所以我們只能輸入alice‘#,就可以在不知道alice密碼的情況下登錄了。

技術分享圖片

技術分享圖片

② 對 UPDATE 語句的攻擊

當用戶想要在 phpBB2 中修改他們的資料時,可以點擊 Profile,然後填寫表單修改。用戶發送修改請求後,會執行include/usercp_register.php中的一條 UPDATE SQL 語句。在這條語句中同樣有一個 SQL 註入漏洞。

下面演示以 alice 登陸,目標是修改ted 的資料信息,包括他的密碼。攻擊成功後將可以登陸 Ted 的賬號。

點擊Memberlist查看ted的信息,可以看到一個帶參數的腳本,猜測ted的id為6。

技術分享圖片

我們在profile頁面中修改ted的信息,只需在修改資料後面加上‘where user_id=6#,即將update語句中interests後的語句全部註釋掉,並將where條件設置成ted的id。

技術分享圖片

再次點擊Memberlist查看ted的信息,發現已經修改成功!

技術分享圖片

③ 對抗 SQL 註入

SQL 註入漏洞的根本原因是沒有將代碼和數據區分開。當組建一個 SQL 語句時,程序(如 PHP 程序)知道哪個部分是代碼哪個部分是數據。不幸的是當 SQL 語句送往數據庫執行時,這個邊界被打破,當程序被註入時, SQL 解釋器看到的邊界可能和最初的邊界不一樣。為了解決這個問題,保持服務端程序和數據庫看到的邊界一樣就十分重要。

(1)使用 magic_quotes_gpc 避開特殊字符。我們只需要在單引號前加一個反斜杠()PHP 提供了自動在單引號、雙引號、反斜杠和空字符前添加反斜杠的機制,如果這個
選項啟用,那麽所有這些從用戶輸入的特殊字符會被加反斜杠。啟用方法為,修改/etc/php5/apache2/php.inimagic_quotes_gpc = On,然後重啟 Apache。

技術分享圖片

(2)使用 addslashes()來避開特殊字符。

PHP 的方法 addslashes()可以達到 magic quote 同樣的功能。如果 magic quote 沒有棄用, phpBB2 的 代 碼 會 使 用 該 功 能 來 防 止 SQL 註 入 攻 擊 。 請 查 看 /var/www/SQL/SQLLabMysqlPhpbb 目錄下的 common.php。實際上為了使 SQL 註入攻擊成 功,我們註釋掉了 phpBB2 的保護措施。

請修改回 phpBB2 的保護功能,並觀察移除下面代碼中”and FALSE”前後的區別,描述 這個保護機制如果防止 SQL 註入攻擊的。

if( !get_magic_quotes_gpc() and FALSE )

為了幫助描述區別,你需要打印出 SQL 語句。

技術分享圖片

(3)使用 mysql_real_escape_string 避開特殊字符。

(4)Prepare Statement

2017-2018-2 20179305《網絡攻防技術》第十一周作業