搜尋
首頁後端開發php教程如何對PHP程式中的常見漏洞進行攻擊(下)_PHP教程

如何對PHP程式中的常見漏洞進行攻擊(下)
翻譯:analysist(分析家)
來源:http://www.china4lert.org

如何對PHP程式的常見漏洞進行攻擊(下)

原著:Shaun Clowes
翻譯:analysist

[庫檔案]
正如我們前面討論的那樣,include()和require()主要是為了支援程式碼庫,因為我們一般是把一些經常使用的函數放到一個獨立的檔案中,這個獨立的檔案就是程式碼庫,當需要使用其中的函數時,我們只要把這個程式碼庫包含到目前的檔案中就可以了。

最初,人們開發和發布PHP程式的時候,為了區別程式碼庫和主程式碼,一般是為程式碼庫檔案設定一個「.inc」的副檔名,但他們很快就發現這是一個錯誤,因為這樣的檔案無法被PHP解譯器正確解析為PHP程式碼。如果我們直接要求伺服器上的這種檔案時,我們就會得到該檔案的原始程式碼,這是因為當把PHP當作Apache的模組使用時,PHP解釋器是根據檔案的副檔名來決定是否解析為PHP代碼的。副檔名是網站管理員指定的,一般是“.php”, “.php3”和“.php4”。如果重要的設定資料被包含在沒有合適的副檔名的PHP檔中,那麼遠端攻擊者就很容易得到這些資訊。

最簡單的解決方法就是給每個文件都指定一個PHP文件的擴展名,這樣可以很好的防止洩露源代碼的問題,但是又產生了新的問題,通過請求這個文件,攻擊者可能使本該在上下文環境中運行的程式碼獨立運行,這可能導致前面討論的全部攻擊。

以下是一個很明顯的例子:

