20169212 2016-2017-2 《網絡攻防實踐》第十一週學習總結

20169212 2016-2017-2 《網絡攻防實踐》第十一週學習總結

TCP/IP 攻防實驗

實踐要求

以SEED爲攻擊機,以Linux Metasploitable/Windows Metasploitable作靶機完成TCP/IP協議攻擊。任選兩個攻擊:
ARP緩存欺騙攻擊,ICMP重定向攻擊,SYN Flood攻擊,TCP RST攻擊,TCP 會話劫持攻擊php

實驗環境

攻擊機爲SEED(IP:192.168.1.110),A:Linux Metasploitable(IP: 192.168.1.125),B:Windows Metasploitable(IP:192.168.1.144)。mysql

實驗過程及結果

1.ARP欺騙

主機Aping主機B,能夠獲得一個路由表:
web

裏面保存了IP地址與對應MAC之間的映射關係,而ARP欺騙就是改變這個表當中的映射關係。
這裏選用 netwox具進行操做
首先查看一下A的MAC地址

要欺騙A,因此在主機C當中執行如下命令
sql

而後查看A中arp緩存內容

數據庫

可發現B的MAC地址已改成攻擊機的MAC地址,達到欺騙A的目的。apache

2.SYN FLOOD攻擊

使用主機C對A實施攻擊,形成FLOOD攻擊,使用以下命令
編程

可利用Wireshark工具抓取數據包查看:
vim

能夠看出C向A發送了大量的數據包,形成了SYN FLOOD攻擊。緩存

Collabtive 系統 SQL 注入實驗

實驗介紹

SQL注入技術是利用web應用程序和數據庫服務器之間的接口來篡改網站內容的攻擊技術。經過把SQL命令插入到Web表單提交框、輸入域名框或頁面請求框中,最終欺騙服務器執行惡意的SQL命令。
在這個實驗中,咱們使用的web應用程序稱爲Collabtive。咱們禁用Collabtive的若干防禦措施,這樣咱們就建立了一個容易受到SQL注入攻擊的Collabtive版本。通過咱們的人工修改,咱們就能夠經過實驗分析許多web開發人員的常見錯誤與疏忽。在本實驗中學生的目標是找到方法來利用SQL注入漏洞實施攻擊,並經過掌握的技術來阻止此類攻擊的發生。

預備知識

一、SQL語言

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

二、SQL注入

SQL注入:SQL注入能使攻擊者繞過認證機制,徹底控制遠程服務器上的數據庫。SQL是結構化查詢語言的簡稱,它是訪問數據庫的事實標準。目前,大多數Web應用都使用SQL數據庫來存放應用程序的數據。幾乎全部的Web應用在後臺都使用某種SQL數據庫。跟大多數語言同樣,SQL語法容許數據庫命令和用戶數據混雜在一塊兒的。若是開發人員不細心的話,用戶數據就有可能被解釋成命令,這樣的話,遠程用戶就不只能向Web應用輸入數據,並且還能夠在數據庫上執行任意命令了。

三、SQL注入危害

(1)非法讀取、篡改、添加、刪除數據庫中的數據。

(2)盜取用戶的各種敏感信息,獲取利益。

(3)經過修改數據庫來修改網頁上的內容。

(4)私自添加或刪除帳號。

(5)注入木馬等等。

四、環境搭建

(1)啓動mysql數據庫

注意啓動後程序不會退出,能夠打開新的終端執行後續命令。
(2)啓動apache服務器

(3)配置DNS服務


(4)配置網站文件
sudo vim /etc/apache2/conf.d/lab.conf

輸入如圖所示內容

sudo service apache2 restart 重啓服務

訪問測試:http://www.sqllabcollabtive.com


(5)關閉php配置策略
sudo vim /etc/php5/apache2/php.ini

關於magic_quotes_off函數:

對於magic_quotes_gpc=on的狀況, 咱們能夠不對輸入和輸出數據庫的字符串數據做addslashes()和stripslashes()的操做,數據也會正常顯示;

若是此時你對輸入的數據做了addslashes()處理,那麼在輸出的時候就必須使用stripslashes()去掉多餘的反斜槓。

