.NET 代码审计场景-Web.config注入

0x01 appSetting

Select 又称投影操作符,定义如下

.NET开发Web应用程序时,通常需要从 Web.config 文件中读取连接SQL配置信息,以便连接和查询数据库。Web.config除了存储应用程序的数据库连接字符串之外还可以查放置SQL语句,使用时通过WebConfigurationManager.AppSettings 方法可以很方便地获取这些配置信息。.

.NET 代码审计场景-Web.config注入

首先我们可以打开VisualStudio提供的SQL Server对象资源管理器右击属性后可看到数据库连接字符串,如下图

.NET 代码审计场景-Web.config注入

移除信任根证书项Trust Server Certificate=False;修改后的连接字符串添加到<appSettings>节点,在该节点下我们定义了一个名为 "ConnectionString" 的键,用于存储数据库连接字符串,以及一个名为 "employeeQuery" 的键,用于存储查询语句。另外因为需要引入System.Data.Common.DbProviderFactories标准工厂类操作不同的数据库,所以定义key名为factory,值为System.Data.SqlClient数据源。最终配置清单如下

<appSettings>    <add key="factory" value="System.Data.SqlClient"/>    <add key="employeeQuery" value="SELECT * FROM Employees"/>  </appSettings>

0x02 addData

上述代码中需要注意的是当 "Integrated Security" 参数设置为 "true" 时,表示 MSSQL 数据库使用Windows 用户的身份进行连接,这意味着连接字符串中不需要指定用户名和密码,而是直接使用当前登录用户的凭据进行身份验证,这种方式被称为 Windows 集成安全性或 Windows 身份验证。employeeQuery键名对应的SQL查询涉及Employees表,可以从资源管理器右击新建SQL查询执行如下代码

CREATE TABLE [dbo].[Employees](  [Id] INT NOT NULL PRIMARY KEY,  [FirstName] Varchar(50),  [LastName] Varchar(50))

.NET 代码审计场景-Web.config注入

添加一条数据后接下来我们可以先通过工厂类的GetFactory方法读取配置信息,再使用WebConfigurationManager.AppSettings获取需要带入的SQL查询条件,如下代码

WebConfigurationManager.ConnectionStrings["master"].ConnectionString;DbCommand cmd = provider.CreateCommand();string baseQuery = WebConfigurationManager.AppSettings["employeeQuery"];             string orderBy = Request["sort"]; string query = string.Format("{0} ORDER BY {1}", baseQuery, orderBy);cmd.CommandText = query;

orderBy变量从外部获取后替换了string.Format占位符{1},这样使用SqlCommand 对象访问数据操作时触发SQL注入攻击,如下图提交sort = id,convert(int,@@version)

.NET 代码审计场景-Web.config注入