我有这个特殊的代码(这是一个mwe),我不明白为什么在浏览器或apache日志文件中打印时没有MySQL错误:
$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
),当我输入"
或'
时,我会到达{{1} }子句,但没有任何内容得到打印,并且此代码似乎不受SQLi的影响。
PHP中是否有一些特殊的保护措施可以避免SQLi注入成功? 适当的保护将包括使用PDO,但是我发现这段代码显然很容易受到攻击。并且无法触发sqli错误语法或其他想法,只能打印“错误”。
答案 0 :(得分:3)
要以一种有用的方式注入SQL,您需要使SQL语句有效,并将参数注入到字符串中。简单地注入'
不会变成有效的SQL。 (这将导致类似SELECT * from vulnDB where username = admin and password = '''
。)
您需要注入' OR password IS NOT NULL AND '' = '
之类的东西(注意:我尚未测试过这种东西)才能产生有效的攻击。</ p>
当您不使用准备好的语句,而是将用户输入的字符串直接打印到要执行的SQL中时,您很容易受到SQL注入的攻击。</ strong>