15.01.23-sql的注入式攻击
很多网站上有登录和忘记密码的链接,可能存在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的注入式攻击的更多相关文章
- 【2017-04-20】Sql字符串注入式攻击与防御
一.攻击 所谓sql字符串注入式攻击就是在用户输入界面输入一串sql语句,来改变C#中连接数据库要执行的sql语句 通过你写的程序,直接来执行我想要执行的sql语句 例如:在这么一个程序中,sname ...
- 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类
字符串攻击 所谓sql字符串注入式攻击就是在用户输入界面输入通过精心编制的含有某种指令的字符串,来改变C#中连接数据库要执行的sql语句,从而对数据库进行攻击性操作 在用户输入界面输入 a');up ...
- SQL的注入式攻击方式和避免方法
SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行.任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQ ...
- 浅谈C#.NET防止SQL注入式攻击
1#region 防止sql注入式攻击(可用于UI层控制) 2 3/// 4/// 判断字符串中是否有SQL攻击代码 5/// 6/// 传入用户提交数据 7/// true-安全:f ...
- 防止sql注入式攻击 SQL注入学习——三层架构
解决方案是:1.首先在UI录入时,要控制数据的类型和长度.防止SQL注入式攻击,系统提供检测注入式攻击的函数,一旦检测出注入式攻击,该数据即不能提交:2.业务逻辑层控制,通过在方法内部将SQL关键字用 ...
- 什么是SQL注入式攻击
什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响 ...
- SQL注入式攻击
百度百科:http://baike.baidu.com/link?url=GQbJ2amTzTahZA7XJSBDLYYkN3waQ9JCoJ0l--tCWlvKQibe0YaH4hpmgEnLyn0 ...
- 【JDBC】预编译SQL与防注入式攻击
在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedS ...
- SQL注入详细介绍及如何防范SQL注入式攻击
一. SQL注入攻击的简单示例. statement := "SELECT * FROM Users WHERE Value= " + a_variable + " 上面 ...
随机推荐
- Python dict 出现 Key error
解决方法: https://www.polarxiong.com/archives/Python-%E6%93%8D%E4%BD%9Cdict%E6%97%B6%E9%81%BF%E5%85%8D%E ...
- windows下php的各个版本下载地址
windows下php的各个版本 https://windows.php.net/downloads/releases/archives/
- “TableDetails”中列“IsPrimaryKey”的值为DBNull. Mysql EntityFramework
Entity Framework连接MySQL时 ...
- NSDate NSTimerZone 时区转换
timeZoneAbbreviation = @“America/New_York”: #pragma mark - 转换时区 - (NSDate *) convertDate:(NSDate *) ...
- Ingress 原理及实例
什么是Ingress 在Kubernetes中,Service和Pod的IP地址只能在集群内部网络中路由,所有到达“边界路由器”(Edge Router)的网络流量要么被丢弃,要么被转发到别处,从概念 ...
- 设计模式-装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
- Android Studio 1.1.0 “关联源码” 或者“导入源码” ,又或者插件包
其实这博文是废话!为什么呢? 1.如果自己的SDK没有更新相应当前操作版本的source的话,相应的v4,v7等等的源码都不会自动导入的. 其实Android Studio自身就已经会去检测你当前SD ...
- 机器学习算法实现解析——word2vec源代码解析
在阅读本文之前,建议首先阅读"简单易学的机器学习算法--word2vec的算法原理"(眼下还没公布).掌握例如以下的几个概念: 什么是统计语言模型 神经概率语言模型的网络结构 CB ...
- C++11 POD类型
POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与c兼容,可以使用比如memcpy()这类c中最原始函数进行操作.C++11中把POD分为了两个基本概念的集合 ...
- FIDDLER的使用方法及技巧总结(连载二)FIDDLER用户界面
FIDDLER的使用方法及技巧总结 (接上篇内容~~) 二.FIDDLER用户界面 FIDDLER用户的几面主要包括下面几个部分,如图所示:首先FIDDLER窗口的最左边是web session列表, ...