我需要帮助理解XSS
上的PHP
。在这种特殊情况下有哪些安全漏洞?
<?php
$test = NULL;
$name = $_REQUEST['name'];
if(!$test){
die("$name cannot be found");
}
?>
编辑。为什么它给我看PHPINFO?链接http://testing985.freeiz.com/
<?
$test = NULL;
$name = ''.print phpinfo().'';
if(!$test){
die("$name cannot be found");
}
?>
答案 0 :(得分:1)
输入此内容,您将看到:
index.php?name=%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0Awindow.location.href%20%3D%20%22http%3A%2F%2Fgoogle.de%22%3B%0A%3C%2Fscript%3E
在此示例中,您将转到Google。在现实世界中,您将访问与您的页面完全相同的网络钓鱼站点。
要对此进行处理,您需要删除标签,例如:
$name = strip_tags($name);
替代方案有一个更强大的框架availibe:
这也是:
$name = "''.print phpinfo().''";
请问我们:
''.print phpinfo().'' cannot be found
原因是,''.print phpinfo().''
已经是string
。您需要eval($name);
来执行它。最好立即忘记eval
。
另请注意:
$test = NULL;
if (!$test){}; //true
if ($test){}; //false
if ($test === false){}; //false
if ($test === true){}; //false
if ($test === null){}; //true
对于您的修改:
我的不好,行$name = ''.print phpinfo().''
我的意思是,如果你有一个这样的网址index.php?name=%27%27.print%20phpinfo().%27%27%3B
,它基本上代表$name = "''.print phpinfo().''"
而不是$name = ''.print phpinfo().''
。
意思是:
如果我想输入$name
代码''.print phpinfo().'';
,我会将其转义为%27%27.print%20phpinfo().%27%27%3B
。
现在你有了这一行:
$name = $_REQUEST['name'];
您将GET VAR(在本例中为''.print phpinfo().'';
)的内容写为string
$name
所以你基本上有这条线:
$name = "''.print phpinfo().''";
这将输出简单:
''.print phpinfo().''
那么为什么这一行给出了PHP Info Output?
$name = ''.print phpinfo().'';
分为3部分:
''
(返回空字符串)print phpinfo()
(从打印件返回1
;打印命令不执行任何操作,因为phpinfo()
返回void
; phpinfo()
完成了他的工作并在此点输出信息)''
(返回空字符串)因此,您为$name
分配了Nothing
,1
,Nothing
的字符串链。这意味着$name = '1'
。在此作业中,您已经打印了phpinfo()
。
这一行:
die("$name cannot be found");
您附加到已有的信息输出文本1 cannnot be found
;