2024年4月2日发(作者:)
常见安全漏洞及修复方法
一、SQL 注入
1.1概况及技术描述
严重性:高
类 型:应用程序级别测试
WASC威胁分类:命令执行类型:SQL注入
CVE引用:不适用
安全风险:可能会在WEB服务器上运行远程命令,这通常意味着完全破坏服务器及其
内容。
可能原因:
未对用户输入正确执行危险字符清理
技术描述:
这个“SQL 注入”变体试图将易受到攻击的脚本和参数名称所组成的文本写入本地文件系
统的文件中。
不过,AppScan 不可能访问 SQL Server 文件系统,因此必须由用户来验证测试是否成功。
AppScan 测试完成之后,请实际访问 SQL Server 机器,或通过远程连接来访问。
在 C 驱动器的根目录下,请检查是否有名称为“”的文件(也就是
C:)。
如果有,它会包含一份列表,列出所有易受攻击的脚本和参数。
这个变体的技术描述:
MS SQL 有一个能够运行 Shell 命令的内建函数。从查询环境安装一个 Shell 操作参数,
便可以调用这个函数。
这个函数的利用方式如下:
假设基于 Web 的应用程序使用下列查询:
SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='$category' ORDER BY PRICE
其中 $category 是用户提供的类别描述(可能使用选择框)。
提供 ' p_cmdshell 'echo some text >> C:' -- 字符串(作为
$category)之后,形成的查询如下:
SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='' p_cmdshell
'echo some text >> C:' --' ORDER BY PRICE
现在,这个查询可以分为三个部分:
[1] 第一个 SQL 查询:SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=''
[2] 第二个 SQL 查询,执行 Shell 命令:p_cmdshell 'echo some text >>
C:'
1
[3] MS SQL 注释:--' ORDER BY PRICE
如您所能见到,恶意的输入将查询的语意改成:查询、执行 Shell 命令,以及注释。
Web 应用程序通常在后端使用数据库,以与企业数据仓库交互。查询数据库事实上的
标准语言是 SQL(各大数据库供应商都有自己的不同版本)。Web 应用程序通常会获取用
户输入(取自 HTTP 请求),将它并入 SQL 查询中,然后发送到后端数据库。接着应用程
序便处理查询结果,有时会向用户显示结果。
如果应用程序对用户(攻击者)的输入处理不够小心,攻击者便可以利用这种操作方式。
在此情况下,攻击者可以注入恶意的数据,当该数据并入 SQL 查询中时,就将查询的原始
语法更改得面目全非。例如,如果应用程序使用用户的输入(如用户名和密码)来查询用户
帐户的数据库表,以认证用户,而攻击者能够将恶意数据注入查询的用户名部分(和/或密
码部分),查询便可能更改成完全不同的数据复制查询,可能是修改数据库的查询,或在数
据库服务器上运行 Shell 命令的查询。
一般而言,攻击者会分步实现这个目标。他会先学习 SQL 查询的结构,然后使用该
知识来阻挠查询(通过注入更改查询语法的数据),使执行的查询不同于预期。假设相关查
询是:
SELECT COUNT(*) FROM accounts WHERE username='$user' AND password='$pass'
其中 $user 和 $pass 是用户输入(从调用构造查询的脚本的 HTTP 请求收集而来 -
可能是来自 GET 请求查询参数,也可能是来自 POST 请求主体参数)。此查询的一般用法,
其值为 $user=john、$password=secret123。形成的查询如下:SELECT COUNT(*) FROM
accounts WHERE username='john' AND password='secret123'
如果数据库中没有这个用户密码配对,预期的查询结果便是 0,如果此类配对存在(也
就是数据库中有名称为“john”的用户,且其密码为“secret123”),结果便是 >0。这是应用程
序的基本认证机制。但攻击者可以用下列方式来更改此查询:
攻击者可以提供单引号字符(')所组成的输入,使数据库发出错误消息,其中通常包含关
于 SQL 查询的有价值的信息。攻击者只需在发送的请求中包含用户值 ',并在密码中包含
任何值(如 foobar)。结果便是下列(格式错误)的 SQL 查询:SELECT COUNT(*) FROM
accounts WHERE username=''' AND password='foobar'
这可能会产生以下错误消息(取决于后端所使用的特定数据库):查询表达式 'username
= ''' AND password = 'foobar'' 中发生语法错误(遗漏运算符)。
这时攻击者便得知查询是根据表达式 username='$user' AND password='$pass' 来构建的。利
用手边的 SQL 查询时需要这一关键信息。攻击者了解查询的格式后,下一步只需使用:
user = ' or 1=1 or ''=' password = foobar
生成的查询如下:
SELECT COUNT(*) FROM accounts WHERE username='' or 1=1 or ''='' AND
password='foobar'
这表示查询(在 SQL 数据库中)对于“accounts”表的每项记录都会返回 TRUE,因为
1=1 表达式永远为真。因此,查询会返回“accounts”中的记录数量,于是用户(攻击者)也
会被视为有效。这个探测方法有若干变体,例如,发送 '; or '(您应该记住,几乎所有供应
2
发布评论