$_SERVER['PHP_SELF']安全性淺析


我們都知道,在PHP開發中,$_SERVER[’PHP_SELF’],一般用來引用當前網頁地址,即表示PHP文件相對於網站根目錄地址,可以通過幾個例子來看$_SERVER[’PHP_SELF’]的結果:

http://www.example.com/php/test.php  --> /php/test.php
http://www.example.com/php/test.php?parm=1  --> /php/test.php

 通過一個例子來探討他的安全性,一個登陸頁面,地址http://馬賽克.com/login.php:

 

 當我們訪問http://馬賽克.com/login.php/a后,頁面如下:

 

通常情況下,系統會給我們拋出404或者其他的錯誤,所以在這,我們可以猜測,用戶提交數據到后台進行處理時可能采用如下方式:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

 這樣在功能上其實沒有什么問題,但是在安全的角度,$_SERVER[’PHP_SELF’]參數有一部分是我們可以控制的,嘗試XSS攻擊:

可以再通過RIPS的一個代碼審計題目來看看:

 仔(xia)細(bi)分析,startRedirect函數GET一個params的參數,在9-19行中,通過explode函數將$_SERVER[’PHP_SELF’]的值用“/”分割成一個叫$parts的數組,$baseFile為數組的最后一個值,$url 的值為 $baseFile?http_build_query($params),不懂咱就查:

  將$params進行URL編碼,調用setHeaders 函數,首先解碼 $url 參數,然后執行URL跳轉,所以題目其實是說使用$_SERVER[’PHP_SELF’]造成的URL跳轉問題,先想的是如下的payload:

index.php/http://www.baidu.com?redirect=test&params=test

 但是看了wp后發現忽略一個細節,就是訪問URL時,URL其實已經被瀏覽器解碼一次,代碼第4行中,會使用urldecode()再解碼一次,所以要進行兩次URL編碼才行,即:

index.php/http:%252f%252fwww.baidu.com?redirect=test&params=test

  題目的wp如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM