很多网站上有登录和忘记密码的链接,可能存在sql注入的隐患。在忘记密码(把密码发送到邮箱)那里测试。

获取数据

1.'的妙用。在邮箱栏输入emailaddress',如果返回服务器错误,则说明sql注入成功,sql语句执行那里发现了多余的',然后报错。

2.确定能够注入的情况下,输入;--。例如,在邮箱栏输入xx' or 1=1;--。这样后台组装sql语句就会变成(其中的field1、field2和table是指代,是后台的未知名称,待求证,下同):

select field1,field2 from table where email='xx' or 1=1;--';

这里的or 1=1让where后面的条件变成true。后面的;--则结束前面的语句,把后面的';给注释掉。这样就成功的返回了数据。

3.能注入的前提下,多次尝试获取一个有效的email。也可以在网站的客服或者联系页面,找到相关工作人员的邮箱,然后尝试是否有注册帐号。在邮箱栏输入测试的地址,返回密码已发送到相关邮箱(类似信息),则说明这个邮箱在数据库存在帐号。

4.前提下,获取有效的field字段。多次尝试获取。一般的用户表会包含一些类似userID,password,cellphone,email,等字段。测试方法,在where语句那里输入x' and userID=10。执行sql后,如果返回服务器错误,则说明字段错误。如果返回邮箱不正确或其他消息,则说明字段是存在的。

4.前提下,获取有效的table。这里也是多次尝试。一般用户数据表,不外乎users,members,emails,mails,等。测试方法,在where语句那里嵌套子查询。例如,在邮箱栏输入xx' and (select count(*) from testTable)>0;--。这样后台组装sql后,执行查询时,如果testTable不存在,则会返回服务器错误,如果存在,则为邮箱不正确或者发送密码成功。

5.在3和4中获得了tableName和field的前提下,假设上面获取的有效table名称为users,有效字段为userID,psw,email。测试此table是不是当前邮箱查询相对应的table。方法,在where语句里面用table.field=''来判断是不是和From后面的表格是同一个。具体的where语句:xx' and users.email='xx';--。此时完整的sql语句为:

select field1,field2 from table where email='xx' and users.email='xx';--';

这里,如果当前查询的table不是users表的话,这条语句不能通过,也就是返回结果会服务器错误。这说明表格不一致。返回其他结果,则表格一致。

修改数据表

6.在获得了有效工作人员邮箱和表格名及表格的“部分”有效字段后,如果当前web程序有数据库的修改权限的话可以修改数据库。具体的,可以增删改。

改:

select field1,field2 from users where email='admin@email.com';
update users set email='self@email.com' where email='admin@email.com';--';

这样就成功的将工作人员的邮箱改成了自己可用的邮箱地址。虽然同时会发送一封密码的邮件给工作人员的邮箱,但是也同时有效修改了相关帐号对应的邮箱,这时再去点击忘记密码,输入自己的邮箱self@email.com时,就能成功的获得相关的账号密码数据了。

删:

select field1,field2 from users where email='admin@email.com';
drop table users;--';

呵呵,玩笑开大了,直接删除用户表了。

增:

select field1,field2 from users where email='admin@email.com';
insert into users(email,userID,pwd) select 'xx',10,'test';--';

这样直接无声无息的在后台数据表里面增加了一条数据。虽然这条数据可能不能用,数据库有些字段不能为null,或者数据信息不够,等都可能导致数据失效,不能登录和使用。不过如果前面已经成功获取了管理员的帐号密码,这里的数据也没有管理员账号好用。o(∩_∩)o ~

补救措施

过滤查询条件里面的特殊字符,类似'(单引号);(分号,结束符)--(两个中画线,注释符)/(转义符)等等,特殊处理一下。但是这里也是有陷阱的,有些sql服务器会自动处理这些特殊字符,会自己添加转义字符,这种情况,又会死得很惨了。

第二种方法,比较稳妥的,避免自己合成的sql语句直接执行,用sqlparameters,参数传入。例如:(类似代码,类和函数都只是说明用,不具实际用)

var parameter = txtEmail.Text;
var sql = new sqlParameter("select xx from users where email=p0");
ExecuteQuery(sql, parameter); //或者linq to sql
var f = db.users.Where(x=>x.Email==parameter); //或者linq to sql2
var f2 = from x in db.users
where x.Email == parameter
select x;

补充说明

1. sql注入除了防',还得防int类型的,如果后台的sql是"select field1,field2 from table where ID=",此时前台输入"5 or 1=1",连单引号都可以省略了,更加直接的注入。

2. 可以看出来,sql注入,都是在where的条件语句里面做手脚,前台传递给后来的就是where的匹配的对象,这是sql注入式攻击基本的原理。虽然我们可以在里面做更多的select,delete,drop,update和insert等。

