sql注入攻击

MyBatis中 #{} 与 ${} 的区别

隐身守侯 提交于 2019-12-10 08:32:24
#{} 在一定程度上防止了SQL注入 使用#{}入参,MyBatis会生成PrepareStatement并且可以安全地设置参数(=?)的值。因为sql语句已经预编译好了,传入参数的时候,不会重新生产sql语句。安全性高。 JDBC中PreparedStatement是我们很熟悉的Statement的子类,它的对象包含了编译好的SQL语句。这种“准备好”的方式不仅能提高安全性,而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需再编译。 //PreparedStatement预编译 Connection conn = getConn ( ) ; //获得连接 String sql = "select username, password from user where username=? and password=?" ; //执行sql前会预编译号该条语句 PreparedStatement pstmt = conn . prepareStatement ( sql ) ; pstmt . setString ( 1 , "username" ) ; pstmt . setString ( 2 , "password" ) ; ResultSet rs = pstmt . executeUpdate ( ) ; #将传入的数据都当成一个字符串

MyBatis框架下防止SQL注入

与世无争的帅哥 提交于 2019-12-08 07:04:14
与传统的 ORM 框架不同,MyBatis使用XML描述符将对象映射到SQL语句或者存储过程中,这种机制可以让我们更大的灵活度通过SQL来操作数据库对象,因此,我们必须小心这种便利下SQL注入的可能性。 安全用法 <select id="getPerson" parameterType="int" resultType="org.application.vo.Person"> SELECT * FROM PERSON WHERE ID = #{id} </select> 这是我们推荐的一种用法,注意参数符号 #{id} ,使用 #{} 语法,MyBatis会通过预编译机制生成 PreparedStatement 参数,然后在安全的给参数进行赋值操作,因此就避免了SQL注入: /* Comparable JDBC code */ String selectPerson = "SELECT * FROM PERSON WHERE ID = ?"; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1, id); 更多安全用法示例: <insert id="insertPerson" parameterType="org.application.vo.Person"> insert into

SQL注入语句

折月煮酒 提交于 2019-12-07 00:47:27
一、SQL注入语句 账号:Admin 密码:123456 登录验证语句为select * from 表名 where UserName = '用户名' and UserPassword = '用户密码";的系统可通过以下注入方式可能可绕过密码登录进入系统。 1、 Admin' or '1'='1 123(任意密码) 注释:形成一个恒为真的条件,是SQL查询判断失败 2、 Admin';# 123 注释:#注释点后续语句(#注释失败请尝试--作为注释) 3、 1' or '1'='1 123(任意密码) 注释:该方式登录成功的原因还没弄清楚,大神请告知 二、SQL注入防御 1、查询出来的结果再和用户名密码比较如果一致则是正常登陆,不一致认为是攻击 2、通过正则表达式进行匹配用户名是否合法 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 其中最后一个“_”处可添加其他的字符表示允许通过的字符。 来源: CSDN 作者: 开发农民 链接: https://blog.csdn.net/xyb_l_code/article/details/81208826

关于sql注入之cookie注入

≡放荡痞女 提交于 2019-12-07 00:46:58
INFO:sql注入我想很多人都接触过,大多数都是接触得get 和post注入的形式,你或是用手工,或是用工具,cookie注入也是一样,今天就给大家讲一讲cookie如何注入,考虑到大家的实际情况,这里就不通过手工来进行,我们就借助一些工具来完成。(大牛看到请不要打我~~) 小知识:所谓SQL注入,就是通过把SQL命令插入到Web 表单 提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到 SQL注入式攻击 ,当然现在的网站已经很少有sql注入(get,post,cookie)了,但是有些网站还是存在这样的问题,比如说经常用别人模板的人,有些模板下面的文件目录下包含了当前网站的一些信息,你不及时发现就会给攻击者可乘之机,php网站的建设者一定要注意模板使用方面的问题。 百度百科:Cookie是由 服务器端 生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的 文本文件 内

sql注入问题

泪湿孤枕 提交于 2019-12-06 09:36:41
SQL注入问题想必大家都会有所听闻,因为也许大家都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。 SQL注入的发生,通常是恶意用户通过在表单中填写包含SQL关键字的数据,来使数据库执行非常规逻辑的过程。简单来说,就是数据库越界做了超出代码控制范围的事情。这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。 SQL注入的场景还原 假设有一个用户表users,往用户表中插入一条数据的语句是: insert into users(name) values('yanggb'); 其中的name字段来源于表单页面中的input,这时有一个不怀好意的用户填写的name字段为【'yanggb');drop table users;--】,那么这时候上面的语句就变成: insert into users(name) values('yanggb');drop table users;--); 一整行可能有点看不清楚,我们来格式化看一下: insert into

SQL注入之Union注入攻击

