又補了一大章節的課程,對我來講感受不少都要學習,不太會,那就先熟悉流程php
一、Fortify SCAhtml
二、Checkmarx CxSuitemysql
三、360代碼衛士git
參考:https://www.jianshu.com/p/cd1cb66e4d7d程序員
參考:https://www.oschina.net/p/seaygithub
參考:https://www.cnblogs.com/qiumingcheng/p/7253917.htmlweb
參考:https://zhuanlan.zhihu.com/p/32363880算法
參考:https://github.com/alpha1e0/kiwisql
參考:shell
https://wps2015.org/drops/drops/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E5%85%A5%E9%97%A8%E6%80%BB%E7%BB%93.html
(1) 本地文件包含:
(2) 遠程文件包含:
(3) 文件包含截斷:
(1) 未過濾或本地過濾:服務器端未過濾,直接上傳PHP格式的文件便可利用。
(2) 黑名單擴展名過濾:
(3) 文件頭 content-type
驗證繞過:
(4) 防範:
(1) preg_replace()
函數:
(2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…):
(3)eval()和assert():
(1) popen
和proc_open()
:
(2) 反引號命令執行:
(1) in_array(): 比較以前會自動轉換類型 (2)is_numeric():當傳入參數爲hex時 直接經過並返回true 而且MYSQL能夠直接使用hex編碼代替字符串明文 能夠二次注入 而且可能形成XSS漏洞
(3)雙等於==
和三等於===
:
(1) 未exit/return/die:
(2) 支付漏洞
(1) 鑽GPC等轉義的空子:
GBK的寬字節注入
(2)字符串問題:
a.eval()
b.assert()
c.create_function()
常見的包含函數:require,include,require_once,include_once
include $file 中,若是變量 $file 可控,則就能夠包含任意文件。
此外,根據不一樣的配置環境,能夠包含不一樣的文件:遠程文件和本地文件。
包含函數還能夠經過支持的協議和封裝協議以及 過濾器讀取任意文件內容。
例子,如
利用php流filter讀取任意文件
include($_GET('file');
// ?file=php://filter/convert.base64-encode/resource=index.php
上面的代碼中,就經過filter讀取index.php的內容,並將內容編碼成base64再輸出。
常見的命令執行函數有:
* exec() -- 執行一個外部程序
* passthru() -- 執行外部程序並顯示原始輸出
* proc_exec() -- 經過shell環境執行命令,而且將完整的輸出以字符串的方法返回
* system() -- 執行外部程序,而且顯示輸出
* popen() -- 經過popen()的參數傳遞一條命令,並對popen()所打開的文件進行執行。
copy() -- 拷貝文件
file_get_contents() -- 將整個文件讀入一個字符串
file_put_contents() -- 將一個字符串寫入文件
file() -- 將整個文件讀入一個數組中
fopen() -- 打開文件或者URL
move_uploaded_file() -- 將上傳的文件移動到新位置
readfile() -- 讀取文件
rename() --重命名文件或者目錄
rmdir() -- 刪除目錄
unlink() & delete() -- 刪除文件
詳細參考連接:https://www.zybuluo.com/Dukebf/note/715934
https://www.bbsmax.com/A/pRdB8DR6Jn/
sql注入漏洞一般有兩種利用方式。一種是權限較大,直接寫入webshell,另一種是權限較小,可是能夠讀取用戶帳號密碼,好比讀取管理員帳號密碼,登陸後臺管理。
sql注入常常出如今登陸頁面http請求中的user-agent,client-ip,x-forward-for等可能會被程序存儲到數據庫中的地方。另外,在訂單處理的地方,因爲業務邏輯複雜,常常會有二次注入漏洞。
至於在白盒審計中,若想定向挖掘sql注入漏洞,只須要注意這幾個數據庫操做關鍵字:select from , mysql_connect , mysql_query , mysql_fetch_now , update , insert , delete ; 查到這些關鍵字後,定向追蹤他們,就能夠審計sql注入漏洞
程序在進行一些操做以前,常常會進行一些編碼處理,經過輸入一些編碼函數不兼容的特殊字符,能夠致使輸出的字符變成有害數據。其中最多見的編碼注入就是mysql的寬字節注入以及urldecode/rawurldecode這兩個函數。
怎麼說呢,這個漏洞之前研究過,可是老是沒研究透。我的感受,只要是set character_set_client='gbk'或者set NAMES 'gbk',那麼就可能存在漏洞。至於原理雖然沒法搞的十分清楚,可是能夠直接手工測試。看可否吃的掉轉義字符。
解決這個漏洞的方法:
第一種方法,set NAMES 'gbk' 以後,在 set character_set_client=binary就能夠了。
第二種方法,使用pdo方式,在php5.3.6及如下版本設置 setAttribute(PDO::ATTR_EMULATE_PREPARES,false);來禁用prepared statements的仿真效果。
綜上所述,要想看代碼中是否有寬字節注入,那麼搜索幾個關鍵字:
SET NAMES
character_set_client
mysql_set_charset('gbk')
若是目標網站開啓了GPC,而且用了urldecode或者rawurldecode函數,那麼經過二次解碼,第二次就會解析出單引號,致使注入。
所以,在代碼審計中,能夠經過搜索urldecode和rawurldecode來挖掘二次注入漏洞。
一般,程序要麼被動獲取參數,好比get,post;要麼主動讀取文件或者遠程頁面;所以,過濾好這兩條路,就能夠防止sql注入。
在PHP的核心配置中,magic_quotes_gpc負責對get,post,cookie的值進行過濾,magic_quotes_runtime對從數據庫中或者文件中獲取的數據進行過濾。
可是,上面兩種方法只能過濾部分sql注入,由於他們只是轉義了單引號,雙引號,反斜槓\,空字符null,對int注入沒什麼用。由於int類型能夠直接接sql語句,不須要閉合。
這個函數對參數中的單引號,雙引號,反斜線,空字符進行過濾。可是有的程序員在開發的時候,沒有考慮到get請求中可能存在數組(這個函數是對字符串進行過濾),致使了繞過。
說實話,get請求中帶數組是怎麼帶的?這個我還真比較懵。估計得完整開發一個網站以後,才能知道get請求中帶數組是怎麼回事?
這個函數也是過濾,第一個參數是字符串,第二個參數可選,是數據庫鏈接,若沒有設置第二個參數,那就默認爲上一次鏈接的數據庫。
這個函數主要過濾的是:\x00,\n,\r,\,',",\x1a
可是,這裏的\x00和\x1a我不太懂是什麼意思。
前面的函數針對的是字符型注入,對Int型注入效果不是太好。所以,這個intval()函數就是以白名單的思想,對數據進行過濾。
A.move_uploaded_file() 接着看調用這個函數的代碼是否存在爲限制上傳格式或者能夠繞過。
B.getimagesize函數驗證:只要在文件頭添加GIF89a便可;
C文件頭content-type驗證繞過:驗證$_FILES[「file」][「type」]的值,這個是可控的。
D.函數誤用致使上傳繞過
以iconv()函數爲例,在iconv轉碼的過程當中,utf->gb2312(其餘部分編碼之間轉換一樣存在這個問題)會致使字符串被截斷,如:$filename=」shell.php(hex).jpg」;(hex爲0x80-0x99),通過iconv轉碼後會變成$filename=」shell.php 「。
E.競爭上傳,主要涉及到的爲copy函數。
文件上傳首先須要一個表單,以下,咱們把它叫作a.html
:
<form action="t.php" method="post" enctype="multipart/form-data"><input name="aaa" type="file" /><input type="submit" /></form>
這裏有幾個要素:
action
屬性是提交的目標。method
屬性是提交所用的HTTP方法,經常使用的就是 POST 和 GET,文件上傳通常用 POST。enctype
屬性必需要寫成這樣,由於文件上傳和普通的提交具備不一樣的編碼方式。若是不寫的話,可能會被當作urlencoded
,就是k1=v1&k2=v2
的鍵值對形式,致使解析不出東西。name
屬性很是重要,它是PHP腳本中尋找文件的關鍵字。接下來是PHP腳本中的東西,PHP中經過$_FILES
對象來讀取文件,經過下列幾個屬性:
$_FILES[file]['name']
- 被上傳文件的名稱。$_FILES[file]['type']
- 被上傳文件的類型。$_FILES[file]['size']
- 被上傳文件的大小(字節)。$_FILES[file]['tmp_name']
- 被上傳文件在服務器保存的路徑,一般位於臨時目錄中。$_FILES[file]['error']
- 錯誤代碼,0爲無錯誤,其它都是有錯誤。t.php
中的代碼寫成這樣:
<?phpif(!isset($_FILES['aaa'])) { echo 'file not found'; exit(); } var_dump($_FILES['aaa'])
能夠看到那個aaa
就是文件輸入框中的name
屬性。
咱們把這兩個文件放到服務器的目錄中,或者直接在目錄下啓動PHP自帶的服務器。以後打開a.html
隨便傳上去一個文件,會獲得這樣的結果,這裏我直接上傳了a.html
:
array(5) { ["name"]=> string(6) "a.html" ["type"]=> string(9) "text/html" ["tmp_name"]=> string(44) "C:\Users\asus\AppData\Local\Temp\php43A1.tmp" ["error"]=> int(0) ["size"]=> int(133) }
須要說的是,在處理文件上傳的時候,不該信任文件類型type
,由於類型在瀏覽器生成以後,是能夠改的。甚至能夠手動構造出於類型與實際內容不匹配的數據包。
同時也不該該信任文件名稱name
。而是應該分離文件名與擴展名,對擴展名進行白名單過濾。文件名按需捨棄從新生成,或者過濾後再使用。
A、PHP網站的定義:
B、PHP反序列化
二、理解PHP反序列化漏洞
三、PHP反序列化漏洞利用的前提
a.unserialize()函數的參數可控;
b.php文件中存在可利用的類,類中有魔術方法
四、PHP反序列化漏洞—發現技巧
五、PHP反序列化漏洞—構造exploit思路
六、案例分析
https://www.cnblogs.com/xiaozi/p/7839256.html
https://www.grt1st.cn/posts/php-unserialize-analysis/
注:以上大多轉自破殼筆記學習資料,歡迎你們前來報名學習