SQL注入查询

Nau*_*nja 2 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.
Run Code Online (Sandbox Code Playgroud)

Man*_*mer 5

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

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

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

通常谁写了代码的和平期望这样的事情:

id = 12

这将导致

SELECT * FROM accounts WHERE custID='12'
Run Code Online (Sandbox Code Playgroud)

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

id = 0'; DROP TABLE accounts; --
Run Code Online (Sandbox Code Playgroud)

这将执行为

SELECT * FROM accounts WHERE custID='0'; DROP TABLE accounts; --'
Run Code Online (Sandbox Code Playgroud)

一步步:

  1. 确保预期的查询执行没有错误(0)
  2. 在预期的点(';)之前结束查询
  3. 注入你的恶意代码(DROP TABLE accounts;)
  4. 确保原始查询剩下的所有内容都被视为注释(--)

OWASP示例中的问题不是查询本身,而是来自'outside'(request.getParameter("id"))的参数用于生成查询,而不会转义任何潜在的控制字符.

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