0

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

我使用 mysql 工作台制作了一个非常简单的数据库,用于视频俱乐部。电影 - 股票 - 价格 - 客户购物车等。我还制作了一个非常简单的 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 where adad = ' a' OR 'x' = 'x ' 一切都按预期工作,我取回了整个表的内容。

下一步是尝试注入第二个查询。我试图更新 test_table。输入是 :: [ a;' update test_table set asda = '123456' where adad = 'u ] 查询现在变成 :: SELECT * FROM test_table WHERE adad= ' a;' 更新 test_table SET asda ='123456' WHERE adad = 'u '

我遇到了一个语法错误,所以我尝试了所有我能想到的语法,包括 [ a;' 更新 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 

而我插入的回声返回这个

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

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

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

我想念什么吗?

提前致谢。

迈克尔。

4

2 回答 2

2

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

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

于 2013-02-27T16:04:19.423 回答
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 凭据,然后使用这些来破坏数据库。

于 2013-02-28T02:30:49.207 回答