我正在帮助我的朋友完成他的网站模块。从我第一次看到他的模块的印象,我发现了一些非常危险的东西,但他说这种方法是安全的。
部分代码:
session_start();
if(isset($_POST['foo']))
{
$_SESSION['foo'] = $_POST['foo'];
}
if(isset($_SESSION['foo']))
{
$foo['foo'] = $_SESSION['foo'];
}
if(is_file("inc/". $foo['foo'] . "/bar.php")) {
// code
}
else {
// code
}
注意:file(inc / test / bar.php)存在;
我想测试他的代码,我发送了以下请求:
POST :: foo =>测试/ bar.php%00
POST :: foo =>测试/ bar.php \ 0
curl_setopt($ ch,CURLOPT_POSTFIELDS,'foo = test / bar.php'.chr(0x00));
但这些方法都没有奏效。这段代码真的安全吗?怎么可能有人发送空字节来绕过它的安全性。我想向我的朋友证明他的代码不安全。
答案 0 :(得分:5)
我找到了this解决方案,简而言之,您的代码似乎有点脆弱,并且清理方法是这样的:
有许多方法可以防止PHP中的Poison Null Byte注入。这些包括使用反斜杠转义NULL字节,但是,最推荐的方法是使用类似于以下代码完全删除字节:
$foo['foo']= str_replace(chr(0), '', $foo['foo']);
我也不是空字节攻击的专家,但这是有道理的。 更多细节here。
答案 1 :(得分:-3)
Php对Null字节非常有用....因为php是在c上构建的。 在c中,空字节表示字符串的结尾。
您应该删除您使用的每个字符串上的Null字节。 这在基于IO的函数(如include en move_uploaded_file。
)上更为重要偶数(int)“1 \ 01”是可转换的,因为它转换为int 1
可以处理空字节的Php函数例如是
str_replace函数 strpos strlen的
即使在数据库查询中也是如此。 Mysql可以在char,varchar和text列上用于Null字节