欢迎来到天天文库
浏览记录
ID:39557165
大小:215.50 KB
页数:27页
时间:2019-07-06
《常见的Web应用安全漏洞与分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、严重性:高类型:应用程序级别测试WASC威胁分类:命令执行类型:SQL注入CVE引用:不适用安全风险:可能会查看、修改或删除数据库条目和表可能原因未对用户输入正确执行危险字符清理技术描述Web应用程序通常在后端使用数据库,以与企业数据仓库交互。查询数据库事实上的标准语言是SQL(各大数据库供应商都有自己的不同版本)。Web应用程序通常会获取用户输入(取自HTTP请求),将它并入SQL查询中,然后发送到后端数据库。接着应用程序便处理查询结果,有时会向用户显示结果。如果应用程序对用户(攻击者)的输入处理不够小心,攻击者便可以利用这种操作方式。在
2、此情况下,攻击者可以注入恶意的数据,当该数据并入SQL查询中时,就将查询的原始语法更改得面目全非。例如,如果应用程序使用用户的输入(如用户名和密码)来查询用户帐户的数据库表,以认证用户,而攻击者能够将恶意数据注入查询的用户名部分(和/或密码部分),查询便可能更改成完全不同的数据复制查询,可能是修改数据库的查询,或在数据库服务器上运行Shell命令的查询。一般而言,攻击者会分步实现这个目标。他会先学习SQL查询的结构,然后使用该知识来阻挠查询(通过注入更改查询语法的数据),使执行的查询不同于预期。假设相关查询是:SELECTCOUNT(*)F
3、ROMaccountsWHEREusername='$user'ANDpassword='$pass'其中$user和$pass是用户输入(从调用构造查询的脚本的HTTP请求收集而来-可能是来自GET请求查询参数,也可能是来自POST请求主体参数)。此查询的一般用法,其值为$user=john、$password=secret123。形成的查询如下:SELECTCOUNT(*)FROMaccountsWHEREusername='john'ANDpassword='secret123'如果数据库中没有这个用户密码配对,预期的查询结果便是0,
4、如果此类配对存在(也就是数据库中有名称为“john”的用户,且其密码为“secret123”),结果便是>0。这是应用程序的基本认证机制。但攻击者可以用下列方式来更改此查询:攻击者可以提供单引号字符(')所组成的输入,使数据库发出错误消息,其中通常包含关于SQL查询的有价值的信息。攻击者只需在发送的请求中包含用户值',并在密码中包含任何值(如foobar)。结果便是下列(格式错误)的SQL查询:SELECTCOUNT(*)FROMaccountsWHEREusername='''ANDpassword='foobar'这可能会产生以下错误消
5、息(取决于后端所使用的特定数据库):查询表达式'username='''ANDpassword='foobar''中发生语法错误(遗漏运算符)。这时攻击者便得知查询是根据表达式username='$user'ANDpassword='$pass'来构建的。利用手边的SQL查询时需要这一关键信息。攻击者了解查询的格式后,下一步只需使用:user='or1=1or''='password=foobar生成的查询如下:SELECTCOUNT(*)FROMaccountsWHEREusername=''or1=1or''=''ANDpassword
6、='foobar'这表示查询(在SQL数据库中)对于“accounts”表的每项记录都会返回TRUE,因为1=1表达式永远为真。因此,查询会返回“accounts”中的记录数量,于是用户(攻击者)也会被视为有效。这个探测方法有若干变体,例如,发送';or'(您应该记住,几乎所有供应商都有他们自己唯一的SQL“版本”。具体地说,发送'having1=1,也会生成错误消息,此消息会泄露有关列名称的信息。在某些情况下,用户输入不会并入字符串上下文(用单引号括住),而是并入数字上下文,换言之,就是依现状嵌入。因此,在这种情况下,可以使用输入字符串
7、1having1=1。*盲目SQL注入技术:降低SQL注入攻击风险的一般方式,是禁止详细的SQL错误消息,攻击者通常便利用这些消息(如上述示例所说明),轻易找出容易遭受“SQL注入”的脚本。这个(以遮盖获取安全)解决方案可以利用称为“盲目SQL注入”的技术来略过,黑客不需要依赖返回SQL错误消息,便能找出容易遭受“SQL注入”的脚本。这项技术需要发送易受攻击的参数(被嵌入在SQL查询中的参数)已被修改的请求,将参数修改成,使响应指出是否在SQL查询上下文中使用数据。这项修改包括搭配原始字符串来使用ANDBoolean表达式,使它一时得出tr
8、ue,一时得出false。在一种情况中,最终结果应该与原始结果相同(例如:登录成功),在另一情况中,结果应该不同(例如:登录失败)。在某些少见的情况中,得出true的OR表达式也
此文档下载收益归作者所有