我看一下rfi和php安全性,发现这包括dvwa中的代码:
<?php
$file = $_GET['page']; //The page we wish to display
// Only allow include.php
if ( $file != "include.php" ) {
echo "ERROR: File not found!";
echo "$file";
exit;
}
include($file);
?>
好吧,我不明白为什么这段代码不安全。 我和一些安全人员谈过,他们说这段代码不安全,我不应该使用它。我知道改变包含选项的好处,但我认为这个人不能通过。
我尝试了许多comman攻击,并且没有通过它。 我很高兴听到你的意见
答案 0 :(得分:2)
这是非常安全的,除非您回显没有htmlentities()
的文件,因此存在XSS漏洞。
POC:mywebsite.com/script_name.php?page=<script>alert('XSS')</script>
另一种方法是:
<?php
$whitelist = array('include.php','some_other_file.php','another.php');
$file = $_GET['page']; //The page we wish to display
if (!in_array($file, $whitelist)){
header("Location: /");
}
include($file);
?>
即使是“找不到档案”的事情太多了,如果有人试图搞砸你的申请,你必须尽量少告诉他。
就个人而言,我只需使用php header()
函数重定向到您的主页。
答案 1 :(得分:1)
正如我在comment to your question on Security.SE中已经说过的那样,我对DWVA迄今为止所面临的高水平挑战的印象是它们应该是安全的。关于高级别挑战的可利用性还存在其他问题(特别是SQL注入:#1,#2,#3),统一意见倾向于不可利用。
您的代码所在的high level file inclusion challenge同样是:
只有在条件include
未满足时才会到达 $file != "include.php"
,否则exit
将终止运行时。由于$file
的值取自$_GET['page']
,因此它是一个字符串(例如?page=foo
),一个数组(例如?page[foo]=bar
)或null
(例如,仅?page
或完全丢失)。
现在让我们看一下what happens when comparing these types字符串:
null
仅等效于空字符串因此,通过此if
的唯一方法是?page=include.php
,否则由于include
条件为if
而无法达到{{1}}。