Web應用安全

SQL注入

SQL注入:利用現有應用程序,攻擊者將精心構造的SQL語句注入到後臺數據庫,並使得數據庫引擎成功執行。php

SQL注入特色html

  • 變種極多
  • 攻擊簡單
  • 危害極大

SQL注入攻擊的危害性前端

  • 未經受權狀況下操做數據庫中的數據
  • 惡意篡改網頁的內容
  • 私自添加系統帳號或者是數據庫使用者帳號
  • 網頁木馬

SQL注入工具mysql

  • 掃描檢測
    AWVS,web掃描器,APPScan Web掃描器等,抓包代理工具burpsuite
  • 驗證測試
    sqlmap

手工探測SQL漏洞react

經過拼接SQL語句來判斷和驗證漏洞linux

// 測試語句
id=1'
and 1=1
and 1=2
order by num
union 聯合查詢
and 1=2 union select 1,2,3,4
user()
database()
group_coucat(table_name) from information_schema.tables where table_schema=tableName // table名十六進制
select * from downloads where id=1 and 1=2 union select 1,2,3,4,5,6,group_concat(username) from members;

?id=1 and 1=2 union select 1,2,3,4,5,6,load_file('/etc/passwd')
?id=1 and 1=2 union select 1,2,3,4,5,6,@@version
?id=1 and 1=2 union select 1,2,3,4,5,6,@@version_compile_os
?id=1 and 1=2 union select 1,2,3,4,5,6,@@basedir
?id=1 and 1=2 union select 1,2,3,4,5,6,@@datadir

SQL防護web

  • 代碼層防護
  • 第三方安全程序及設備

代碼層防護sql

編碼階段:shell

  • 對輸入進行驗證
  • 靜態查詢
  • 最小權限
  • 通用防注入腳本
  • 安全函數(PHP程序:addslashes, mysql_real_escape_string等)

測試階段:數據庫

  • 代碼驗證

產品化階段:

  • Web應用安全網關

第三方安全程序

  • 軟件產品
    mod_security
    互聯網安全防禦產品(阿里雲盾,安全寶等同類產品)
  • 硬件
    web應用防火牆

SQL語句驗證

function CheckSql($db_string, $querytype = 'select') {
    global $cfg_cookie_encode;
    $clean = '';
    $error = '';
    $old_pos = 0;
    $pos = -1;
    $log_file = DEDEINC.'/../data/'.md5($cfg_cookie_encode).'_safe.txt';
    $userIP = GetIP();
    $getUrl = GetCurUrl();

    // 若是是普通查詢語句,直接過濾一些特殊語法
    if ($querytype=='select') {
        $notallow1 = "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}";

        // $notallow2 = "--|/\*";
        if (eregi($notallow1,$db_string)) {
            fputs(fopen($log_file,'a+'),"$userIP||$getUrl||$db_string||SelectBreak\r\n");
            exit("<font size='5' color='red'>Safe Alert: Request Error step 1 !</font>");
        }
    }

    // 完整的SQL檢查
    while (true) {
        $pos = strpos($db_string, '\'', $pos + 1);
        if ($pos === false) {
            break;
        }
        $clean .= substr($db_string, $old_pos, $pos - $old_pos);
        while (true) {
            $pos1 = strpos($db_string, '\'', $pos + 1);
            $pos2 = strpos($db_string, '\\', $pos + 1);
            if ($pos1 === false) {
                break;
            } elseif ($pos2 == false || $pos2 > $pos1) {
                $pos = $pos1;
                break;
            }
            $pos = $pos2 + 1;
        }
        $clean .= '$s$';
        $old_pos = $pos + 1;
    }
    $clean .= substr($db_string, $old_pos);
    $clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));

    // 老版本的Mysql並不支持union,經常使用的程序裏也不使用union,可是一些黑客使用它,因此檢查它
    if (strpos($clean, 'union') !== false && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0) {
        $fail = true;
        $error="union detect";
    }

    // 發佈版本的程序可能比較少包括--,#這樣的註釋,可是黑客常常使用它們
    elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== false || strpos($clean, '#') !== false) {
        $fail = true;
        $error="comment detect";
    }

    // 這些函數不會被使用,可是黑客會用它來操做文件,down掉數據庫
    elseif (strpos($clean, 'sleep') !== false && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0) {
        $fail = true;
        $error="slown down detect";
    }
    elseif (strpos($clean, 'benchmark') !== false && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0) {
        $fail = true;
        $error="slown down detect";
    } elseif (strpos($clean, 'load_file') !== false && preg_match('~(^|[^a-z])load_file($|[^[a-z])~s', $clean) != 0) {
        $fail = true;
        $error="file fun detect";
    } elseif (strpos($clean, 'into outfile') !== false && preg_match('~(^|[^a-z])into\s+outfile($|[^[a-z])~s', $clean) != 0) {
        $fail = true;
        $error="file fun detect";
    }

    // 老版本的MYSQL不支持子查詢,程序裏可能也用得少,可是黑客可使用它來查詢數據庫敏感信息
    elseif (preg_match('~\([^)]*?select~s', $clean) != 0) {
        $fail = true;
        $error="sub select detect";
    }
}

