千家信息网

.NET应用程序SQL注入的示例分析

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要为大家展示了".NET应用程序SQL注入的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下".NET应用程序SQL注入的示例分析"这篇文章
千家信息网最后更新 2025年11月09日.NET应用程序SQL注入的示例分析

这篇文章主要为大家展示了".NET应用程序SQL注入的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下".NET应用程序SQL注入的示例分析"这篇文章吧。

1.准备工具:SQL SERVER ,Visual Studio

2.数据库脚本和.net代码(c#)

3.SqlServer Profiler

SQL脚本代码:

USE MASTER GO--检索SQLTMP数据库是否存在IF EXISTS(SELECT * FROM SYSDATABASES WHERE name = 'SQLTMP')--删除SQLTMP数据库DROP DATABASE SQLTMPGO--创建数据库CREATE DATABASE SQLTMPGO--使用SQLTMP数据库USE SQLTMPGO-------------创建一张表用来验证SQL注入漏洞------------------检索表是否存在IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name = 'admin')--删除表DROP TABLE adminGO--创建表CREATE TABLE admin(id INT PRIMARY KEY IDENTITY(1,1),--设置主键name VARCHAR(20) NOT NULL,--用户名pass VARCHAR(20) NOT NULL--密码)-------------插入一条测试数据---------------------------INSERT INTO admin VALUES('admin','admin')--查询插入数据SELECT * FROM admin

下面是一段验证用户名密码的C#代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;using System.Data.SqlClient;namespace SQLTmp{class Program{//数据库连接字符串public static String strCon = "Data Source=.;Initial Catalog=SQLTMP;Integrated Security=True";//创建数据库连接对象static SqlConnection SqlCon = new SqlConnection(strCon);static void Main(string[] args){Console.WriteLine("请输入用户名:");String name = Console.ReadLine();Console.WriteLine("请输入密码:");String pass = Console.ReadLine();try{Program p = new Program();//打开数据库连接p.Open();string sql = "SELECT COUNT(*) FROM admin WHERE name = '"+name+"'AND pass = '"+pass+"'";SqlCommand sqlcom = new SqlCommand(sql, SqlCon);int i = (int)sqlcom.ExecuteScalar();if (i > 0){Console.WriteLine("登录成功!");}else{Console.WriteLine("登录失败!");}Console.ReadLine();}catch (Exception){throw;}finally {//关闭数据库连接pass.Clone();}}//打开数据库连接public void Open(){//关闭状态下打开数据库连接if (SqlCon.State == ConnectionState.Closed){SqlCon.Open();}//中断情况下打开数据库连接if (SqlCon.State == ConnectionState.Broken){//关闭SqlCon.Close();SqlCon.Open();}}//关闭数据库连接public void Close() {if (SqlCon.State == ConnectionState.Open || SqlCon.State == ConnectionState.Broken){SqlCon.Close();}}}}

我们来测试一下

输入正确的账号密码:

admin admin

登录成功

输入错误的账号密码:

test test

登录失败

我们在用户名输入:' or 1=1--

密码:123

会发现也能登录成功!

数据库中没有这个账号密码,还会登录成功?

why?

0x03剖析

我们来剖析一下SQL语句的运行过程

利用我的SQL语句跟踪工具(SQL Server Profiler)

单击链接

运行

我们来看一下输正确的账号密码SQL语句的样子

在我们的SQL Server中执行看看,有符合条件的数据

我们再来看看输入错误的账号密码SQL语句的样子

在我们的SQL Server中执行看看,没有符合条件的数据

我们再来看看最后一次的输入的账号密码的SQL语句的样子

我们来看看图片中的SQL语句我们的上面的SQL语句对比一下

SELECT COUNT(*) FROM SQLTMP WHERE name = 'admin' AND pass = 'admin'SELECT COUNT(*) FROM SQLTMP WHERE name = '' or 1=1 -- ' AND pass = '123'

我们会发现我们输入的用户名变成了空,后面多了or 1=1 --'这又是为什么,什么原因导致的???

到离这里我们就应该看看这一段代码:

 string sql = "SELECT COUNT(*) FROM admin WHERE name = '"+name+"'AND pass = '"+pass+"'";

我们可以看出SQL是中的name和pass是变量是用户输入的账号和密码

我们来看一下输入的用户名:' or 1=1 --

那么用户如输入'的时候就会自动把name = ''闭合

而 or 1=1 将where 条件永远成立

--在SQL是注释的意思会将后面的SQL语句注释掉!!!

那么我们就可以这么认为SQL语句到最后是这个样子的

SELECT COUNT(*) FROM SQLTMP WHERE name = '' or 1=1

0x04防御

有攻击的方式是会有防御的方式

据我所知常用的有俩种方式:

1.通过SQLParameter

好处:预编译SQL语句防止被转意

用法:

string sql = "SELECT COUNT(*) FROM admin WHERE name = [url=home.php?mod=space&uid=116087]@name[/url] AND pass = @pass "; //创建SParameter[]SqlParameter[] para = {new SqlParameter("@name",name),new SqlParameter("@pass",pass)};SqlCommand sqlcom = new SqlCommand(sql, SqlCon);//通过Parameters.addRange方法将para[]放进去sqlcom.Parameters.AddRange(para);int i = (int)sqlcom.ExecuteScalar();

@符号代表的参数,我们把拼接的方式换成了参数的形式

2.存储过程

1.首先在数据库中创建存储过程

CREATE PROC Login (@name VARCHAR(20) ,@pass VARCHAR(20))ASSELECT COUNT(*) FROM admin WHERE name =@name AND pass = @passGO

2. 调用存储过程

SqlParameter[] para = {new SqlParameter("@name",name),new SqlParameter("@pass",pass)};SqlCommand sqlcom = new SqlCommand();sqlcom.Connection = SqlCon;sqlcom.CommandText = "Login";//指定执行类型为存储过程sqlcom.CommandType = CommandType.StoredProcedure;sqlcom.Parameters.AddRange(para);int i = (int)sqlcom.ExecuteScalar();

以上是".NET应用程序SQL注入的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

数据 数据库 密码 输入 语句 用户 账号 用户名 过程 登录 成功 代码 方式 样子 存储 应用程序 示例 程序 分析 应用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小程序云开发数据库升降排序 0基础学java软件开发 csgo 服务器如何飞行 网络安全进社区志愿活动方案 北京北方蓝信网络技术有限公司 数据库安装需要的工作站是什么 中小学开展网络安全教育情况 一线互联网科技公司工资 鹰潭个人服务器哪家比较好 铜仁网络安全系统排行榜 长沙银行社招聘软件开发 数据库字段大小单精度型 服务器系统自动化 金蝶kis标准数据库 湖南常见软件开发价格走势 上海苍南网络技术有限公司 市场软件开发人天 网络安全密钥怎么设置 电商网络安全存在的隐患 网络安全法实施主题班会 服务器连接后怎么看图片 极翼网络安全的软件 康熙字典起名软件开发 中小学开展网络安全教育情况 网络安全宣传漫画作品 龙将人少的服务器 网络技术编程技术的心得体会 软件开发者的简介 进入宝塔数据库出现404 广州软件开发有哪些网站
0