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 + " 上面 ...
随机推荐
- Sublime Text增加Build system类型,打造一个全能IDE
Sublime text2是一款非常方便的文本编辑器,现在我基本上不用IDE去编写代码,一般都是在Sublime text2中编辑,当然,这里无法执行.debug是软肋,于是上网找了下资料,可以把添加 ...
- github 仓库共享上传权限
https://blog.csdn.net/qq_33210042/article/details/79717497 打开仓库 -> Settings -> Collaborators 然 ...
- Processing支持中文显示
Processing 默认不支持中文,中文显示成框框,我使用的版本是:2.2.1,进行如下设置,并且重启processing就可以支持中文了: 可以看到中文了:
- flask中路由的本质源码分析
flask中url的本质: 吧url和视图函数封装到一个Rule对象里面去了,并且吧这个对象添加到url_map中 Rule={"url":'/index','method':'i ...
- mysql把主键定义为自动增长标识符类型
分享下mysql中如何把主键定义为自动增长标识符类型. 1.把主键定义为自动增长标识符类型在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: )); ...
- Xilinx官网查询各个版本软件的手册
在Xilinx官网查询各个版本软件的手册需要点击 See All Versions
- [svc]为何linux ext4文件系统目录默认大小是4k?
linux ext4普通盘为什么目录大小是4k? Why does every directory have a size 4096 bytes (4 K)? To understand this, ...
- HTML5学习笔记(四):H5中表单新增元素及改良
方便布局 表单内容可以放在表单标签之外,这样做的好处是方便设计时不用考虑一定要将表单元素放在指定的form标签之下,只要指定元素适用于哪个表单即可,如下: <form id="test ...
- 重复代码检查工具simian的基本用法
simian是一个检查重复代码的工具,支持通过命令行和UI方式来检查代码,可以检查多种语言(比如C\C++, java, c#等)的代码,常见的编程语言都支持,下面先来看看如何使用命令行来检查c++重 ...
- python(48):re.split 多分隔符
问题描述: 使用多个界定符分割字符串 问题 你需要将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的. 解决方案 string 对象的 split() 方法只适应于非常简单的字符串分 ...