深入浅出SQL注入

原文:深入浅出SQL注入

之前在做学生信息管理系统和机房收费系统的时候,对于SQL注入的问题已经是司空见惯,但是并没有真正的地形象生动的理解SQL注入到底是什么玩意儿.直到这次做牛腩才在牛老师的举例之下,明白了原来SQL注入是真的很危险啊.

问题提出:

我们先来构造一个简单的添加新闻类别的程序,在动态网页上添加一个TextBox控件,一个Button控件,一个GridView控件。布局如下图所示:

然后为控件编写代码如下:

先来看SQLHelper类中用来执行sql语句的函数

 <span style="font-size:18px;">public int ExecuteNonQuery(string sql)
        {
            int res;
            try
            {
                cmd = new SqlCommand(sql,GetConn());
                res = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally {
                if (conn.State ==ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            return res;
        }</span>

然后是用来进行插入数据的函数Insert

<span style="font-size:18px;"> public bool Insert(string caName)
        {
            bool flag = false;
            string sql = "insert intocategory(name) values('"+caName +"')";
            int res =sqlhelper.ExecuteNonQuery(sql);
            if (res > 0)
            {
                flag = true;
            }
            return flag;
        }</span>

最后是在页面代码中编写按钮的单击事件代码

<span style="font-size:18px;"> protected void Button1_Click(object sender,EventArgs e)
        {
            string caName = TextBox1.Text;
            bool b = newCategoryDAO().Insert(caName);
            Response.Write(b);
            GridView1.DataSource = newCategoryDAO().SelectAll();
            GridView1.DataBind();
        }</span>

调试没问题之后,运行程序,结果如下图

当我们在输入框中输入“奇闻异事‘)delete category where id=5--”之后,单击按钮,结果如下:

当时我看到这个结果的时候,很是震惊,就这么轻易的把数据库里的数据删除了?这是为什么呢?我们把代码中的SQL语句提取出来,然后将输入的内容也放进去,来分析一下原因,如下图

这只是SQL注入的一个简单的例子而已,还有好多种形式的SQL注入。只要能够获取你的数据库表名(对于高手来说,这个so
easy),而且你的代码没有经过安全性优化,那么我就可以随意更改甚至删除你的数据,上面的只是删除了一条记录,如果把语句改成delete category,那么整个表的数据将会被清空,后果很严重啊。

解决方案:

一种办法就是将输入的内容参数化,即将原本拼接SQL语句的方式变成向SQL语句中传入参数。具体来讲,就是将Insert函数改造一下,并且将SQLHelper类中的相应函数也改写一下,代码如下:

先来看SQLHelper的函数如何改写:

 <span style="font-size:18px;">public int ExecuteNonQuery(string sql ,SqlParameter [] paras)
        {
            int res;
            using (cmd =new SqlCommand (sql ,GetConn ()))
            {
                cmd.Parameters.AddRange(paras );
                res =cmd .ExecuteNonQuery ();
            }
            return res;
        }</span>

然后是Insert函数的优化代码:

<span style="font-size:18px;"> public bool Insert(string caName)
        {
            bool flag = false;
            string sql = "insert into category(name) values(@caName)";
            SqlParameter[] paras = new SqlParameter[]{
                new SqlParameter ("@caName",caName )
            };
            int res = sqlhelper.ExecuteNonQuery(sql, paras);
            if (res > 0)
            {
                flag = true;
            }
            return flag;
        }</span>

优化之后调试没问题,运行程序,结果如下:

我们在输入框中输入“奇闻异事‘)delete category where id=2--”,然后单击按钮,会出现什么结果呢?请看下图:

到现在为止,相信你对SQL注入一定有了一个直观的认识和理解,当初做系统的时候只是知道在输入框中输入奇数个英文状态下的单引号,会让你的系统报错甚至死掉,并不知道还可以通过拼接SQL语句对内部数据库进行操作,从而对SQL注入的危害性没有那么深刻的认识,现在终于明白了原来问题很严重啊!

时间: 2024-09-29 15:24:45

深入浅出SQL注入的相关文章

EntityFramework Core 2.0执行原始查询如何防止SQL注入?

前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramework Core执行原始查询 在EntityFramework Core中执行原始查询我们借助FromSql来实现,如下: using (var context = new EFCoreDbContext()) { var orders = context.Orders .FromSql("SELECT

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

sql注入初中高学习

以下三篇文件关于SQL注入写的很通俗易懂,整理收藏下 渗透攻防Web篇-SQL注入攻击初级: http://bbs.ichunqiu.com/thread-9518-1-1.html 渗透攻防Web篇-SQL注入攻击中级: http://bbs.ichunqiu.com/thread-9668-1-1.html 渗透攻防Web篇-SQL注入攻击高级: http://bbs.ichunqiu.com/thread-10093-1-1.html

php中防止SQL注入的方法

[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨.我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件

sql注入总结

本实验测试是基于sqli-labs的实验环境 环境配置:php+mysql 环境搭建请参考 http://www.freebuf.com/articles/web/34619.html Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的 sql注入分类: 基于联合查询 基于错误回显 基于盲注,分时间盲注和布尔型的盲注 基于user-agent 基于feferer 基于cookie 二次注入 宽字节注入 注入一个网站

SQL注入解决思路(C#示例)

最近在编程中遇到一个SQL注入防护的问题.在这里顺便把SQL注入小结一下.以MYSQL(5.1)为例. 一.常规的SQL语句 观察SQL语句 SELECT * FROM [tableName] WHERE col1='value1' 这个语句由3个部分组成,SELECT子句筛选得到结果,FROM子句指定了筛选的范围,WHERE子句指定了条件.当在其中进行如下置换: SELECT * FROM [tableName] WHERE 1 之后,选出了[tableName]表中的全部内容.分析其语法不难

微擎SQL注入漏洞

漏洞名称:微擎SQL注入漏洞 补丁文件:/web/source/mc/card.ctrl.php 补丁来源:阿里云云盾自研 漏洞描述:微擎CMS的/web/source/mc/card.ctrl.php中,对cardid输入参数未进行严格类型转义,导致SQL注入的发生 解决方法 搜索代码 if ($do == 'manage') 如下图: 在 201 行 前添加代码 $_GPC['cardid'] = intval($_GPC['cardid']); 修改后如图: 补丁文件:/web/sourc

SQL注入之SQLmap入门

什么是SQLmap? SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹.访问底层文件系统.执行命令). 读者可以通过位于SourceForge的官方网站下载SQLmap源码:http://sourceforge.net/projects/sqlmap/ SQLmap的作者是谁? Bernardo DameleAssumpcao Guimaraes (@inquisb),读者可以通过[email protected]与他取得联

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/phpcms_v9/index.php?m=member&c=index&a=login dosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2