對於PHP magic_quotes_gpc=off 的狀況

必須使用addslashes()對輸入數據進行處理,但並不須要使用stripslashes()格式化輸出,由於addslashes()並未將反斜槓一塊兒寫入數據庫,只是幫助mysql完成了sql語句的執行。

五、實驗內容

(1)select語句的sql注入

訪問:www.sqllabcollabtive.com;當咱們知道用戶而不知道到密碼的時候,咱們能夠怎麼登錄?

查看登錄驗證文件:
sudo vim /var/www/SQL/Collabtive/include/class.user.php

修改完後重啓一下服務器:
sudo sudo service apache2 restart
咱們在$user後面加上) # 這樣就會只驗證用戶名,後面的會被#註釋
點擊登錄之後,咱們就能夠繞過密碼直接登陸:

問題:

登錄用戶名:admin') union update user set name='test' #

登錄密碼:隨意的字符

登錄失敗

image

緣由解釋

MySQL機制:update不支持union語法。

(2)update語句的sql注入

在Collabtive web應用程序中,若是用戶想更新他們的我的資料,他們能夠去個人賬戶,單擊編輯連接,而後填寫表格以更新資料信息。在用戶發送更新請求到服務器,一個UPDATE SQL語句將建造在include/class.user.php。這句話的目的是修改用戶表中的當前用戶的配置信息。
有一個在這個SQL語句中的SQL注入漏洞;
sudo vim /var/www/SQL/Collabtive/include/class.user.php
咱們能夠找到以下的代碼:

function edit($id, $name, $realname, $email, $tel1, $tel2, $company,
              $zip, $gender, $url, $address1, $address2, $state,
              $country, $tags, $locale, $avatar = "", $rate = 0.0)
    {
    $name = mysql_real_escape_string($name);
    $realname = mysql_real_escape_string($realname);
    
    //modified for SQL Lab
    //$company = mysql_real_escape_string($company);
    $email = mysql_real_escape_string($email);
    
    // further escaped parameters removed for brevity...
    
    $rate = (float) $rate;
    $id = (int) $id;
    
    if ($avatar != "")
        {
            $upd = mysql_query("UPDATE user SET name='$name', email='$email',
                                tel1='$tel1', tel2='$tel2', company='$company',
                                zip='$zip', gender='$gender', url='$url',
                                adress='$address1', adress2='$address2',
                                state='$state', country='$country',
                                tags='$tags', locale='$locale',
                                avatar='$avatar', rate='$rate' WHERE ID = $id");
        }
    else
        {
            // same query as above minus setting avatar; removed for
            // brevity
        }
    if ($upd)
        {
            $this->mylog->add($name, 'user', 2, 0);
            return true;
        }
    else
        {
            return false;
        }
    }

發現​sql語句爲:SELECT ID WHERE name=​'$user',而且company的位置是存在注入漏洞,原理同實驗一。

這樣咱們就能夠越權來修改其餘用戶的信息及密碼;咱們使用任意用戶,如: bob bob 進行登陸;

在編輯用戶的位置:user 填 ted 用戶; Company 處填:
', `pass` = '9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684' WHERE ID = 4 # '
注:這裏的 9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684 就是pass的md5值;

點擊修改,而後咱們退出當前用戶,使用ted用戶登陸,這個時候ted用戶的密碼修改成了pass。

六、防護策略

SQL注入漏洞的根本問題是數據與代碼的分離失敗,所以咱們能夠針對這個緣由進行防護。

防護策略1

防護轉義特殊字符使用,默認開啓magic_quotes_gpc,將magic_quotes_gpc值設爲On。

sudo vim /etc/php5/apache2/php.ini
sudo service apache2 restart

防護策略2--避免使用特殊字符

MySQL提供一個函數 mysql_real_escape_string(),這個函數能夠用來過濾一些特殊字符;如\x00, \n, \r, , ', " and \x1a;

防護策略3--數據與sql語句的分離

經過SQL邏輯分離來告訴數據庫究竟是哪部分是數據部分,哪一部分是SQL語句部分。

相關文章
相關標籤/搜索