Jon*_*gel 8 sql database sql-injection database-agnostic
我们有一个遗留应用程序不使用位置参数进行查询,并且到处都有SQL.决定(在我开始之前)由于用户输入可以包含撇号,因此应该为这些撇号手动转义每个字符串输入.
这是必要的原始代码(不是由我编写的),翻译成C#以便于使用:
private string _Escape(string input)
{
return input.Replace("'", "''");
}
private bool _IsValidLogin(string userName, string password)
{
string sql =
string.Format
(
@"SELECT COUNT(*) FROM UserAccounts
WHERE UserName = '{0}' AND Password = '{1}'",
_Escape(userName),
_Escape(password)
);
// ...
}Run Code Online (Sandbox Code Playgroud)
这看起来似乎可以在某种程度上被打破,但我不知道它是如何被用户输入利用的.假设用户输入未经过滤直到它命中_IsValidLogin,并忘记密码似乎以纯文本形式存储.
支持它的解决方案是显而易见的 - 使用位置参数 - 但是我需要一些弹药来向管理人员证明这个代码为什么/如何不安全所以可以分配时间/ $来修复它.
注意:我假设这可能会被打破,但实际情况可能并非如此.我不是SQL巨星.
注2:我已将此问题表达为与数据库无关,但如果您可以将此代码用于某个引擎,我欢迎您的贡献.
它可以通过反斜杠来利用。
password = foo\' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)
变成:
password = foo\'' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)
查询:
"SELECT COUNT(*) FROM UserAccounts
WHERE UserName = '{0}' AND Password = 'foo\'' OR 1=1 --'"
Run Code Online (Sandbox Code Playgroud)
--本例中就是注释标记。
该解决方案假设程序仅过滤(重复)撇号。
| 归档时间: |
|
| 查看次数: |
614 次 |
| 最近记录: |