被刻印的时光 ゝ 提交于 2019-12-06 04:48:40
union联合查询算是最简单的一种注入了,但是却是经常遇到。 什么是UNION注入 UNION操作符用于合并两个或多个SELECT语句的结果集,而且UNION内部的SELECT语句必须拥有相同数量的列,列也必须拥有相似的数据类型,同时,每条SELCCT语句中的列的顺序必须相同。 UNION注入的应用场景 1.只有最后一个SELECT子句允许有ORDER BY或LIMIT。 2.注入点页面有回显。 UNION注入的流程 1.首先判断是否存在注入点及注入的类型。 2.观察回显的位置。 3.使用ORDER BY 查询列数。 4.获取数据库名。 5.获取数据库中的所有表名。 6.获取数据库的表中的所有字段名 7.获取字段中的数据 这是一个联合注入查询的ctf,可以参考一下(https://www.cnblogs.com/lzlzzzzzz/p/11681309.html) 来源: https://www.cnblogs.com/lzlzzzzzz/p/11962661.html

SQL笔记

我们两清 提交于 2019-12-05 15:37:16
目录 1.常用的代码中的sql查询方式 2.union注入 3.盲注(布尔,延时) 3.1常用函数 3.2盲注语句 4.报错盲注 4.1函数 4.2注入语句 5.mysql读写文件的两个函数 5.1 load_file() 5.2 outfile 6.sql注入的时候编码问题 7.update 注入 8.insert注入 9.sql语句的执行逻辑 10.过滤函数 11.过滤 #,-- 12.约束攻击 13.宽字节注入 14.order by 注入 1.常用的代码中的sql查询方式 //单引号保护 ?id=1' and 1=1--+ $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; //没有保护,一般查询纯数字类型的数据 ?id=1 and 1=1--+ $sql="SELECT * FROM users WHERE id= $id LIMIT 0,1"; //单引号与小括号保护 ?id=1') and 1=1--+ $sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1"; //双引号与小括号保护 ?id=1") and 1=1--+ $sql="SELECT * FROM users WHERE id=("$id") LIMIT 0,1"; //双引号保护 ?id=1"

mybatis的基本使用

我的未来我决定 提交于 2019-12-05 00:28:37
第一部分 基本概念 1.1 什么是MyBatis   MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 1.2 经典配置 从 XML 中构建 SqlSessionFactory   每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。 而 SqlSessionFactory 本 身 是 由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory。但是当Mybatis与一些依赖注入框架(如Spring或者Guice)同时使用时,SqlSessions将被依赖注入框架所创建,所以你不需要使用SqlSessionFactoryBuilder或者SqlSessionFactory   从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。MyBatis 包含一个名叫 Resources 的工具类

SQL注入:盲注

会有一股神秘感。 提交于 2019-12-04 21:12:51
盲注简介 所谓的盲注就是在服务器没有错误回显的时候完成的注入攻击。 服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”。 盲注分类 1.布尔盲注 布尔很明显Ture和Fales,也就是说它只会根据你的注入信息返回True和Fales,也就没有了之前的报错信息。 2.时间盲注 界面返回值只有一种,True。无论输入和值,返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。 盲注需要掌握的函数 length() 函数 返回字符串的长度 substr() 截取字符串 (语法:SUBSTR(str,pos,len);) ascii() 返回字符的ascii码 [将字符变为数字wei] sleep() 将程序挂起一段时间n为n秒 if(expr1,expr2,expr3) 判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句 注入步骤 1.猜解数据库名称长度 id=1'and(length(database()))>n 2.猜解数库名称 and (ascii(substr(database(),1,1)))=115--+ 返回正常,说明数据库名称第一位是s 3.猜表名 and (ascii(substr((select table_name from information_schema.tables where

SQL注入和XSS攻击

故事扮演 提交于 2019-12-04 19:07:26
SQL 注入 定义: 黑客通过在请求的数据中填入特殊字符, 影响服务器数据库操作程序正常执行 , 从而达到攻击的目的。 形式: 拼接SQL: 登录验证: 前台输入 username:yan password:123’ or 1# SQL 语句 :select * from user where username=’$username’ and password=’$password’ 拼接后:select * from user where username=’yan ’ and password=’123’ or 1#’==> 防范: 加密( 存密文 , 验证时穿密文 ) 123’ or ‘1-->0casdfh23uah15fjkj18ap 缺点: 不可能对所有数据加密 , 除密码外其他字段也可以做手脚比如 yan’ or 1#=>’yan’ or 1#’( 注释掉后面所有条件 ) 转义特殊字符 上述操作本质是利用了特殊字符’ 只需转义数据里的特殊字符就可以防范此类攻 击了。 123’ or 1#==>123\’ or 1 select * from user where username=’yan ’ and password=’123\’ or 1#’ //SQL 报错 数字注入 用户id 为 1 的用户点击删除 Delete from user where id =1