如何用mysqli模拟SQL注入攻击?提交注入语句后未删表报错
SQL注入失败的原因解析
先看你提供的代码:
if(isset($_POST['submit'])) { $name = $_POST['name']; $query = mysqli_query($conn, "select name from accounts where name = '{$name}'"); if($query) { echo "success"; } else { echo "error"; } } ?> <form action="" method="post"> Name: <input type="text" name="name"><br><br> <input type="submit" name="submit" value="Add"> </form>
你尝试注入却只返回error、目标表未被删除,核心原因有两点:
mysqli_query默认禁用多语句执行
mysqli_query函数不允许在一次调用中执行多个用分号分隔的SQL语句。你输入的类似xxx'; DROP TABLE 目标表;--的注入语句,会被整体当作name字段的查询值,无法触发后续的删除操作。注入语句导致SQL语法错误
拼接后的SQL会变成select name from accounts where name = 'xxx'; DROP TABLE 目标表;--',这里不仅多语句被拦截,还存在单引号不匹配的语法问题,直接导致查询执行失败,mysqli_query返回false,页面输出error。
如果要验证是否存在注入点,可以尝试单语句注入,比如输入' OR '1'='1,此时拼接后的SQL为select name from accounts where name = '' OR '1'='1',若查询能正常执行(无论是否返回数据),页面会输出success,这说明确实存在注入漏洞,但受限于mysqli_query的机制,无法执行多语句的删除操作。
内容的提问来源于stack exchange,提问作者Osama Mohammed
相关产品推荐
相关产品推荐

