我有一篇关于SQL注入的文章(它是什么 - 它是如何完成的以及如何避免它)。我知道它是什么以及它是如何工作的。但我似乎无法重现我的数据库注入。
我创建了一个非常简单的数据库,使用mysql workbench,用于视频俱乐部。电影 - 股票 - 价格 - 客户购物车等 我还制作了一个非常简单的html页面,我可以从中添加电影 - 查看库存中的内容等。
所以我有一个txt字段,我在其中输入一个电影名称,然后我回到这个特定电影的一些信息。
获取我输入名称并进行查询的代码是::
$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'OR'x'='x ' 一切都按预期工作,我得到了整个表的内容。
下一步是尝试注入第二个查询。我试图更新test_table。 输入是:: [a;'更新test_table set asda ='123456'其中adad ='u] 现在查询变为:: SELECT * FROM test_table WHERE adad =' a;' UPDATE test_table SET asda ='123456'HERERE adad ='u '
我遇到了语法错误,所以我尝试了我能想到的每种语法 [ a;' UPDATE test_table SET asda ='123456'其中adad ='u';#] 。他们都没有工作。
事情是,我真的不知道为什么我会收到语法错误。
对于上面给出的输入,mysqli_error返回此消息
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
插入echo i时返回
SELECT * FROM test_table WHERE adad = 'a;' UPDATE test_table SET asda = '123456' WHERE
adad = 'u'
我没有在echo返回中看到任何语法错误,并且我没有得到mysqli_error结尾的第二个[']字符返回的位置。
根据我的理解,这是执行第二个查询的失败(无论查询是什么 - 删除,插入,更新)
我想念一下吗?
提前致谢。
迈克尔。
答案 0 :(得分:2)
mysql的PHP驱动程序在单个> query()调用中不允许多个查询,正是出于这个原因。这是一种防注射防御,可以防止经典的Bobby Tables攻击。这适用于所有PHP数据库接口(mysql,mysqli,pdo),因为它们都使用相同的底层mysql C api库来实际与数据库通信。任何在单个查询调用中运行2+个查询的尝试都会导致语法错误。
但请注意,它并不能防止' or 1=1
注射。
答案 1 :(得分:0)
为了使堆叠查询注入技术起作用,您需要使用“mysqli_multi_query()”函数:
http://php.net/manual/en/mysqli.multi-query.php http://www.websec.ca/kb/sql_injection#MySQL_Stacked_Queries
默认情况下,MsSQL是唯一支持堆叠查询的数据库。
也可能是更好的注入技术,更可靠的是UNION攻击,然后从“mysql.user”表中转储MySQL凭据,然后使用这些来破坏数据库。