2017-2018-2 20179305《網絡攻防技術》第十一周作業
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.ini
的 magic_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《網絡攻防技術》第十一周作業