我正在做一些webpentesting练习,并且有一个任务说我需要使用SQL注入创建一个具有此名称和密码的新帐户。在网页上有一个文本输入用户名和另一个文本输入密码'。我可以在用户名文本输入中输入我想要的任何字符,但在密码文本输入中我需要键入特定的注入。
我知道我需要注入插入查询,但问题是我不知道表名。为了插入一个新用户,我需要知道表名,所以我想知道如何让网络显示一个显示tablename的错误。
显示的错误应该是: 语句[SELECT * FROM(tablename)WHERE ...]
中的命令意外结束我尝试在密码字段中只输入一个字符(可能需要> 1个字符)来显示错误,甚至删除参数文本输入密码。但它只是不会显示SQL语法错误。
所以问题是:我如何利用漏洞来使网页查看显示表名的SQL语法错误?
为什么注入不在用户名字段上,但在密码字段上呢?
答案 0 :(得分:0)
首先要理解“应用程序”错误(例如,“用户不存在”)和执行错误之间的区别,其中应用程序自身失败,就像您提到的“意外的命令结束”。从安全角度来看,第一种情况通常不是问题(除非应用程序编程非常糟糕),第二种情况是可以允许黑客攻击。
编程良好的Web应用程序理想情况下应该只有应用程序错误,但更现实的方法是以不会使其易受攻击的方式应对意外的执行错误。此外,应用程序应以不会导致执行错误的方式处理任何用户输入。
看起来他们正在教你最公然的情况,允许SQL注入,应用程序,而不是对用户输入进行任何处理(所以很容易将文本放在导致执行错误的输入字段中),并且不处理执行错误(在这种情况下,向用户显示内部执行消息)。
Web应用程序中的一个常见错误是使用字符串连接构造SQL查询,因此使其失败的最简单方法是在字段中使用字符串分隔符('
),从而导致字符串值过早结束。在一个草率的Web应用程序中,它将导致执行错误,显示完整的错误消息,通常包括表名。
从那里你在输入字段中创建一个SQL查询,将用户插入表中,你可以在线找到例子(注意你至少需要有关SQL和PHP(或ASP,Java等)的基本知识,为了进行SQL注入,因为您需要知道数据库访问如何工作才能使其失败。
最后,SQL注入可以在任何未正确处理的输入字段中工作,但这取决于应用程序的编程方式。我想这两个字段都可以工作但是使用密码字段很容易,因为它可能是SQL查询中的最后一个字段。