我們都知道,在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¶ms=test
但是看了wp后發現忽略一個細節,就是訪問URL時,URL其實已經被瀏覽器解碼一次,代碼第4行中,會使用urldecode()再解碼一次,所以要進行兩次URL編碼才行,即:
index.php/http:%252f%252fwww.baidu.com?redirect=test¶ms=test
題目的wp如下: