SQL 注入查询
SQL Injection Query
我正在写一份关于 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.
request.getParameter("id")
将从 http 请求中获取参数 "id",例如对于:http://test.com/?id=qwertz request.getParameter("id")
将 return "qwertz"。 SQL 在这种情况下注入是可能的,因为这个参数的值根本没有被检查并且可以包含任何东西
to me it seems as a simple query getting a row with specific 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 示例中的问题不是查询本身,而是来自 'outside' (request.getParameter("id")
) 的参数用于生成查询的事实,没有逃避任何潜在的控制字符。
这种编写代码的方式基本上允许任何用户在您的 SQL-服务器上执行代码。
此查询的问题在于 SQL 是动态创建的。 Request.getparameter 可能只是一个函数,其中 returns 特定网络请求的行 ID。
但如果网页允许通过文本框填写此参数或直接从JavaScript调用该函数,则可以在id中设置任何值。
这可以包含任何 SQL 语句,通过正确的身份验证,甚至可以包含 'DROP Database'
我正在写一份关于 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.
request.getParameter("id")
将从 http 请求中获取参数 "id",例如对于:http://test.com/?id=qwertz request.getParameter("id")
将 return "qwertz"。 SQL 在这种情况下注入是可能的,因为这个参数的值根本没有被检查并且可以包含任何东西
to me it seems as a simple query getting a row with specific 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 示例中的问题不是查询本身,而是来自 'outside' (request.getParameter("id")
) 的参数用于生成查询的事实,没有逃避任何潜在的控制字符。
这种编写代码的方式基本上允许任何用户在您的 SQL-服务器上执行代码。
此查询的问题在于 SQL 是动态创建的。 Request.getparameter 可能只是一个函数,其中 returns 特定网络请求的行 ID。
但如果网页允许通过文本框填写此参数或直接从JavaScript调用该函数,则可以在id中设置任何值。
这可以包含任何 SQL 语句,通过正确的身份验证,甚至可以包含 'DROP Database'