如何使用mysqli模拟SQL注入攻击?

How to simulate an SQL Injection attack with mysqli?

提问人:Osama Mohammed 提问时间:11/4/2022 最后编辑:DharmanOsama Mohammed 更新时间:11/4/2022 访问量:160

问:

我有这个代码:

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>

我已经在表格中写了这个并提交了,只有返回(错误),并且该表没有被删除。enter image description here

php mysqli SQL注入

评论

1赞 0stone0 11/4/2022
用错误的引号关闭字符串
1赞 Osama Mohammed 11/4/2022
那么什么是正确的呢?
0赞 user3783243 11/4/2022
使用错误报告查看您的错误是什么。 没用。echo "error";

答:

-2赞 Tural Rzaxanov 11/4/2022 #1

例如,如果您将发送这样的请求:

1';DROP table accounts where id!='123454321344321

对于原因请求编码,可以使用 + 号而不是空格。 我正在用 PHP simulate 参数编写一个示例:$name


//That's a mean it is request variable
$name = "1';DROP table accounts where id!='123454321344321";
$query = mysqli_query($conn, "select name from accounts where name = '{$name}'");
if($query) {
   echo "success";
} else {
    echo "error";
}

评论

0赞 user3783243 11/4/2022
这是不正确的,也不清楚你的意思。指的是 URL 编码?+
4赞 Ken Lee 11/4/2022 #2

对于 mysqli,必须使用 mysqli::multi_query() 执行多个语句或多个查询

所以改变

$query = mysqli_query($conn, "select name from accounts where name = '{$name}'");

$query = mysqli_multi_query($conn, "select name from accounts where name = '{$name}'");

然后重试您想要的操作your own machine

当然,通常黑客只会通过以“管理员”身份登录来获得特权,然后做他/她想做的任何事情(在这种情况下,只需通过SQL攻击在select语句中执行单个查询即可,而不需要执行多查询)

[补充点]

对于单查询 SQL 攻击,请提交以下内容:

1}' or 1=1 or '{1=1

这将成为:

select name from accounts where name='{1}' or 1=1 or '{1=1}'

1}' or name='admin' or '{1=1

这将成为:

select name from accounts where name='{1}' or name='admin' or '{1=1}'

因此,为了避免 SQL 攻击,请使用参数化的预准备语句。 详情可参考:

php mysqli 准备语句 select

评论

0赞 Osama Mohammed 11/4/2022
那么,如果mysqli已经安全了,为什么我需要使用prepare呢?我的问题是我如何使用我的代码或类似代码模拟SQL注入
1赞 Ken Lee 11/4/2022
请参阅我进一步修改的答案。additional point
1赞 user3783243 11/4/2022
@OsamaMohammed 这并不安全。SQL 正在纵。也许不像在旧系统中那么糟糕,但仍然不是开发人员想要的。此外,如果您正在获取和输出内容,用户可以添加调用并从其他表中获取非预期的数据。union
1赞 Ken Lee 11/4/2022
1=1如果其他逻辑比较运算符为“or”,则已经足以使条件为真,因此这样做是正常的技巧。但通常我们可能会用来获得超级用户权限(再次 - 请仅在您自己的机器中执行黑客测试。谢谢)name='admin'
1赞 Ken Lee 11/4/2022
是的,当然可以