考虑一下我有这行代码
$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字符串有新行,例如:
如果我使用上面的“ var”,最终结果是
SELECT * from myTable where field='1'; TRUNCATE myTable; # AND field2 IS NOT NULL
第二行不会被评论
如何对此进行注射测试?
非常感谢。
第一个问题,但实际上似乎mysqli->query不会立即执行2条语句。是不是
mysqli->query
是的,如果要执行多个语句,则需要使用mysqli->multi_query。您可以在这里找到有关多条语句的很好的解释:http : //www.php.net/manual/en/mysqli.quickstart.multiple- statement.php
mysqli->multi_query
出现问题是因为您正在使用多个语句,mysqli->query而不支持它们。
关于您的查询:
您可以使用例如注入1' OR 1=1;这将返回myTable查询结果中的所有条目。
1' OR 1=1
myTable
在这里你可以使用 1' OR 1=1 UNION ALL SELECT * FROM myTable WHERE '1'='1
1' OR 1=1 UNION ALL SELECT * FROM myTable WHERE '1'='1
如今,有一些工具可以为您自动检查SQL注入,例如以SQL Inject Me(Firefox插件)为例。