SQL注入查询

时间:2016-05-07 22:13:00

标签: sql sql-injection

我正在写一篇关于SQL注入攻击的报告。我在Owasp找到了一个示例,如下所示。

因为这是一个例子而且对我而言,它似乎是一个简单的查询获取具有特定ID的行,它是做其他事情还是我的假设是正确的?

String query = "SELECT * FROM accounts WHERE custID='" + 
request.getParameter("id") + "'";  
// Since this is an online example i don't know what getParameter("id") method does.

3 个答案:

答案 0 :(得分:5)

  

对我而言,它似乎是一个简单的查询,获取具有特定ID的行

这就是注射的魔力。查询应该只能获得符合请求的特定条件的行(例如来自html的GET或POST)。

因此request.getParameter("id")提供了用户(或非常坏的人)提交的参数。

通常,那些写下代码和平的人都会期待这样的事情:

id = 12

会导致

SELECT * FROM accounts WHERE custID='12'

现在想象如果用户(在这种情况下是坏的)发送的话会发生什么:

id = 0'; DROP TABLE accounts; --

这将作为

执行
SELECT * FROM accounts WHERE custID='0'; DROP TABLE accounts; --'

步骤一步:

  1. 确保预期的查询执行时没有错误(0
  2. 在预期点(';
  3. 之前结束查询
  4. 注入恶意代码(DROP TABLE accounts;
  5. 确保将原始查询剩余的所有内容视为注释(--
  6. OWASP示例中的问题不在于查询本身,而在于来自'外部的参数这一事实。 (request.getParameter("id"))用于生成查询,而不会转义任何潜在的控制字符。

    这种编写代码的方式基本上允许任何用户在SQL-Server上执行代码。

答案 1 :(得分:3)

此查询的问题是SQL是动态创建的。 Request.getparameter可能只是一个返回特定Web请求的行ID的函数。

但是如果网页允许通过文本框填充此参数或者直接从JavaScript调用该函数,则可以在id中设置任何值。

这可以包含任何SQL语句,通过正确的身份验证,甚至可以包含“DROP数据库”

答案 2 :(得分:1)

request.getParameter("id")

将获得参数" id"来自http请求,例如for:http://test.com/?id=qwertz request.getParameter("id")将返回" qwertz"。在这种情况下可以进行SQL注入,因为此参数的值根本没有被检查并且可以包含任何内容