博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADO.NET 【攻击及防御】
阅读量:5105 次
发布时间:2019-06-13

本文共 4659 字,大约阅读时间需要 15 分钟。

 

sql字符串注入攻击

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。SQL注入的手法相当灵活

SQL注入攻击会导致的数据库安全风险包括:刷库、拖库、撞库。 

 一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,

 如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。

SQL注入攻击被俗称为黑客的填空游戏。

 
 
攻击思路

          发现SQL注入位置;

          判断后台数据库类型;

          确定XP_CMDSHELL可执行情况

          发现WEB虚拟目录

          上传ASP木马;

          得到管理员权限;

 

案例1(接练习题、向数据库添加数据)

 cmd.CommandText = "insert into Students values( ' " +code+ " ', ' " +name+ "  ' )";

 conn.Open();

 cmd.ExecuteNonQuery();       -- 攻击前    用 C# 编写的 字符串拼接形式   

 conn.Close();

 

  SQL注入攻击 

               a ' ) ; update  students  set  Sname  =  ' 傻 X ' ; -- 

 

cmd.CommandText = "insert into Students values

                         ( ' code' ,' a ' ); update  students  set  Sname  =  ' 傻 X ' ; -- 

 conn.Open();

 cmd.ExecuteNonQuery();                  -- 攻击后  实际运行     

 conn.Close();

 

案例2

某个网站的登录验证的SQL查询代码为:

 

          strSQL = "SELECT * FROM users WHERE (name='" + userName+"') and (pw= '"passWord +"');"

 

恶意填入

 

       userName = 
"1' OR '1'='1";

 

 

       passWord "1' OR '1'='1";

 

将导致原本的SQL字符串被填为

 

       strSQL = 
"SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"

 

也就是实际上运行的SQL命令会变成下面这样的

 

       strSQL = 
"SELECT * FROM users;"

 

达到无账号密码,亦可登录网站。

 
 

防御

可以通过数据库防火墙实现对SQL注入攻击的防范,,

可以使用虚拟补丁技术实现对注入攻击的SQL特征识别,实现实时攻击阻断。

在构造动态SQL语句时,一定要使用占位符这将防止有人试图偷偷注入另外的SQL表达式

 

对案例1进行防御

 

    cmd.CommandText = "insert into Students values(@a,@b)";

    cmd.Parameters.Clear();                                                -- 清空

    cmd.Parameters.AddWithValue( " @a " ,  code );         -- @a 占位符 与对应的值   code

    cmd.Parameters.AddWithValue( " @b " ,  name );        -- @b 占位符 与对应的值  name

    conn.Open();

    cmd.ExecuteNonQuery();

    conn.Close();

 
 
练习

Student表  Scode,Sname

添加学生信息 ,只需要用户输入学生姓名,
编号自动生成:S001 S002 .....

1
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.SqlClient;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            //默认表中没有数据            string code = "S001";            while (true)            {                Console.Write("请输入添加的学生姓名:");                string name = Console.ReadLine();                string sql = "server=.;database=Data0216;user=sa;pwd=123";                SqlConnection conn = new SqlConnection(sql);                SqlCommand cmd = conn.CreateCommand();                //查询所有降序排列                cmd.CommandText = "select *from Students order by Scode desc";                conn.Open();                SqlDataReader dr = cmd.ExecuteReader();                if (dr.HasRows)                {                    //生成编号                    dr.Read();                    //取第一个(最大)                    string s = dr["Scode"].ToString();                    //       截取 s 后面的 转换类型          留3位数                                 code = "S" + (Convert.ToInt32(s.Substring(1)) + 1).ToString("000");                }                conn.Close();                cmd.CommandText = "insert into Students values(@a,@b);";                cmd.Parameters.Clear();                cmd.Parameters.AddWithValue("@a", code);                cmd.Parameters.AddWithValue("@b", name);                conn.Open();                cmd.ExecuteNonQuery();                conn.Close();                Console.ReadLine();            }        }    }}
View Code

 

2

using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Text;namespace ConsoleApplication4{    class Program    {        static void Main(string[] args)        {            //5、Student表 Scode,Sname            //添加学生信息 ,只需要用户输入学生姓名,            //编号自动生成:S001 S002             string sql = "server=.;database=Data0216_5;user=sa;pwd=123";            SqlConnection conn = new SqlConnection(sql);            SqlCommand cmd = conn.CreateCommand();            Console.Write("请输入姓名:");            string name = Console.ReadLine();            string scode;            cmd.CommandText = "select * from student";            conn.Open();            SqlDataReader dr = cmd.ExecuteReader();            if (dr.HasRows)            {                int a = 0;                while (dr.Read())                {                    a += 1;                }                scode = "s" + (a+1).ToString("000");                                                      }            else            {                scode = "s001";            }            conn.Close();            cmd.CommandText = "insert into student values('" + scode + "','" + name + "')";            conn.Open();            int aa = cmd.ExecuteNonQuery();            if (aa > 0)            {                Console.WriteLine("添加成功");            }            else            {                Console.WriteLine("添加失败!");             }            conn.Close();            Console.ReadLine();        }    }}
View Code

 

1于2的区别

1 中先找最大号,新加入的比最大号大 1
2 中先看有多少记录,新加入的比总记录数大 1 
 
 
 

转载于:https://www.cnblogs.com/Tanghongchang/p/6741452.html

你可能感兴趣的文章
C++:同名隐藏和赋值兼容规则
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
Microsoft .NET 远程处理:技术概述(代理模式)
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
java 类型转型
查看>>
基于C#编程语言的Mysql常用操作
查看>>
【转】Java反射 之 反射基础
查看>>
mysql数据库备份和还原的常用命令
查看>>
s3c2440实验---定时器
查看>>
HBase配置性能调优(转)
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
python中的字符编码
查看>>
图论例题1——NOIP2015信息传递
查看>>
uCOS-II中的任务切换-图解多种任务调度时机与问题
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>