我正在写一篇关于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.
答案 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; --'
步骤一步:
0
)';
)DROP TABLE accounts;
)--
) 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注入,因为此参数的值根本没有被检查并且可以包含任何内容