sql注入

有关SQL注入的一些小知识点

倖福魔咒の 提交于 2020-03-03 11:51:51
1.判断注入点: 本质原理是找一个需要后台处理后,提交给数据库的点,我理解为用户可以控制并输入后台数据库的变量,比如我们DVWA SQL injection 的ID ,我们可以通过闭合单引号,#注释掉后面限制语句,16进制转换等方法进行绕过,将我们本应输入的变量变成一条查询语句获取数据库的信息。 一般分为三大类: Get参数触发SQL注入 POST参数触发SQL注入 Cookie触发SQL注入 判断是数字型还是字符型注入方法 数字型注入: 1.修改参数为 id = 1’出错,无法正常从数据库查出数据 2.修改参数为 id = 1 and 1=1 语句执行正常 3.修改参数为 id = 1 and 1=2 出错,无法正常从数据库查出数据 通过上面三次输入 可以判断出是否为数字型注入 (如果有回显页面在第一次输入id=1’报错,报错页面为 '1''之类的多个单引号包含1,可以猜测大概率是字符型注入) 字符型注入: 1.修改参数为:id = 1’报错 2.修改参数为:id = 1' and '1' = '1 正常 3.修改参数为 id = 1' and '1' = '2 报错 这时可以判断为字符型注入,注意字符型注入后面有单引号 可以用#等符号注释掉 常用函数: @@datadir 获取数据库的存储目录 @@version_compile_os 查看服务器的操作系统 user(

mapper.xml文件

送分小仙女□ 提交于 2020-03-03 00:40:34
1. 概述 mybatis的真正强大在于它的映射语句。由于它的异常强大,映射器的XML文件就显得相对简单,如果拿它跟具有相同功能的JDBC代码进行对比,省掉将近95%的代码。mybatis是针对SQL构建的,并且比普通方法做的更好。 SQL映射文件有几个顶级元素(按照它们被定义的顺序): select:查询 cache-ref:其他命名空间缓存配置的引用 resultMap:是最复杂也是最强大的元素,用来描述如果和数据库结果集中加载对象 parameterMap:已经废弃 sql:可被其他语句引用的可重用语句块 insert:插入 update:更新 delete:删除 cache:给定命名空间的缓存配置 2. select 查询语句是mybatis中最常用的元素之一,多数应用也都是查询比修改要频繁。 <select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select> 这个语句被称作selectPerson,接受一个int类型的参数,并返回一个HashMap类型的对象,其中的key是列名,value是结果行中的对应值。 #{id} 这个高速mybatis创建一个预处理语句参数,通过JDBC,这样一个参数在SQL中会由一个

Sql语句防注入

北慕城南 提交于 2020-03-02 23:50:32
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的 SQL Injection ,即 SQL 注入。 SQL 注入是从正常的 WWW 端口访问,而且表面看起来跟一般的 Web 页面访问没什么区别,所以目前市面的防火墙都不会对 SQL 注入发出警报,如果管理员没查看 IIS 日志的习惯,可能被入侵很长时间都不会发觉。 但是, SQL 注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的 SQL 语句,从而成功获取想要的数据,是高手与 “ 菜鸟 ” 的根本区别。 根据国情,国内的网站用 ASP+Access 或 SQLServer 的占 70% 以上, PHP+MySQ 占 L20% ,其他的不足 10% 。在本文,我们从分入门、进阶至高级讲解一下 ASP 注入的方法及技巧, PHP 注入的文章由 NB 联盟的另一位朋友 zwell 撰写,希望对安全工作者和程序员都有用处。了解 ASP 注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗? Let's Go... 入门篇 如果你以前没试过 SQL 注入的话,那么第一步先把 IE 菜单 => 工具 =>Internet 选项 => 高级 => 显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误, IE

关于SQL注入中编码问题的疑问

