什么是PHP_SELF變量市框?
PHP_SELF是一個返回正在執(zhí)行的當(dāng)前腳本的變量沪么。此變量返回當(dāng)前文件的名稱和路徑(來自根文件夾)上忍。您可以在FORM的操作字段中使用此變量。您還需要注意某些漏洞诱咏。我們將在本文中討論所有這些要點。
我們現(xiàn)在看一些例子缴挖。
echo $_SERVER['PHP_SELF'];
a)假設(shè)您的php文件位于以下地址:
http://www.yourserver.com/form-action.php
在這種情況下袋狞,PHP_SELF將包含:
"/form-action.php"
b)假設(shè)您的php文件位于以下地址:
http://www.yourserver.com/dir1/form-action.php
對于此URL,PHP_SELF將為:
"/dir1/form-action.php"
在表單的action字段中使用PHP_SELF變量
PHP_SELF變量的常見用法是在<form>標(biāo)記的action字段中。當(dāng)用戶按下“提交”按鈕時苟鸯,F(xiàn)ORM的操作字段指示提交表單數(shù)據(jù)的位置同蜻。通常與表單的處理程序具有相同的PHP頁面。
但是早处,如果您在操作字段中提供文件的名稱湾蔓,以防您碰巧重命名該文件,則還需要更新操作字段; 或者你的表格將停止工作陕赃。
使用PHP_SELF變量卵蛉,您可以編寫更多通用代碼,可以在任何頁面上使用么库,而無需編輯操作字段傻丝。
考慮一下,你有一個名為form-action.php的文件诉儒,并希望在提交表單后加載相同的頁面葡缰。通常的表單代碼是:
<form method="post" action="form-action.php" >
我們可以使用PHP_SELF變量而不是“form-action.php”。代碼變成:
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
“form-action.php”的完整代碼
這是組合代碼忱反,包含表單和PHP腳本泛释。
<?php
if(isset($_POST['submit']))
{
$name = $_POST['name'];
echo "User Has submitted the form and entered this name : <b> $name </b>";
echo "<br>You can use the following form again to enter a new name.";
}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text" name="name"><br>
<input type="submit" name="submit" value="Submit Form"><br>
</form>
此PHP代碼位于HTML部分之上,將首先執(zhí)行温算。第一行代碼是檢查表單是否已提交怜校。提交按鈕的名稱是“提交”。按下提交按鈕時注竿,$_POST['submit']將設(shè)置并且IF條件將變?yōu)檎媲炎隆T谶@種情況下,我們顯示用戶輸入的名稱巩割。
如果表單未提交裙顽,IF條件將為FALSE,因為沒有值$_POST['submit'] 宣谈,PHP代碼將不會被執(zhí)行愈犹。在這種情況下,僅顯示表單闻丑。
什么是PHP_SELF漏洞以及如何避免它們
PHP_SELF變量用于獲取當(dāng)前文件的名稱和路徑漩怎,但黑客也可以使用它。如果在頁面中使用了PHP_SELF嗦嗡,則用戶可以輸入斜杠(/)扬卷,然后輸入一些跨站點腳本(XSS)命令來執(zhí)行。
<form name="test" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
現(xiàn)在酸钦,如果用戶在地址欄中輸入了正常的URL怪得,
http://www.yourdomain.com/form-action.php
則上述代碼將被翻譯為:
<form name="test" action="form-action.php" method="post">
這是正常情況咱枉。
現(xiàn)在考慮用戶通過在瀏覽器的地址欄中輸入以下URL來調(diào)用此腳本:
http://www.yourdomain.com/form-action.php/"><script>alert('xss')</script><foo"
在這種情況下,PHP處理后代碼變?yōu)椋?/h5>
<form name="test" method="post" action="form-action.php"/>
<script>alert('xss')</script><foo"">
您可以看到此代碼添加了腳本標(biāo)記和警報命令徒恋。加載此頁面后蚕断,用戶將看到一個警告框。這只是一個如何利用PHP_SELF變量的簡單示例入挣。
可以在“script”標(biāo)記之間添加任何JavaScript代碼亿乳。<script>....HERE....</script>。黑客可以鏈接到可能位于另一臺服務(wù)器上的JavaScript文件径筏。例如葛假,該JavaScript文件可以保存可以改變?nèi)肿兞康膼阂獯a,也可以將表單提交到另一個地址以捕獲用戶數(shù)據(jù)滋恬。
一個有趣的練習(xí)
當(dāng)我們的注入落在標(biāo)記屬性上時聊训,我們試圖突破它而沒有成功,因為關(guān)閉標(biāo)記并開始新標(biāo)記所需的大于號(>)被替換為減號( - ):
因此恢氯,我們將嘗試使用事件處理程序來使用內(nèi)聯(lián)注入:
再次沒有成功带斑,但這次是因為javascript塊(第11行到第17行)清理了每個字符串,其中“on”后跟或不是間隔符(%09勋拟,%0A勋磕,%0C,%0D或%20)和document.location.href(第15行)中的等號(=)敢靡,即處理URL的屬性挂滓。
javascript函數(shù)eventFilter()在文檔主體加載時調(diào)用(第3行),操作在運(yùn)行時構(gòu)建的頁面(參見 DOM)啸胧,因此盡管它在源上正確反映赶站,但注入不起作用
但是如果我們創(chuàng)建一個任意屬性并且只是保持其值打開,那么注入后的所有代碼都將被更改為其值:
這樣吓揪,只有當(dāng)瀏覽器的HTML解析器找到下一個單引號(')時才會關(guān)閉“1”屬性亲怠,該引用位于“不要做壞事”這個短語上所计。我們注入的表單標(biāo)記將在下一個大于符號(>)中關(guān)閉柠辞,該標(biāo)記位于</ h6>標(biāo)記中。
輸入字段與提交按鈕一起消失主胧,javascript函數(shù)完全禁用(全部從第8行到第18行)叭首。因為在頁面中沒有更多元素可以交互,“style”屬性也被“ - ”替換踪栋,我們不能在我們的目標(biāo)標(biāo)記之后注入任何東西焙格,我們無法觸發(fā)我們提供的事件處理程序
所以這是最后一招。在當(dāng)前的Firefox瀏覽器中夷都,我們有以下處理程序眷唉,在源代碼中只需要一個腳本塊來觸發(fā)它們:
onafterscriptexecute
onbeforescriptexecute
在頁面的congrats.js腳本中
我們只能使用后者:
<form name="test" method="post" action="form-action.php"/>
<script>alert('xss')</script><foo"">
onafterscriptexecute
onbeforescriptexecute