前端攻擊

前端攻擊成因

網站的腳本經過最終一些手段生成HTML,若是HTML中含有一些惡意代碼。

跨站腳本攻擊(XSS)

  • 反射型
  • 存儲型
  • 蠕蟲病毒 // 網絡病毒,複製以後指數型遞增 (例如: 訪問關注量)

XSS英文全稱(Cross-Site-Scripting),爲了區別於cascading style sheets層疊樣式表(CSS)所以縮寫成XSS

形成結果:

  1. 用戶瀏覽器中運行攻擊者的惡意腳本,從而致使cookie信息被竊取,攻擊者可以假冒用戶的信息,進行登陸。
  2. 攻擊者可以獲取用戶的權限,來惡意使用web的功能。
  3. 能夠向用戶輸入僞造的輸入表單,經過釣魚的方式來竊取用戶的我的信息。

XSS攻擊的危害

  • 釣魚攻擊
  • 盜取cookie
// 釣魚攻擊
?id=1'<script>alert(/xss/)</script>
?id=1'<iframe src="http://www.baidu.com"></iframe> // 經過些形式(郵件,分享),來誘發用戶訪問

// 獲取cookie
?id=1'<script>alert(document.cookie)</script> // 經過一段腳本程序(包括document.cookie)將用戶的信息發送到遠程的惡意網站,惡意網站專門接收信息。(DVWA)

跨站請求僞造(CSRF)

影響關鍵處理被惡意使用

前端攻擊防護

  • 代碼層防護
  • 第三方防護手段

XSS場景:web應用等
CSRF場景:內部網絡(路由器),Web應用等

代碼層防護:

  1. 通用防XSS腳本 (轉義,過濾的方式)
  2. 安全函數
    PHP相關安全函數(htmlspecialchars,stripslashes)
  3. htmlspecialchars轉義的字符
  4. CSRF防護
    驗證referer(referer能夠僞造)
    加token認證

第三方防護手段:

  1. 軟件版
    mod_security
    互聯網安全防禦產品(阿里雲盾,安全寶等同類型產品)
  2. 硬件
    web應用防火牆

文件上傳

  • 文件上傳的場景
  • 合法性判斷繞過
  • 文件上傳漏洞防護

上傳web腳本,可以被服務器解析(web shell問題)

可以執行知足的條件:

  1. 上傳的文件可以被web容器解析執行
  2. 上傳路徑須要是web容器所覆蓋的路徑
  3. 用戶可以從web上訪問該文件

合法性判斷繞過:

  1. %00截斷 // %00空字符也就是null // 編輯器的文件上傳
  2. 解析漏洞 // IIS解析文件(asp;1.jpg或者asp/1.jpg) apache解析文件(1.php.jpeg) 舊版本apache和IIS問題

burpsuite 代理抓包。把訪問的請求截斷而後修改頭信息或者參數,繞過合法性的繞過

文件上傳漏洞防護

  • 使用JS判斷MIME類型,上傳文件作預先判斷
  • 服務端進行驗證上傳文件的準確性
  • 對文件上傳的目錄設置爲不可執行
  • 對上傳的文件進行必定規則+隨機名字重命名
  • 單獨設置文件上傳的獨立服務器

文件包含

  • 本地文件包含(LEI)
  • 遠程文件包含(RFI)
  • 文件包含漏洞防護

經過請求的方式,將本地文件包含進去,包含進行的文件都是以PHP文件解析

if ($_GET['page']) {
    include $_GET['page']    
} else {
    include 'main.php'
}

文件包含漏洞防護:

  1. 避免由外界制定文件名
  2. 避免文件名中包含目錄名
  3. 限制包含的文件範圍
  4. 對於遠程文件包含,設置php.ini配置文件中allow_url_include = off

安全加固

Apache的安全加固

  1. 默認配置
  2. 目錄權限控制
  3. 經過配置文件進行權限控制
// 文件類型
<Files ~ ".inc$">
    Order allow,deny
    Deny from all
</Files>
// 目錄訪問控制
<Directory ~ "~/var/www/admin">
    Order allow,deny
    Deny from all
</Direactory>
// 文件類型訪問控制
<FilesMatch .(txt)$>
    Order allow,deny
    Deny from all
</FilesMatch>
  1. 修改apache源代碼,從新編譯
  2. chroot_jail環境

PHP的安全加固

  1. disable_functions // 禁用一些函數
  2. open_basedir // 訪問的目錄
  3. safe_mode // 安全模式

修改php.ini中的配置

Mysql的安全加固

  1. 空口令
  2. 弱口令
  3. 應用運行權限
    linux 系統下默認低權限,而windows系統下,默認都是system權限
  4. 數據庫用戶權限應用權限過大,致使跨庫
相關文章
相關標籤/搜索