提问人:Osama Mohammed 提问时间:11/4/2022 最后编辑:DharmanOsama Mohammed 更新时间:11/4/2022 访问量:160
如何使用mysqli模拟SQL注入攻击?
How to simulate an SQL Injection attack with mysqli?
问:
我有这个代码:
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>
答:
-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 攻击,请使用参数化的预准备语句。 详情可参考:
评论
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
是的,当然可以
评论
echo "error";