我有这个特定的代码(这是一个mwe(,我不明白为什么没有MySQL错误打印在浏览器或apache日志文件中:
$sql= "SELECT * from vulnDB where username = admin and password = '" . $_POST['password'] ."'";
if($result = mysqli_query($conn, $sql)) {
$row = mysqli_fetch_assoc($result);
if ($_POST['password'] == $row['password']) {
echo "Welcome!";
} else {
echo "This password is incorrect";
}
} else {
echo "Error";
}
当我输入合法值时,代码被正确执行(Welcome
或This password is incorrect
(,当我输入"
或'
时,我到达Error
子句,但没有打印任何东西,这段代码似乎对SQLi免疫。
PHP 中是否有一些特殊的保护来避免 SQLi 注入成功?适当的保护包括使用 PDO,但我发现这段代码显然很脆弱;并且不能触发SQLi错误语法或其他想法,只能打印"错误"。
要以有用的方式注入 SQL,您需要将参数注入到字符串中,使 SQL 语句有效。简单地注入'
不会变成有效的 SQL。(这会导致类似 SELECT * from vulnDB where username = admin and password = '''
。
您需要注入类似' OR password IS NOT NULL AND '' = '
的东西(注意:我还没有测试过这个(来创建有效的攻击。
当您不使用预准备语句,并且将用户输入中的字符串直接打印到执行的 SQL 中时,您很容易受到 SQL 注入的影响。