一些基礎理論的總結

信息安全/網絡安全  面試知識點javascript

本身總結,總有不足,歡迎留言,不勝感激。php

 

面試總得來講分紅四個大部分,即計算機網絡,網絡編程,WEB安全技術,Linux系統html

 

1、計算機網絡前端

 

網絡七層協議?java

 

從上到下分別是 7 應用層 6 表示層 5 會話層 4 傳輸層 3 網絡層 2 數據鏈路層 1 物理層python

 

 

 

三次握手?linux

TCP在傳輸以前會進行三次溝通,通常稱爲「三次握手」,傳完數據斷開的時候要進行四次溝通,通常稱爲「四次揮手」。git

兩個序號和三個標誌位:web

  (1)序號:seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
  (2)確認序號:ack序號,佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,ack=seq+1。
  (3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義以下:
  (A)URG:緊急指針(urgent pointer)有效。
  (B)ACK:確認序號有效。
  (C)PSH:接收方應該儘快將這個報文交給應用層。
  (D)RST:重置鏈接。
  (E)SYN:發起一個新鏈接。
  (F)FIN:釋放一個鏈接。

 須要注意的是:
  (A)不要將確認序號ack與標誌位中的ACK搞混了。
  (B)確認方ack=發起方req+1,兩端配對。
面試

在第一次消息發送中,A隨機選取一個序列號做爲本身的初始序號發送給B;第二次消息B使用ack對A的數據包進行確認,

由於已經收到了序列號爲x的數據包,準備接收序列號爲x+1的包,因此ack=x+1,同時B告訴A本身的初始序列號,就是seq=y;

第三條消息A告訴B收到了B的確認消息並準備創建鏈接,A本身此條消息的序列號是x+1,因此seq=x+1,而ack=y+1是表示A正準備接收B序列號爲y+1的數據包。

四次揮手:

因爲TCP鏈接時全雙工的,所以,每一個方向都必需要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的鏈接,

收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,可是在這個TCP鏈接上仍然可以發送數據,直到這一方向也發送了FIN。

首先進行關閉的一方將執行主動關閉,而另外一方則執行被動關閉,上圖描述的便是如此。
 (1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
  (2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
 (3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
  (4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。

(1)三次握手是什麼或者流程?四次握手呢?答案前面分析就是。
(2)爲何創建鏈接是三次握手,而關閉鏈接倒是四次揮手呢?
  這是由於服務端在LISTEN狀態下,收到創建鏈接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。而關閉鏈接時,收到對方的FIN報文時,

僅僅表示對方再也不發送數據了可是還能接收數據,己方也未必所有數據都發送給對方了,因此己方能夠當即close,也能夠發送一些數據給對方後,

再發送FIN報文給對方來表示贊成如今關閉鏈接,所以,己方ACK和FIN通常都會分開發送。

爲何TIME_WAIT狀態須要通過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

不該該是爲了防止B發送的FIN=1的包的丟失,由於若是A沒有收到來自B的釋放鏈接請求,是不會進入TIME-WAIT狀態的。

因此正確的解釋是:A發送的確認釋放鏈接信息B沒有收到,這時候B會再次發送一個FIN=1的釋放鏈接請求,而這個時候A還處於TIME-WAIT,因此能夠再次發送確認信息

 

 

標準Http協議支持六種請求方法

一、GET       GET能夠說是最多見的了,它本質就是發送一個請求來取得服務器上的某一資源。資源經過一組HTTP頭和呈現據(如HTML文本,或者圖片或者視頻等)返回給客戶端。GET請求中,永遠不會包含呈現數據。

二、POST      向服務器提交數據。這個方法用途普遍,幾乎目前全部的提交操做都是靠這個完成。

三、PUT      這個方法比較少見。HTML表單也不支持這個。本質上來說, PUT和POST極爲類似,都是向服務器發送數據,但它們之間有一個重要區別,PUT一般指定了資源的存放位置,而POST則沒有,POST的數據存放位置由服務器本身決定。

四、Delete    刪除某一個資源。基本上這個也不多見,不過仍是有一些地方好比amazon的S3雲服務裏面就用的這個方法來刪除資源。

五、HEAD    HEAD和GET本質是同樣的,區別在於HEAD不含有呈現數據,而僅僅是HTTP頭信息。有的人可能以爲這個方法沒什麼用,其實不是這樣的。想象一個業務情景:欲判斷某個資源是否存在,咱們一般使用GET,但這裏用HEAD則意義更加明確。

六、Options    它用於獲取當前URL所支持的方法。若請求成功,則它會在HTTP頭中包含一個名爲「Allow」的頭,值是所支持的方法,如「GET, POST」。

 

 

http請求頭

通常狀況:

Accept
Accept-Encoding
Accept-Language
Connection
Cookie
Host
Referer
User-Agent

 

 

socket原理
       Socket鏈接,至少須要一對套接字,分爲clientSocket,serverSocket.鏈接分爲3個步驟:
服務器監聽:服務器並不定位具體客戶端的套接字,而是時刻處於監聽狀態.
客戶端請求:客戶端的套接字要描述它要鏈接的服務器的套接字.提供地址和端口號,而後向服務器套接字提出鏈接請求.
鏈接確認:當服務器套接字收到客戶端套接字發來的請求後,就響應客戶端套接字的請求,並創建一個新的線程,把服務器端的套接字的描述發給客戶端,一旦客戶端確認了此描述,就正式創建鏈接.而服務器套接字繼續處於監聽狀態,繼續接收其餘客戶端套接字的鏈接請求.

 客戶端:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)      #定義socket類型,網絡通訊,TCP
s.connect((HOST,PORT))       #要鏈接的IP與端口

 

 

TCP與UDP的區別
1.基於鏈接與無鏈接;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程序結構較簡單;
4.流模式與數據報模式 ;
5.TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。

 

 

 

WEB安全技術

SQL注入漏洞

SQL注入漏洞的造成緣由:用戶輸入的數據被SQL解釋器執行

SQL的注入類型有如下5種:

  1. Boolean-based blind SQL injection(布爾型注入)
  2. Error-based SQL injection(報錯型注入)
  3. UNION query SQL injection(可聯合查詢注入)
  4. Stacked queries SQL injection(可多語句查詢注入)
  5. Time-based blind SQL injection(基於時間延遲注入)

Boolean-based blind SQL injection(布爾型注入)


經過判斷頁面返回狀況得到想要的信息。

以下SQL注入: http://hello.com/view?id=1 and substring(version(),1,1)=5

若是服務端MySQL版本是5.X的話,那麼頁面返回的內容就會跟正常請求同樣。攻擊者就能夠經過這種方式獲取到MySQL的各種信息。

Error-based SQL injection(報錯型注入)


若是頁面可以輸出SQL報錯信息,則能夠從報錯信息中得到想要的信息。

典型的就是利用group by的duplicate entry錯誤。關於這個錯誤,貌似是MySQL存在的 bug

以下SQL注入: http://hello.com/view?id=1%20AND%20(SELECT%207506%20FROM(SELECT%20COUNT(*),CONCAT(0x717a707a71,(SELECT%20MID((IFNULL(CAST(schema_name%20AS%20CHAR),0x20)),1,54)%20FROM%20INFORMATION_SCHEMA.SCHEMATA%20LIMIT%202,1),0x7178786271,FLOOR(RAND(0)*2))x%20FROM%20INFORMATION_SCHEMA.CHARACTER_SETS%20GROUP%20BY%20x)a)

在拋出的SQL錯誤中會包含這樣的信息: Duplicate entry 'qzpzqttqxxbq1' for key 'group_key',其中qzpzq和qxxbq分別是0x717a707a71和0x7178786271,用這兩個字符串包住了tt(即數據庫名),是爲了方便sql注入程序從返回的錯誤內容中提取出信息。

UNION query SQL injection(可聯合查詢注入)


最快捷的方法,經過UNION查詢獲取到全部想要的數據,前提是請求返回後能輸出SQL執行後查詢到的全部內容。

以下SQL注入:http://hello.com/view?id=1 UNION ALL SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.SCHEMATA

Stacked queries SQL injection(可多語句查詢注入)


即可以執行多條查詢語句,很是危險,由於這意味着可以對數據庫直接作更新操做。

以下SQL注入:http://hello.com/view?id=1;update t1 set content = 'aaaaaaaaa'

在第二次請求 http://hello.com/view?id=1時,會發現全部的content都被設置爲aaaaaaaaa了。

Time-based blind SQL injection(基於時間延遲注入)


頁面不會返回錯誤信息,不會輸出UNION注入所查出來的泄露的信息。相似搜索這類請求,boolean注入也無能爲力,由於搜索返回空也屬於正常的,這時就得采用time-based的注入了,即判斷請求響應的時間,但該類型注入獲取信息的速度很是慢。

以下SQL注入:http://hello.com/view?q=abc' AND (SELECT * FROM (SELECT(SLEEP(5)))VCVe) OR 1 = '

該請求會使MySQL的查詢睡眠5S,攻擊者能夠經過添加條件判斷到SQL中,好比IF(substring(version(),1,1)=5, sleep(5), ‘t’) AS value就能作到相似boolean注入的效果,若是睡眠了5s,那麼說明MySQL版本爲5,不然不是,但這種方式獲取信息的速度就會很慢了,由於要作很是多的判斷,而且須要花時間等待,不斷地去測試出相應的值出來。

 

SQL注入解決方案
解決SQL注入問題的關鍵是對全部可能來自用戶輸入的數據進行嚴格的檢查、對數據庫配置使用最小權限原則。
常用的方案有:
全部的查詢語句都使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中。當前幾乎全部的數據庫系統都提供了參數化SQL語句執行接口,使用此接口能夠很是有效的防止SQL注入攻擊。
對進入數據庫的特殊字符('"\<>&*;等)進行轉義處理,或編碼轉換。特殊符號過濾或轉義處理。以PHP爲例,一般是採用 addslashes() 函數,它會在指定的預約義字符前添加反斜槓轉義,這些預約義的字符是:單引號 (') 雙引號 (") 反斜槓 (\) NULL。
確認每種數據的類型,好比數字型的數據就必須是數字,數據庫中的存儲字段必須對應爲int型。
數據長度應該嚴格規定,能在必定程度上防止比較長的SQL注入語句沒法正確執行。
網站每一個數據層的編碼統一,建議所有使用UTF-8編碼,上下層編碼不一致有可能致使一些過濾模型被繞過。(MYSQL用GBK的編碼時,寬字節注入:輸入%df’時通過addslashes轉義變成 %dF%5C%27 在經過GBK編碼後變成 運’)嚴格限制網站用戶的數據庫的操做權限,給此用戶提供可以知足其工做的權限,從而最大限度的減小注入攻擊對數據庫的危害。
避免網站顯示SQL錯誤信息,好比類型錯誤、字段不匹配等,防止攻擊者利用這些錯誤信息進行一些判斷。
在網站發佈以前建議使用一些專業的SQL注入檢測工具進行檢測,及時修補這些SQL注入漏洞。

 

這裏咱們看一下通常的CMS是怎麼過濾的,通常會寫一個函數,用的時候直接調用,我之前審計過的一篇文章(http://www.cnblogs.com/Oran9e/p/7944859.html)

xdcms_3.0.0 存在SQL注入漏洞,過濾的話是把所過濾的關鍵字都寫在一個函數 safe_html ()函數

function safe_html($str){
    if(empty($str)){return;}
    $str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
|outfile/','',$str);
    return htmlspecialchars($str);
}

分析一下這個過濾函數,只是簡單的把上面看到的 select ,insert,update 等等替換成了空 。

在 safe_html 處雖然過了個SQL注入的敏感詞,還過濾了=和*,可是沒有考慮SQL注入敏感詞的大小寫,這裏只過濾了小寫,那麼咱們用大寫繞過,這裏過濾的=和*,咱們可使用不帶*和=的常規保存SQL注入語句

這裏利用報錯注入來進行測試,bestorange' or updatexml(1,concat(0x7e,(selEct concat(username,0x23,password) frOm c_admin),0x7e),1) #&password=bestorange

payload:username=bestorange' or updatexml(1,concat(0x7e,(selEct concat(username,0x23,password) frOm c_admin),0x7e),1) #&password=bestorange&password2=bestorange&fields%5Btruename%5D=bestorange&fields%5Bemail%5D=bestorange&submit=+%E6%B3%A8+%E5%86%8C+

 

 

 

 

XSS漏洞

XSS又叫CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意用戶的特殊目的。 xss分爲存儲型的xss和反射型xss, 基於DOM的跨站腳本XSS。

反射型:

一些經常使用的payload:

"/><script>confirm(1234)</script>
'><style/onl<meta>oad=alert(/orange/)%2b'
</textarea> <svg/onload="alert(1)">
<img src="javascript:alert('XSS')">
"><img src=hi onerror=alert(1)>
<svg onload=alert(1)>
<svg onload=alert(document.cookie)>
<IFRAME src=javascript:alert('52')></IFRAME>

 

存儲型:

反射型XSS與DOM型XSS都必須依靠用戶手動去觸發,而存儲型XSS卻不須要。

 

基於DOM的跨站腳本XSS:經過訪問document.URL 或者document.location執行一些客戶端邏輯的javascript代碼。不依賴發送給服務器的數據。

DOM包含一個對象叫document,document裏面有個URL屬性,這個屬性裏填充着當前頁面的URL。當解析器到達javascript代碼,它會執行它而且修改你的HTML頁面。假若代碼中引用了document.URL,那麼,這部分字符串將會在解析時嵌入到HTML中,而後當即解析,同時,javascript代碼會找到(alert(…))而且在同一個頁面執行它,這就產生了xss的條件。IE6下沒有轉換<和>

<HTML>
<TITLE>Welcome!</TITLE>
Hi
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome to our system
…
</HTML>

 

 

DOM型XSS是前端代碼中存在了漏洞,而反射型是後端代碼中存在了漏洞。反射型和存儲型xss是服務器端代碼漏洞形成的

存儲型XSS其實和反射型XSS差很少,只是存儲型把數據保存到服務端,而反射型只是讓XSS遊走在客戶端上

XSS防護的整體思路是:對輸入(和URL參數)進行過濾,對輸出進行編碼

也就是對提交的全部內容進行過濾,對url中的參數進行過濾,過濾掉會致使腳本執行的相關內容;而後對動態輸出到頁面的內容進行html編碼,使腳本沒法在瀏覽器中執行。雖然對輸入過濾能夠被繞過,可是也仍是會攔截很大一部分的XSS攻擊

XSS 通常讀取用戶瀏覽器中的Cookie,而若是在服務器端對 Cookie 設置了HttpOnly 屬性,那麼就不能讀取到cookie

在輸出數據以前對潛在的威脅的字符進行編碼、轉義是防護XSS攻擊十分有效的措施。經常使用 htmlspecialchars()函數進行編碼。

對於輸入,處理使用XSS filter以外,對於每個輸入,在客戶端和服務器端還要進行各類驗證,驗證是否合法字符,長度是否合法,格式是否正確。在客戶端和服務端都要進行驗證,由於客戶端的驗證很容易被繞過。其實這種驗證也分爲了黑名單和白名單。黑名單的驗證就是不能出現某些字符,白名單的驗證就是隻能出現某些字符。儘可能使用白名單。

 
 
 
文件上傳漏洞
截斷上傳:截斷的核心,就是chr(0)這個字符,這個字符不爲空(Null),也不是空字符("")。
當程序在輸出含有chr(0)變量時,chr(0)後面的數據會被中止,換句話說,就是誤把它當成結束符,後面的數據直接忽略,這就致使漏洞產生
 

文件上傳應該是最經常使用的漏洞了,上傳函數就那一個 move_uploaded_file();通常來講找這個漏洞就是直接ctrl+f 直接開搜。遇到沒有過濾的直接傳個一句話的webshell上去。

上傳的漏洞比較多,Apache配置,iis解析漏洞等等。在php中通常都是黑白名單過濾,或者是文件頭,content-type等等。通常來找上傳的過濾函數進行分析就行。

(1) 未過濾或本地過濾:服務器端未過濾,直接上傳PHP格式的文件便可利用。

(2) 黑名單擴展名過濾:限制不夠全面:IIS默認支持解析.asp,.cdx, .asa,.cer等。不被容許的文件格式.php,可是咱們能夠上傳文件名爲1.php (注意後面有一個空格)

(3) 文件頭 content-type驗證繞過:getimagesize()函數:驗證文件頭只要爲GIF89a,就會返回真。限制$_FILES["file"]["type"]的值 就是人爲限制content-type爲可控變量。

(4)過濾不嚴或被繞過:好比大小寫問題,網站只驗證是不是小寫,咱們就能夠把後綴名改爲大寫。

(5)文件解析漏洞:好比 Windows 系統會涉及到這種狀況:文件名爲1.php;.jpg,IIS 6.0 可能會認爲它是jpg文件,可是執行的時候會以php文件來執行。咱們就能夠利用這個解析漏洞來上傳。再好比 Linux 中有一些未知的後綴,好比a.php.xxx。因爲 Linux 不認識這個後綴名,它就可能放行了,攻擊者再執行這個文件,網站就有可能被控制。

(6)路徑截斷:就是在上傳的文件中使用一些特殊的符號,使文件在上傳時被截斷。好比a.php%00.jpg,這樣在網站中驗證的時候,會認爲後綴是jpg,可是保存到硬盤的時候會被截斷爲a.php,這樣就是直接的php文件了。經常使用來截斷路徑的字符是:\0  , ?  ,  %00  ,   也能夠超長的文件路徑形成截斷。

文件上傳修復建議:文件上傳的目錄設置爲不可執行,使用隨機數改寫文件名和文件路徑:一個是上傳後沒法訪問;再來就是像shell.php.rar.rar和crossdomain.xml這種文件,都將由於重命名而沒法攻擊。判斷文件類型:強烈推薦白名單方式。
 

 

 

文件包含

 PHP的文件包含能夠直接執行包含文件的代碼,包含的文件格式是不受限制的,只要能正常執行便可。

文件包含有這麼兩種:本地包含(LFI)和遠程包含(RFI)。,顧名思義就能理解它們的區別在哪。

審計的時候函數都是同樣的,這個四個包含函數: include() ; include_once() ; require();require_once().include 和 require 語句是相同的,除了錯誤處理方面:require 會生成致命錯誤(E_COMPILE_ERROR)並中止腳本,include 只生成警告(E_WARNING),而且腳本會繼續。

先說一下本地包含,本地包含就指的是隻能包含本機文件的漏洞,通常要配合上傳,或者是已控的數據庫來進行使用。

再來看一下遠程文件包含

當服務器的php配置中選項allow_url_fopen與allow_url_include爲開啓狀態時,服務器會容許包含遠程服務器上的文件。若是對文件來源沒有檢查的話,就容易致使任意遠程代碼執行。allow_url_include在默認狀況下是關閉的,若是想要實驗測試的話,能夠去打開,可是真實環境中建議關閉。

漏洞修復建議:1.PHP中可使用open_basedir配置限制訪問限制在指定的區域。2.對文件路徑參數過濾./ \等字符。3.禁止服務器遠程文件包含。

 

 

任意文件上傳/下載/刪除 漏洞

因爲對用戶上傳的文件未進行嚴格過濾,用戶能夠把包含某些代碼的腳本文件上傳到服務器,從而獲取WebShell。經過使用WebShell,攻擊者能夠控制服務器的文件系統,操做數據庫,執行系統命令等,從而給目標服務器帶來不可逆轉的損失。

攻擊者經過任意文件下載漏洞能夠遍歷目標服務器的文件系統,得到某些敏感配置文件或源代碼文件的內容。

因爲未對用戶刪除的文件作嚴格的權限控制或缺少判斷,攻擊者經過遍歷能夠刪除網站服務器上的其它文件,從而致使網站中止服務或丟失數據。

1.攻擊者能夠經過上傳漏洞獲取WebSell從而控制目標服務器。

2.攻擊者經過任意文件下載漏洞能夠獲取服務器上的敏感配置文件或源碼文件內容。
3.攻擊者經過任意文件刪除漏洞能夠干擾網站的正常運行致使網站中止服務和丟失數據。

漏洞修復建議:1.對於文件上傳能夠採用白名單的形式限制上傳後綴,同時採用從新隨機命名的方式進行重命名。並且應當限制上傳目錄不可執行源碼腳本或程序。

2.對於任意文件下載或刪除漏洞能夠過濾用戶輸入參數中的./\等字符,限定可操做的文件在容許的目錄範圍內。

 

 

目錄遍歷漏洞

目錄遍歷漏洞是指經過在URL或參數中構造「../」,或「../」和相似的跨父目錄字符串的ASCII編碼、unicode編碼等,完成目錄跳轉,讀取操做系統特殊目錄下的文件列表或文件內容。

目錄遍歷漏洞容許惡意攻擊者突破Web應用程序的安全控制,直接訪問攻擊者想要的敏感數據。包括配置文件、日誌、源代碼、文件列表等,配合其它漏洞的綜合利用,攻擊者能夠輕易的獲取更高的權限。

漏洞修復建議:1.對網站用戶提交過來的文件名進行硬編碼或者統一編碼,對文件後綴進行白名單控制,對包含了惡意的符號或者空字節進行拒絕。

2.Web應用程序可使用chrooted環境訪問包含被訪問文件的目錄,或者使用絕對路徑+參數來控制訪問目錄,使其即便是越權或者跨越目錄也是在指定的目錄下。

 

 

非受權訪問

能夠理解爲須要安全配置或權限認證的受權頁面能夠直接訪問。

1.重要權限可被操做。
2.重要信息泄露。

漏洞修復建議:涉及用戶操做的功能增強權限驗證。

 

 

代碼執行

代碼執行審計和sql漏洞審計很類似,sql注入是想sql語句注入在數據庫中,代碼執行是將可執行代碼注入到webservice 。這些容易致使代碼執行的函數有如下這些:eval(), asset() , preg_replace(),call_user_func(),call_user_func_array(),array_map()其中preg_replace()須要/e參數。

代碼執行注入就是 在php裏面有些函數中輸入的字符串參數會當作PHP代碼執行。

Eval函數在PHP手冊裏面的意思是:將輸入的字符串編程PHP代碼

 

 命令執行

代碼執行說的是可執行的php腳本代碼,命令執行就是能夠執行系統命令(cmd)或者是應用指令(bash),這個漏洞也是由於傳參過濾不嚴格致使的,

通常咱們說的php可執行命令的函數有這些:system();exec();shell_exec();passthru();pcntl_exec();popen();proc_open();

反引號也是能夠執行的,由於他調用了shell_exec這個函數。

漏洞修復建議:1.對用戶輸入的參數進行轉義和過濾。2.對於PHP儘可能少用可能形成代碼或命令執行的函數,並在disable_functions中禁用。

 

 

 

CSRF 漏洞
csrf 和 xss 常常做爲比較(實例分析:http://www.cnblogs.com/Oran9e/p/8667212.html)

XSS: 經過客戶端腳本語言(最多見如:JavaScript),在一個論壇發帖中發佈一段惡意的JavaScript代碼就是腳本注入,若是這個代碼內容有請求外部服務器,那麼就叫作XSS!

CSRF:冒充用戶發起請求(在用戶不知情的狀況下),完成一些違背用戶意願的請求(如惡意發帖,刪帖,改密碼,發郵件等)。

一個論壇,通過個人屢次抓包分析(着重分析請求返回頭,請求返回體)瞭解到這個論壇的刪帖操做是觸發 csdnblog.com/bbs/delete_article.php?id=「X" 那麼,我只須要在論壇中發一帖,包含一連接:www.csdnblog.com/bbs/delete_article.php?id=「X" ,只要有用戶點擊了這個連接,那麼ID爲X的這一篇文章就被刪掉了,並且是用戶徹底不知情的狀況(敲黑板狀:此處我可沒有寫XSS腳本哦,我純粹是發一個url地址出來而已,既然刪除操做能夠僞造,那麼只要我細細分析,其餘操做(發帖,更名字,發私信,只要是這個論壇具備的功能)我均可以僞造咯!
漏洞修復建議: 一、 經過token或者session來判斷當前用戶身份。二、 敏感操做須要驗證碼,更改密碼須要驗證老密碼。
 
 
 
SSRF 漏洞

SSRF漏洞是如何產生的?

SSRF(Server-Side Request Forgery:服務器端請求僞造) 是一種由攻擊者構造造成由服務端發起請求的一個安全漏洞。通常狀況下,SSRF攻擊的目標是從外網沒法訪問的內部系統。(正是由於它是由服務端發起的,因此它可以請求到與它相連而與外網隔離的內部系統)

SSRF 造成的緣由大都是因爲服務端提供了從其餘服務器應用獲取數據的功能且沒有對目標地址作過濾與限制。好比從指定URL地址獲取網頁文本內容,加載指定地址的圖片,下載等等。

目標網站接受請求後在服務器端驗證請求是否合法

攻擊者利用SSRF能夠實現的攻擊主要有3種:

一、獲取web應用可達服務器服務的banner信息以及收集內網web應用的指紋識別,如開放的端口,中間件版本信息等。

二、攻擊運行在內網的系統或應用程序,獲取內網各系統弱口令進行內網漫遊、對有漏洞的內網web應用實施攻擊獲取webshell,如st2命令執行、discuz ssrf經過redis實施getshell等。

三、利用有脆弱性的組件結合ftp://,file:///,gopher://,dict://等協議實施攻擊。如FFmpeg任意文件讀取,xxe攻擊等。

生的緣由:服務器端的驗證並無對其請求獲取圖片的參數(image=)作出嚴格的過濾以及限制,致使能夠從其餘服務器的獲取必定量的數據 

SSRF漏洞就是經過篡改獲取資源的請求發送給服務器,可是服務器並無發如今這個請求是合法的,而後服務器以他的身份來訪問其餘服務器的資源。

 file_get_contents() fsockopen() curl_exec()以上三個函數使用不當會形成SSRF漏洞
 漏洞修復建議:限制協議爲HTTP、HTTPS,禁止30x跳轉,設置URL白名單或者限制內網IP
 

 

CSRF 和 XSS 和 XXE 有什麼區別,以及修復方式?

XSS是跨站腳本攻擊,用戶提交的數據中能夠構造代碼來執行,從而實現竊取用戶信息等攻擊。修復方式:對字符實體進行轉義、使用HTTP Only來禁止JavaScript讀取Cookie值、輸入時校驗、瀏覽器與Web應用端採用相同的字符編碼。

CSRF是跨站請求僞造攻擊,XSS是實現CSRF的諸多手段中的一種,是因爲沒有在關鍵操做執行時進行是否由用戶自願發起的確認。修復方式:篩選出須要防範CSRF的頁面而後嵌入Token、再次輸入密碼、檢驗Referer 
XXE是XML外部實體注入攻擊,XML中能夠經過調用實體來請求本地或者遠程內容,和遠程文件保護相似,會引起相關安全問題,例如敏感文件讀取。修復方式:XML解析庫在調用時嚴格禁止對外部實體的解析。

 

 

CSRF、SSRF和重放攻擊有什麼區別?

CSRF是跨站請求僞造攻擊,由客戶端發起 
SSRF是服務器端請求僞造,由服務器發起 
重放攻擊是將截獲的數據包進行重放,達到身份認證等目的
 

 

 

Linux系統 

Linux如何查看端口

netstat -tunlp |grep 端口號,用於查看指定的端口號的進程狀況,如查看8000端口的狀況,netstat -tunlp |grep 8000

ps -aux /  ps aux |more

netstat -an | more

 

linux查找文件

find / -name httpd.conf

根據部分文件名查找方法:find /etc -name '*srm*'    find /etc -name '*.html'

find / -amin -10 # 查找在系統中最後10分鐘訪問的文件

find / -atime -2 # 查找在系統中最後48小時訪問的文件

find / -mmin -5 # 查找在系統中最後5分鐘裏修改過的文件
find / -mtime -1 #查找在系統中最後24小時裏修改過的文件

r:4    w:2    x:1   

rwx=7

 

 linux 日誌分析

日誌的主要用途是系統審計、監測追蹤和分析統計。

/var/log/wtmp    該日誌文件永久記錄每一個用戶登陸、註銷及系統的啓動、停機的事件。所以隨着系統正常運行時間的增長該文件的大小也會愈來愈大增長的速度取決於系統用戶登陸的次數。該日誌文件能夠用來查看用戶的登陸記錄last命令就經過訪問這個文件得到這些信息並以反序從後向前顯示用戶的登陸記錄last也能根據用戶、終端 tty或時間顯示相應的記錄。

/var/run/utmp    該日誌文件記錄有關當前登陸的每一個用戶的信息。

/var/log/lastlog    是日誌子系統的關鍵文件都記錄了用戶登陸的狀況。

 

find」程序能夠查找到這些隱含文件。例如:

    # find  / -name ".. *" -print –xdev

    # find  / -name "…*" -print -xdev | cat -v

 同時也要注意象.xx」和「.mail」這樣的文件名的。

 

 

linux查看防火牆狀態:service iptables status

開啓防火牆:service iptables start

關閉防火牆:service iptables stop

 

 

 

網絡編程


python,php

代碼渣渣。。。

 就貼上寫過的python小腳本吧。

 

百度搜索引擎爬取子域名的代碼

 

#coding=utf-8
import re
import requests
sites = []
for i in range(0,10):   #10頁爲例
    i = i*10
    url = 'http://www.baidu.com/s?wd=site:qq.com&pn=%s' %i     #設定url請求
    response = requests.get(url).content   #get請求,content獲取返回包正文
    baidudomain = re.findall('style="text-decoration:none;">(.*?)/',response)
    sites += list(baidudomain)
site = list(set(sites))  #set()實現去重
print site
print "\nThe number of sites is %d" %len(site)
for i in site:
    print i

 

 

 

爬蟲--edusrc的禮品

# -*-coding:utf-8-*-  
import re
import requests
from bs4 import BeautifulSoup
import urllib
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"}##瀏覽器請求頭
all_url = 'https://src.edu-info.edu.cn/gift/'   ##開始的URL地址
start_htm = requests.get(all_url,headers=headers)##reques中的get方法來得到all_url
start_html = start_htm.content
#start_html = start_html.text.encode('GB18030')  ##編碼
Soup = BeautifulSoup(start_html,'lxml')   ##使用BeautifulSoup來解析咱們獲取的網頁(‘lxml’是指指點的解析器)
##li_list = Soup.find_all('li')  ##使用BeautifulSoup解析網頁事後就能夠找標籤(‘find_all’是指查找指定網頁的全部標籤的意思,find_all返回的是一個列表。))
#all_a = Soup.find('span',class_='pic-caption come-left').find_all('a')
#p=re.compile(r"/gift/.*?/")
#all_a=Soup.find_all('a',attrs={'href':p})
#for a in all_a:
#	title = a.get_text()
#	print(title)

print("----------------------------")
all_a = Soup.find_all('span',class_='pic-caption come-left')
for a in all_a:
	print("----------")
	b = a.contents
	for c in b:
		print c.string
##for li in li_list:
##	print(li)
##print(start_html)

 

 

 

產生隨機密碼

#!/usr/bin/env python
from random import choice
import string
def GenPasswd(length=8, chars=string.letters+string.digits):
        return ''.join([ choice(chars) for i in range(length)])

 

 

 

 

python簡單的一些實用

>>> import base64
>>> base64.b64encode('orange')
'b3Jhbmdl'
>>> base64.b64decode('b3Jhbmdl')
'orange'

 

 

>>> import md5
>>> m=md5.new()
>>> m.update("orange")
>>> md5value=m.hexdigest()
>>> print md5value
fe01d67a002dfa0f3ac084298142eccd

 

//append() 方法用於在列表末尾添加新的對象。

>>> list=[1,2,3,4]
>>> list.append(5)
>>> print list
[1, 2, 3, 4, 5]

 

利用函數把 seq 變成x?
seq= [0, 1, 2, 3, 4, 5]
x = ['1', '2', '3', '4', '5']

 

s=[]
seq=[0,1,2,3,4]
for i in seq:
    s=s+list(str(i))
print s

 

x=[str(i) for i in seq]

 

map(str,range(1,6))  //map迭代

相關文章
相關標籤/搜索