提问者:小点点

如何使用SQL注入接收SQL语法错误?


我正在做一些webpenting练习,有一个任务说我需要通过使用SQL注入来创建一个具有这个名称和这个密码的新帐户。在网页上有一个文本输入用户名和另一个文本输入“密码”。我可以在用户名文本输入中输入任何我想要的字符,但在密码文本输入中,我需要键入一个特定的注入。

我知道我需要注入insert查询,但问题是我不知道表名。为了插入一个新用户,我需要知道表名,所以我想知道如何才能使web显示一个带有tablename的错误。

显示的错误如下:语句[SELECT*FROM(tablename)WHERE...]中的命令出现意外结尾

我尝试在password字段中输入一个字符(可能需要>1个字符),以使错误显示,甚至删除参数文本输入password。但它不会显示SQL语法错误。

所以问题是:如何利用该漏洞使网页查看表名显示的SQL语法错误?

为什么在用户名字段注入不起作用,而在密码字段却起作用呢?


共1个答案

匿名用户

第一件事是理解“应用程序”错误(例如,“用户不存在”)和执行错误之间的区别,在执行错误中,应用程序自身失败,如您提到的“命令意外结束”。从安全角度来看,第一种情况通常不是问题(除非应用程序的编程非常糟糕),第二种情况是允许黑客入侵的情况。

理想情况下,一个编程良好的web应用程序应该只有应用程序错误,但更现实的方法是以不使其易受攻击的方式处理意外的执行错误。此外,应用程序应该以不会导致执行错误的方式处理任何用户输入。

似乎他们在教你最明目张胆的情况,允许SQL注入,应用程序不对用户输入做任何处理(所以很容易将文本放入输入字段,导致执行错误),并且不处理执行错误(在本例中,向用户显示内部执行消息)。

web应用程序中的一个常见错误是使用字符串级联构造SQL查询,因此使查询失败的最简单方法是在字段中使用字符串分隔符('),从而导致字符串值提前结束。在一个草率的web应用程序中,它会导致一个显示完整错误消息的执行错误,通常包括表名。

然后在输入字段中创建一个SQL查询,将用户插入到表中,您可以在网上找到示例(注意,为了进行SQL注入,您至少需要SQL和PHP(或ASP、Java等)方面的基本知识,因为您需要知道数据库访问是如何工作的,以便使其失败)。

最后,SQL注入可以在任何未正确处理的输入字段中工作,但这取决于应用程序的编程方式。我想这两个字段都可以工作,但使用password字段很容易做到这一点,因为可能是SQL查询中的最后一个字段。