3. 待研究:xp_cmdshell的开启。07年以后的版本,默认此项关闭(在外围应用配置器里没有勾选)。如果没有开启,则不会出现以上的漏洞。

15.01.23-sql的注入式攻击的更多相关文章

  1. 【2017-04-20】Sql字符串注入式攻击与防御

    一.攻击 所谓sql字符串注入式攻击就是在用户输入界面输入一串sql语句,来改变C#中连接数据库要执行的sql语句 通过你写的程序,直接来执行我想要执行的sql语句 例如:在这么一个程序中,sname ...

  2. 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类

    字符串攻击 所谓sql字符串注入式攻击就是在用户输入界面输入通过精心编制的含有某种指令的字符串,来改变C#中连接数据库要执行的sql语句,从而对数据库进行攻击性操作 在用户输入界面输入  a');up ...

  3. SQL的注入式攻击方式和避免方法

    SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行.任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQ ...

  4. 浅谈C#.NET防止SQL注入式攻击

    1#region 防止sql注入式攻击(可用于UI层控制)  2  3///   4/// 判断字符串中是否有SQL攻击代码  5///   6/// 传入用户提交数据  7/// true-安全:f ...

  5. 防止sql注入式攻击 SQL注入学习——三层架构

    解决方案是:1.首先在UI录入时,要控制数据的类型和长度.防止SQL注入式攻击,系统提供检测注入式攻击的函数,一旦检测出注入式攻击,该数据即不能提交:2.业务逻辑层控制,通过在方法内部将SQL关键字用 ...

  6. 什么是SQL注入式攻击

    什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响 ...

  7. SQL注入式攻击

    百度百科:http://baike.baidu.com/link?url=GQbJ2amTzTahZA7XJSBDLYYkN3waQ9JCoJ0l--tCWlvKQibe0YaH4hpmgEnLyn0 ...

  8. 【JDBC】预编译SQL与防注入式攻击

    在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedS ...

  9. SQL注入详细介绍及如何防范SQL注入式攻击

    一. SQL注入攻击的简单示例. statement := "SELECT * FROM Users WHERE Value= " + a_variable + " 上面 ...

随机推荐

  1. 【Redis源代码剖析】 - Redis内置数据结构之字典dict

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51018337 今天我们来讲讲Redis中的哈希表. 哈希表在C++中相应的是ma ...

  2. PHP取整,四舍五入取整、向上取整、向下取整、小数截取

    PHP取整数函数常用的四种方法: 1.直接取整,舍弃小数,保留整数:intval(): 2.四舍五入取整:round(): 3.向上取整,有小数就加1:ceil(): 4.向下取整:floor(). ...

  3. CentOS中安装JAVA环境

    好消息, 程序员专用早餐机.和掌柜说 ideaam,可以节省20元. 点击链接   或復·制这段描述¥k3MbbVKccMU¥后到淘♂寳♀ 一般情况下,我们都要将linux自带的OPENJDK卸载掉, ...

  4. ELK 的插件安装(head)

    这里我装了一个head插件和kopf的插件 ./plugin install mobz/elasticsearch-head ./plugin install lmenezes/elasticsear ...

  5. 分布式系统的那些事儿(六) - SOA架构体系

    有十来天没发文了,实在抱歉!最近忙着录视频,同时也做了个开源的后台管理系统LeeCX,目前比较简单,但是后续会把各类技术完善.具体可以点击“原文链接”. 那么今天继续说分布式系统的那些事. 我们现在动 ...

  6. MSSQL分组取后每一组的最新一条记录

    数据库中二张表,用户表和奖金记录表,奖金记录表中一个用户有多条信息,有一个生效时间,现在要查询: 奖金生效时间在三天前,每个用户取最新一条奖金记录,且用户末锁定 以前用的方法是直接写在C#代码中的: ...

  7. HTML5学习笔记(十六):原型、类和继承【JS核心知识点】

    理解原型 在JavaScript中,只要声明了一个函数,就会为该函数创建一个名为prototype的属性,该属性指向当前函数的原型对象. 而函数的原型对象有一个constructor属性,该属性指向刚 ...

  8. (原创)一个简洁通用的调用DLL函数的帮助类

    本次介绍一种调用dll函数的通用简洁的方法,消除了原来调用方式的重复与繁琐,使得我们调用dll函数的方式更加方便简洁.用过dll的人会发现c++中调用dll中的函数有点繁琐,调用过程是这样的:在加载d ...

  9. 服务器搭建3 安装libevent2.0.20

    1.检测是否安装 安装了的话应该是这样的:如果不是,那就装一下. root@iZ23nyl8frqZ:/home/upload# ls -a /usr/lib |grep libeventlibeve ...

  10. python(42):进制转换

    十六进制 到 十进制 使用 int() 函数 ,第一个参数是字符串 '0Xff' ,第二个参数是说明,这个字符串是几进制的数.  转化的结果是一个十进制数. >>> int('0xf ...