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个以上查询的尝试都会导致语法错误。
请注意,它不能防止您的
为了使您的堆积查询注入技术起作用,您将需要使用" 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凭据,然后使用这些凭据来危害数据库。