我正在测试对 SQL Server 数据库的注入攻击的弹性。
db 中的所有表名都是小写的,排序规则区分大小写,Latin1_General_CS_AS。
我可以发送的字符串被强制为大写,长度最多为 26 个字符。所以我不能发送 DROP TABLE 因为表名是大写的,因此语句会由于排序规则而失败。
那么 - 我在 26 个字符中可以造成的最大伤害是多少?
编辑
我对参数化查询等都了如指掌——让我们想象一下,开发构建要发送的查询的前端的人在这种情况下没有使用参数。
我也不想做任何邪恶的事情,这是由同一组织中的其他人构建的系统。
简单的:
或者,我想在这种情况下它会是
选择这方面的变化。
您现在很可能能够针对您当前的系统进行测试,但是随着时间的推移,数据库中任何数量的小变化都可能使您的测试无效。字符串可能会改变,有人可以创建一个具有破坏性潜力的小写存储过程 - 任何东西。您永远不能 100% 有把握地说,没有人可以构建具有破坏性的 26 字符攻击。
我建议您找到一种方法让开发人员遵循基本的行业标准最佳安全实践,如果只是为了您自己,因为我认为如果发生安全漏洞至少部分负责。
编辑:
对于恶意/乐趣,您可以尝试启用每个跟踪标志。这将是有趣的观察。感觉就像布伦特·奥扎尔(Brent Ozar)会写的一篇博文……
SHUTDOWN
命令或命令(选择一个超过 50的KILL
随机数)都占用明显少于 26 个字符,尽管执行应用程序查询的帐户希望没有足够的权限来运行这些。您可以创建一个表,然后将其填满,直到时间结束或磁盘空间用完,以先到者为准。
根据您对损坏的定义,您可以运行以下命令: WAITFOR DELAY '23:59' 为了真正的邪恶,您可以使用负载测试工具从 32,768 个客户端运行它。
基于@MikaelEriksson 的回答和@MartinSmith 对我最初评论的回复的变化:
最初我试图做一个 WHILE 语句,但我能做的最好是 27 个字符:
但 Martin 指出了 GOTO:
GOTO ...万恶之源,26个字符的无限循环插入语句的创造者。
话虽如此......坚持使用 CHAR(99) 而不是 int 可能是有利的,因为那样会占用更多空间。其他选项要么使用更长的名称并打破 26 个字符的限制……要么每行使用更少的存储空间。
完整测试代码:
取决于您认为断电的破坏程度。:-)
这确实需要在服务器上启用 xp_cmdshell,这在 SQL Server 的最后几个版本中并非如此。它还要求服务帐户具有关闭权限,它可能有也可能没有。
启用 xp_cmdshell 可能超出了 26 个字符的限制。你会允许多次注射吗?