In main.php:
  $libDir = "/libdir";
  $langDir = "$langDir = "$langDir = "$ libdir/languages";

  ...

  include("$libdir/loadlanguage.php":
?>

In libage 🎜>  ...

  include("$langDir/$userLang");
?>

當「libdir/loadlanguage.php」被「mainguage.php」被「mainguage.php」被「mainguage.php」被「mainguage.php」 .php」呼叫時是相當安全的,但是因為“libdir/loadlanguage”具有“.php”的擴展名,因此遠端攻擊者可以直接請求這個文件,並且可以任意指定“$langDir”和“$userLang”的值。進入網站,他登陸了這個事實以及誰登陸進入這個網站都被保存在session中,當他在網站中到處瀏覽時,所有的PHP代碼都可以獲得這些狀態信息。當一個session啟動時(實際上是在設定檔中設定為在第一次請求時自動啟動),就會產生一個隨機的“session id”,如果遠端瀏覽器總是在發送請求時提交這個“session id」的話,session就會一直保持。這透過Cookie很容易實現,也可以透過在每頁提交一個表單變數(包含「session id」)來實現。PHP程式可以用session註冊一個特殊的變量,它的數值會在每個PHP腳本結束後存在session檔案中,也會在每個PHP腳本開始前載入到變數中。 ; // Kill any data currently in the session
  $session_auth = "shaun";
  session_register("session_auth"); // Register $session_auth as a session variable

新版的PHP都會自動把“$session_auth”的值設為“shaun”,如果它們被修改的話,以後的腳本都會自動接受修改後的值,這對無狀態的Web來說的確是種很不錯的工具,但是我們也應該小心。

一個很明顯的問題就是確保變數的確來自session,例如,給定上面的程式碼,如果後續的腳本是下面這樣的話:

  if (! empty($session_auth))
   // Grant access to site here
?>

上面的程式碼假定如果「$session_auth」被置位的話,就是從角色輸入,而不是從使用者輸入來置位的,如果攻擊者透過表單輸入來置位的話,他就可以獲得對網站的存取權。注意攻擊者必須在session註冊該變數之前使用這種攻擊方法,一旦變數被放進了session,就會覆蓋任何表單輸入。

Session資料一般是保存在檔案中(位置是可設定的,一般是「/tmp」),檔案名稱一般是類似「sess_」的形式,這個檔案包含變數名稱,變數類型,變數值和一些其它的資料。在多主機系統中,因為檔案是以運行Web伺服器的使用者身分(一般是nobody)保存的,因此惡意的網站擁有者就可以透過建立一個session檔案來獲得對其它網站的訪問,甚至可以檢查session文件中的敏感資訊。

Session機制也為攻擊者把自己的輸入保存在遠端系統的檔案中提供了另一個方便的地方,對於上面的例子來說,攻擊者需要在遠端系統放置一個包含PHP程式碼的文件,如果不能利用文件上載做到的話,他通常會利用session為一個變數按照自己的意願賦一個值,然後猜測session文件的位置,而他知道文件名是“php”,所以只需猜測目錄,而目錄一般就是“/tmp”。

另外,攻擊者可以任意指定“session id”(例如“hello”),然後用這個“session id”建立一個session檔案(例如“/tmp/sess_hello”),但是“session id”只能是字母和數字組合。

[資料類型]
PHP具有比較鬆散的資料類型,變數的類型依賴它們所處的上下文環境。例如:“$hello”開始是字串變量,值為“”,但是在求值時,就變成了整形變量“0”,這有時可能會導致一些意想不到的結果。如果「$hello」的值為「000」還是為「0」是不同的,empty()回傳的結果不會為真。

PHP中的陣列是關聯數組,也就是說,陣列的索引是字串型的。這意味著「$hello["000"]」和「$hello[0]」也是不同的。

開發程式的時候應該仔細地考慮上面的問題,例如,我們不應該在一個地方測試某個變數是否為“0”,而在另外的地方使用empty()來驗證。

[容易出錯的函數]
我們在分析PHP程式中的漏洞時,如果能夠拿到原始碼的話,那麼一份容易出錯的函數列表則是我們非常需要的。如果我們能夠遠端改變這些函數的參數的話,那麼我們就很可能會發現其中的漏洞。以下是比較詳細的容易出錯的函數清單:


require():讀取指定檔案的內容並且作為PHP程式碼解釋
include():同上
eval():把給定的字串當作PHP程式碼執行
preg_replace():當與「/e」開關一起使用時,替換字串將被解釋為PHP程式碼


exec():執行指定的指令,傳回執行結果的最後一行
passthru():執行指定指令,傳回所有結果到客戶瀏覽器
``:執行指定指令,回傳所有結果到一個陣列
system():同passthru(),但不處理二進位資料
popen():執行指定的指令,把輸入或輸出連接到PHP檔案描述子


fopen():開啟文件,並對應一個PHP檔案描述子
readfile():讀取檔案的內容,然後輸出到客戶瀏覽器
file():把整個文件內容讀到一個陣列中

譯者註:其實這份清單還不是很全,例如「mail()」等指令也可能執行指令,所以需要自己補充一下。
[如何增強PHP的安全性]
我在上面介紹的所有攻擊對於缺省安裝的PHP 4都可以很好的實現,但是我已經重複了很多次,PHP的配置非常靈活,通過配置一些PHP選項,我們完全可能抵抗其中的一些攻擊。下面我依照實現的難度對一些配置進行了分類:

*低難度
**中低難度
***中高難度
****高難度

上面的分類只是個人的看法,但是我可以保證,如果你使用了PHP提供的所有選項的話,那麼你的PHP將是很安全的,即使是第三方的代碼也是如此,因為其中很多功能已經不能使用。

**** 設定“register_globals”為“off”
這個選項會禁止PHP為使用者輸入建立全域變量,也就是說,如果使用者提交表單變數“hello”,PHP不會創建“$ hello”,而只會建立“HTTP_GET/POST_VARS['hello']”。這是PHP中一個極為重要的選項,關閉這個選項,會對程式設計造成很大的不便。

*** 設定「safe_mode」為「on」
開啟這個選項,會增加以下限制:
1.    限制哪個指令可以被執行
2.    限制哪個函數可以被使用
3.    基於腳本所有權和目標檔案所有權的檔案存取限制
4.    禁止文件上載功能
這對ISP來說是一個很棒的選項,同時它也能大大改善PHP的安全性。

** 設定「open_basedir」
這個選項可以禁止指定目錄之外的檔案操作,有效地消除了本地檔案或遠端檔案被include()的攻擊,但仍需要注意檔案上載和session檔的攻擊。

** 設定“display_errors”為“off”,設定“log_errors”為“on”
這個選項禁止把錯誤訊息顯示在網頁中,而是記錄到日誌檔案中,這可以有效的抵制攻擊者對目標腳本中函數的探測。

* 設定「allow_url_fopen」為「off」
這個選項可以禁止遠端檔案功能,極力推薦!

好了,文章到此為止了,如果你想了解一些其它的相關信息,請參考原文http://www.securereality.com.au/studyinscarlet.txt。


www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/315335.htmlTechArticle如何對PHP程式中的常見漏洞進行攻擊(下) 翻譯:analysist(分析家) 資料來源:http: //www.china4lert.org 如何攻擊PHP程式中常見的漏洞(下)...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

您應該多久再生一次會話ID?您應該多久再生一次會話ID?Apr 23, 2025 am 12:03 AM

會話ID應在登錄時、敏感操作前和每30分鐘定期重新生成。 1.登錄時重新生成會話ID可防會話固定攻擊。 2.敏感操作前重新生成提高安全性。 3.定期重新生成降低長期利用風險,但需權衡用戶體驗。

如何在PHP中設置會話cookie參數?如何在PHP中設置會話cookie參數?Apr 22, 2025 pm 05:33 PM

在PHP中設置會話cookie參數可以通過session_set_cookie_params()函數實現。 1)使用該函數設置參數,如過期時間、路徑、域名、安全標誌等;2)調用session_start()使參數生效;3)根據需求動態調整參數,如用戶登錄狀態;4)注意設置secure和httponly標誌以提升安全性。

在PHP中使用會議的主要目的是什麼?在PHP中使用會議的主要目的是什麼?Apr 22, 2025 pm 05:25 PM

在PHP中使用會話的主要目的是維護用戶在不同頁面之間的狀態。 1)會話通過session_start()函數啟動,創建唯一會話ID並存儲在用戶cookie中。 2)會話數據保存在服務器上,允許在不同請求間傳遞數據,如登錄狀態和購物車內容。

您如何在子域中分享會議?您如何在子域中分享會議?Apr 22, 2025 pm 05:21 PM

如何在子域名間共享會話?通過設置通用域名的會話cookie實現。 1.在服務器端設置會話cookie的域為.example.com。 2.選擇合適的會話存儲方式,如內存、數據庫或分佈式緩存。 3.通過cookie傳遞會話ID,服務器根據ID檢索和更新會話數據。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),