我正在写一篇关于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)
对我来说,它似乎是一个简单的查询获取具有特定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)
一步步:
0)';)之前结束查询DROP TABLE accounts;)--)OWASP示例中的问题不是查询本身,而是来自'outside'(request.getParameter("id"))的参数用于生成查询,而不会转义任何潜在的控制字符.
这种编写代码的方式基本上允许任何用户在SQL-Server上执行代码.