摘要:在WEB應用中有時候程序員爲了考慮靈活性,簡明性,會在代碼調用或者命令執行函數去處理。好比當應用在調用一些能將字符串轉換爲代碼的函數時,沒有考慮用戶是都能控制這個字符串,將形成代碼執行漏洞。一樣調用系統命令處理,將形成命令執行漏洞
php
eval() 函數把字符串按照 PHP 代碼來計算。 該字符串必須是合法的 PHP 代碼,且必須以分號結尾。 若是沒有在代碼字符串中調用 return 語句,則返回 NULL。若是代碼中存在解析錯誤,則 eval() 函數返回 false。
system — 執行外部程序,而且顯示輸出 $code=$_GET['x']; echo system($code) //x=ipconfig x=ver
可控變量,以及漏洞函數 無拓展功能,通常沒有此類函數
本地文件包含和遠程文件包含漏洞,本身的服務器容許別人的php代碼,實現遠程文件包含 index.php <?php $file = $_GET['file']; if(isset($file)){ include("$file"); // require(); // require_once(); // include_once(); }else{ echo "file fail"; } ?> 同文件目錄下存在其餘文件會讀取,目錄下存在index.php,默認訪問index.php,127.0.0.1/include/?file=dudu.php ../../etc/httpd.conf 本地包含漏洞能夠讀取其餘文件 172.0.0.1/uploads/include.php?file=圖片馬的地址 有文件包含,直接上傳,或者日誌進行上傳。蟻劍連馬時候,連得是目標馬的地址 ○ PHP中形成文件包含的四個函數
當使用include()函數包含文件時,只有代碼執行到include()函數時纔將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行。 當使用require()函數包含文件時,只要程序一執行就會當即調用文件,發生錯誤的時候會輸出錯誤信息,而且終止腳本的運行。
require_once()功能和require()相同,區別在於當重複調用同一文件時,程序只調用一次。 當上述的四個函數包含一個新文件時,該文件將做爲PHP代碼執行,php內核並不在乎該被包含的文件是什麼類型,若是被包含的是txt文件,圖片文件,遠程URL,也都將做爲PHP代碼執行
○ 本地文件包含,遠程文件包含的區別
PHP僞協議 事實就是支持的協議和封裝的協議12種 file:// - 訪問本地文件系統 http:// - 訪問http網站 ftp:// - 訪問FTP(s)URLS php:// - 訪問各個輸入輸出流 zlib:// - 壓縮流 data:// - 數據(RFC 2397) glob:// -查找匹配的文件路徑模型 ssh2:// - Secure Shell 2 rar:// - RAR ogg:// - 音頻流 expect:// - 處理交互式的流 目標文件 robots.txt 路徑爲127.0.0.1/www/robots.txt <?php phpinfo();?> robots.zip 127.0.0.1/www/robots.zip robots.txt 1.php 127.0.0.1/www/1.php <?php echo('Hello world')?> flag.txt D:/flag.txt flag{123test} 經常使用協議: 1.目錄遍歷獲取flag:
2.php://input php://filter (1) php://input用於執行php代碼
也能夠寫入shell獲取服務器權限 <?php fputs(fopen('shell.php','w'),'<?php eval($_POST[CMD])?>');?>
(2)php://filter 用於讀取源碼 ?file=php://filter/convert.base64-encode/resource=1.php
3.file:// 用於讀取本地系統文件,在CTF中讀取本地文件
4.data:// 能夠寫入後門,獲取權限執行任意命令
5.zip:// zip://[壓縮文件的絕對路徑]#[壓縮文件的子文件名]
6.phar協議的做用是歸檔,將多個文件分組爲一個文件。能夠處理tar和zip文件