关于注入:SQL注入:语法错误

SQL Injection : Syntax error

我有一篇有关SQL注入的文章(它是什么-如何完成以及如何避免)。我知道它是什么以及它如何工作。但是我似乎无法在我的数据库上重现注射。

我使用mysql workbench创建了一个非常简单的数据库,该数据库用于视频俱乐部。电影-股票-价格-客户购物车等
我还做了一个非常简单的HTML页面,从中可以添加电影-查看我的库存等。

因此,我有一个txt字段,在其中输入电影名称,然后获取有关此特定电影的一些信息。

获取我键入的名称并进行查询的代码为::

1
2
3
$name = $_POST ['txtfld'];
$sql = ("SELECT * FROM test_table WHERE adad = '$Mname'");
if ($result = mysqli_query($dbc,$sql))

现在,当我输入" a"作为输入时,一切都会按预期进行。我得到一个pk等于[a]的条目。
查询变为:: SELECT * FROM test_table WHERE adad ='a'。

下一步是看看我是否可以从中获取整个表格或一些随机条目。
输入为:[a'OR'x'='x]
查询变为:: SELECT * FROM test_table,其中adad ='a'或'x'='x'
一切都按预期工作,我拿回了整个表的内容。

下一步是尝试注入第二个查询。我试图更新test_table。
输入为:: [a;'更新test_table设置asda ='123456',其中adad ='u]
查询现在变为:: SELECT * FROM test_table WHERE adad ='a;'更新test_table SET asda ='123456'WHERE adad ='u'

我遇到了语法错误,因此尝试了所有可能想到的语法
[ 一种;'更新test_table SET asda ='123456',其中adad ='u';#]
。他们都没有工作。

问题是,我真的不明白为什么我会出现语法错误。

对于上面给出的输入,mysqli_error返回此消息

1
2
3
error: You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'update test_table set asda =
'123456' where adad = 'u'' at line 1

而我插入的回声返回此

1
2
SELECT * FROM test_table WHERE adad = 'a;' UPDATE test_table SET asda = '123456' WHERE
adad = 'u'

我在回声返回中没有看到任何语法错误,并且我不知道mysqli_error返回末尾的第二个[']字符来自何处。

据我了解,这是执行第二个查询的失败(无论查询是什么-删除,插入,更新)

我想念什么吗?

提前致谢。

迈克尔


正是出于这个原因,mysql的PHP驱动程序不允许在单个-> query()调用中进行多个查询。它是一种反注入防御,可以防止经典的Bobby Tables攻击。对于所有PHP数据库接口(mysql,mysqli,pdo)都是如此,因为它们都使用相同的基础mysql C api库与数据库实际通信。任何在单个查询调用中运行2个以上查询的尝试都会导致语法错误。

请注意,它不能防止您的' or 1=1注入。


为了使您的堆积查询注入技术起作用,您将需要使用" mysqli_multi_query()"函数:

http://php.net/manual/zh/mysqli.multi-query.php
http://www.websec.ca/kb/sql_injection#MySQL_Stacked_Queries

默认情况下,MsSQL是唯一支持堆栈查询的数据库。

同样,更好的注入技术和更可靠的注入技术可能是UNION攻击,然??后从" mysql.user"表中转储MySQL凭据,然后使用这些凭据来危害数据库。