小编典典

Mysqli查询注入,如何注入SQL查询字符串?

sql

考虑一下我有这行代码

$result = $mysqli->query("SELECT  * from myTable where field='".$_GET['var']."');

恕我直言,这很容易受到SQL注入的攻击。

因此,我想通过Get / URL发送一个“ var”参数来证明它是可以尝试的,该参数将注入查询,并带有潜在的恶意代码。

我实际上尝试过:

var = "1'; TRUNCATE myTable; ";

我尝试在执行之前打印出SQL字符串查询,它实际上是2条SQL有效语句。

SELECT  * from myTable where field='1'; TRUNCATE myTable;

第一个问题,但实际上似乎mysqli-> query不会一次执行2条语句。是不是

第二个问题,我看到注入查询的一种常用技术是先进行表单注入,然后添加注释字符以摆脱SQL的尾巴。例子:

"SELECT  * from myTable where field='".$_GET['var']."' AND field2 IS NOT NULL"

可以注入:

var = "1'; TRUNCATE myTable; # ";

但是这个问题出现了,我想摆脱它的诀窍不见了

如果代码中的SQL字符串有新行,例如:

    "SELECT  * from myTable where field='".$_GET['var']."' 
     AND field2 IS NOT NULL"

如果我使用上面的“ var”,最终结果是

 SELECT  * from myTable where field='1'; TRUNCATE myTable; #  
     AND field2 IS NOT NULL

第二行不会被评论

如何对此进行注射测试?

非常感谢。


阅读 179

收藏
2021-04-14

共1个答案

小编典典

第一个问题,但实际上似乎mysqli->query不会立即执行2条语句。是不是

是的,如果要执行多个语句,则需要使用mysqli->multi_query。您可以在这里找到有关多条语句的很好的解释:http : //www.php.net/manual/en/mysqli.quickstart.multiple-
statement.php

但是这个问题出现了,我想摆脱它的诀窍不见了

出现问题是因为您正在使用多个语句,mysqli->query而不支持它们。

关于您的查询:

$result = $mysqli->query("SELECT  * from myTable where field='".$_GET['var']."');

您可以使用例如注入1' OR 1=1;这将返回myTable查询结果中的所有条目。

"SELECT * from myTable where field='".$_GET['var']."' AND field2 IS NOT NULL"

在这里你可以使用 1' OR 1=1 UNION ALL SELECT * FROM myTable WHERE '1'='1

如今,有一些工具可以为您自动检查SQL注入,例如以SQL Inject Me(Firefox插件)为例。

2021-04-14