落花浮王杯 提交于 2020-03-02 19:44:43
提到SQL注入的绕过,编码是其中最普通的一种方法,最常用的URL编码。之前一直有个疑问,编码与未编码到底有哪些地方存在区别? 以下是本人自己对URL编码的一些见解,可能有错误的地方欢迎大佬们指正。 什么是URL编码。 “URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的 name 和其对应的 value ,将他们以 name/value 编码方式作为URL的一部分或者分离的发送到服务器上。” 如何进行URL编码。 “每对name/value由&分开,每对来自表单的name/value用=分开。如果用户没有输入值的那个name依旧会出现不过就是没有值。 URL编码是在字符 ASCII码 的十六进制数的前面加上%。例如\(十六进制数表示为5c)的URL编码就是%5c。” 为什么要用URL编码。 RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。 US-ASCII码中的10-7F字节全都表示控制字符,这些字符都不能直接出现在Url中。同时,对于80-FF字节(ISO-8859-1),由于已经超出了US-ACII定义的字节范围,因此也不可以放在Url中。 Url可以划分成若干个组件,协议、主机、路径等。有一些字符(:/?#[]@)是用作分隔不同组件的。例如:冒号用于分隔协议和主机,

MyBatis 实践 -Mapper与DAO

╄→гoц情女王★ 提交于 2020-03-02 05:14:12
MyBatis 实践 标签: Java与存储 MyBatis简介 MyBatis 前身是 iBatis ,是一个基于Java的 数据持久层/对象关系映射(ORM)框架 . MyBatis是对JDBC的封装,使开发人员只需关注SQL本身,而不需花费过多的精力去处理如 注册驱动 、 设置参数 、 创建 Connection / Statement 、 解析结果集 等JDBC过程性代码.MyBatis基于XML/注解的方式配置 Statement ,执行SQL,并将执行结果映射成Java对象, 大大降低了数据库开发的难度. MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs

根据多年经验整理的《互联网MySQL开发规范》

烂漫一生 提交于 2020-03-01 19:26:39
写在前面:无规矩不成方圆。对于刚加入互联网的朋友们,肯定会接触到 MySQL , MySQL 作为互联网最流行的关系型数据库产品,它有它擅长的地方,也有它不足的短板,针对它的特性,结合互联网大多应用的特点,笔者根据自己多年互联网公司的 MySQL DBA 经验,现总结出互联网 MySQL 的一些开发规范,仅供参考。 一、基础规范 (1) 使用 INNODB 存储引擎 (2) 表字符集使用 UTF8 (3) 所有表都需要添加注释 (4) 单表数据量建议控制在 5000W 以内 (5) 不在数据库中存储图 ⽚ 、文件等大数据 (6) 禁止在线上做数据库压力测试 (7) 禁 ⽌ 从测试、开发环境直连数据库 二、命名规范 (1) 库名表名字段名必须有固定的命名长度, 12 个字符以内 (2) 库名、表名、字段名禁 ⽌ 止超过 32 个字符。须见名之意 (3) 库名、表名、字段名禁 ⽌ 止使 ⽤ 用 MySQL 保留字 (4) 临时库、表名必须以 tmp 为前缀,并以 ⽇ 日期为后缀 (5) 备份库、表必须以 bak 为前缀,并以日期为后缀 三、库、表、字段开发设计规范 (1) 禁 ⽌ 使用分区表 (2) 拆分大字段和访问频率低的字段,分离冷热数据 (3) 用 HASH 进 ⾏ 散表,表名后缀使 ⽤⼗ 进制数,下标从 0 开始 (4) 按日期时间分表需符合 YYYY[MM][DD][HH]

sql中 #{} 和 ${}

懵懂的女人 提交于 2020-03-01 16:21:12
在预编译中的处理是不一样的。#{} 在预处理时,会把参数部分用一个占位符 ? 代替,变成如下的 sql 语句:select * from user where name = ?; 而 ${} 则只是简单的字符串替换,在动态解析阶段,该 sql 语句会被解析成:select * from user where name = 'zhangsan'; 因此,优先使用 #{}。因为 ${} 会导致 sql 注入的问题! 表名、order by的排序字段作为变量时,使用${}。 1、#{} 解析为一个JDBC预编译语句(prepared statement)的参数标记符,把参数部分用占位符?代替。动态解析为: select * from t_user where username = ? ; 而传入的参数将会经过PreparedStatement方法的强制类型检查和安全检查等处理,最后作为一个合法的字符串传入。 2、${} 这种方式只会做简单的字符串替换,在动态SQL解析阶段将会进行变量替换,假如传递的参数为Alice,最终处理结果如下: select * from t_user where username = 'Alice' ; 这样在预编译之前的sql语句已经不包含变量了,因此可以看出${} 变量的替换阶段是在动态SQL解析阶段。 来源: https://www.cnblogs.com

萌新学习sql注入4

自古美人都是妖i 提交于 2020-03-01 10:09:12
宽字节注入 先列举一下基本的url编码 明文 url编码 空格 %20 ’ %27 # %23 \ %5c addslashes函数: addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。 预定义字符是: 单引号(’) 双引号(") 反斜杠(\) NULL 如何从addslashes函数中逃逸出来: 一:在\前面再加一个 \ (或单数个),变成\\’ ,这样\就被转义了,‘逃出了限制 二:把\弄没,在mysql使用GBK编码的时候,会认为两个字符是一个汉字(前面一个ASCII码要大于128,才到达汉字的范围) 汉字为两个字符 \'的编码为%5c%27 我们在 ’ 前加%df后变为%df\’ 即为%df%5c%27,进行GBK解码后为 变为了運’,成功绕过了。 进行实验 实验环境:sqlilabs-less-32 本地搭建的靶机关于宽字节注入的题莫名其妙不能用了,又到虚拟机搭建了sqli-labs,花了一段时间。 哭了 开始进行测试了!!! ? id = 1 % 27 -- + 发现是用了addslashes() 函数,使用%df试试 ? id = 1 % df % 27 -- + 说明是GBK编码,可以注入了。 ? id = - 1 % df % 27 union select 1 , 2 , 3 -- + 用union联合注入即可,后面有一点要注意

Google 搜索引擎语法

流过昼夜 提交于 2020-02-29 18:34:29
SQL注入详解 转发自 飞天小子 如有侵权请联系删除 1:什么是SQL注入 SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。 www.xx.com/news.php?id=1 www.xx.com/news.php?id=1 and 1=1 这里我们来理解一下SQL注入 首先,SQL注入常年蝉联OWASP排行榜第一名~ SQL注入产生的过程是怎样的呢?见下图 SQL注入的危害有哪些呢?   数据库信息泄露   网页篡改   网站被挂马   数据库被恶意操作   服务器被远程控制   破坏硬盘数据。。。。 2 我们来学习一下sql注入的方法 2.1取消友好HTTP错误消息 一般通过远程测试判断是否存在SQL注入,所以通常没有机会通过查看源代码来复查注入的查询结构。这导致经常需要通过推理来进行大量测试   打开IE浏览器,选择菜单“工具”->“Internet选项”对话框。   打开“高级”选项卡,在设置列表中找到“浏览”组,   取消勾选”显示友好HTTP错误信息”复选框 。如下图 2.2寻找SQL注入 最常用的SQL注入判断方法,在网站中寻找如下形式的网页   www.chinaliancheng.com/*.asp?id=1    www.chinaliancheng.com/*.aspx?id=1

存储过程中执行动态sql语句

一曲冷凌霜 提交于 2020-02-29 15:06:50
存储过程中执行动态sql语句 MSSQL提供了两种方式:exec和sp_executesql 通常后者更有优势,提供了输入输出接口,而exec没有 sp_executesql的最大优点是能够重用执行计划,大大提高了执行性能,所以尽量使用sp_executesql,它也更灵活 1 exec的使用 exec有两种用法:执行一个存储过程,另一种是执行一个动态的批处理 EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,例如: XEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+           QUOTENAME(@TableName) +' ORDER BY ORDERID DESC'); 这样编译器会报错,编译不通过 但可以这样:EXEC(@sql+@sql2+@sql3);编译就会通过 最好的办法就是把代码构造到一个变量中,然后再把该变量作为exec命名的输入参数 exec的缺点是不能执行一个包含一个带有变量的批处理 例如: DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT; SET @TableName = 'Orders'; SET @OrderID = 10251; SET @sql = 'SELECT * FROM