SQL注入:联合查询的三个绕过技巧

20 篇文章 0 订阅
15 篇文章 0 订阅

 SQL注入系列文章:

初识SQL注入-CSDN博客

目录

技巧1:利用科学计数法注入

技巧2:information_schema数据库被过滤的注入

技巧3:无列名注入

利用 join-using 注列名绕过

利用子查询绕过

当反引号被禁用时,就可以使用起别名的方法来代替


上一篇和大家分享了SQL注入的基础知识和手工注入,自动注入的注入流程,对SQL注入有了基本的了解,在本篇中将会和大家通过复习+练习的方式来一起看一下SQL注入中联合查询的三个技巧,这些也都是周老师课中讲的,我将会在本篇中进行演示三个技巧的使用场景和方法,那么现在就开始啦ヾ(◍°∇°◍)ノ゙

技巧1:利用科学计数法注入

事情的开始还是从一个正则表达式的WAF开始的

当sqli-labs的第一关的后端页面使用下面这样一个正则表达式进行防御后,我们应该怎么应对呢?

if(preg_match('/SELECT\b[\s\S]*\bFROM/is', $id)) 
{    
    die('SQL Injection');
}

 可以看到这里对我们输入的select 和 from中间增加了一个正则表达式的匹配,如果匹配上了,则就会输出 SQL Injection

可以尝试查询一下:

可以看到结果是SQL Injection

可以将它放到exrepo - 搜索 (regex101.com)中分析一下:

可以看到想要使用concat来进行查询数据库中的数据,但是被正则表达式匹配上了,无法查询到

现在就需要绕过这个正则表达式才能查询到数据

那么首先就要想办法怎么才能不被该正则表达式匹配上,这里再regex101网站反复的测试后,我发现了只要让select,或者,from字符串不完整了,给它的前后加字符就会逃出正则表达式的匹配

但是还有一个问题就是不管是给select还是from 关键字前后加字符后就语法就会报错,就没有办法查询出数据库中的数据了,因此现在我们要找到一个不影响SELECT 和 from 本身含义,且又不能是select 或者 from的办法,这里龙哥想出了一个好办法,使用科学技术法的方法,给from的前面加上一个科学计数法的值则可以绕过该正则表达式

啥,科学计数法,很多小伙伴和我一样,听到了科学计数法和注入挂钩了,他们两个到底有什么关系呢?

那么我们不妨在网上搜下看mysql是否支持科学计数法

可以看到mysql是支持科学计数法的

那么我们先来在本地的mysql中试试,看是否可以

可以看到在from前面加了一个1e1进行查询的时候居然报错了

可以在前面再加一个,来解决这个问题:
 可以看到这样就查询成功了,那么看看这样是否会被正则表达式匹配到:

从结果可以看到,这样确实逃出了正则表达式的限制

那么最后我们在有正则表达式限制的第一关来尝试注入一下:

payload:

-1' union select 1,concat(username,0x3a,password),3 ,1e1from users --+

可以看到这里却说我们的列数不同,这里是因为1e1是独占一列的,因此我们需要将第3列去掉,再来试试看:

payload:

-1' union select 1,concat(username,0x3a,password)  ,1e1from users --+

可以看到这样就巧妙的利用科学计数法绕过了该正则表达式的限制

技巧2:information_schema数据库被过滤的注入

第二个技巧的原因就是我们所利用的information数据库被过滤了,相信看过前面一篇文章的小伙伴都知道,上一篇我就是是通过该数据库来注入出表名,列名的,如果该数据库被过滤掉了,那么应该从何处入手呢?

比如说后端页面增加了下面的限制:

if(preg_match('/information/is', $id)) {
    die('SQL Injection');
}

infromation数据库被过滤了,如果我们输入中存在infromation就会被判定为SQL注入,例如:
这里的解决办法其实很简单,那就是不使用inforamtion数据库就可以了,那么到底有那些数据库中还存储着其他 数据库中的各种信息呢?

在 Mysql 5.7 版本中新增了 sys.schema , 基础数据 来自于 performance_schema和information_sche两个库中,其本身并不存储数据。

查询表的统计信息,其中还包括Innodb缓冲池统计信息,默认情况下按照增删改查操作的总表I/O延迟时间(执行时间)降序排序

sys.x$schema_table_statistics_with_buffer

sys.x$schema_table_statistics

sys.x$ps_schema_table_statistics_io

那么来看看这些表都有哪些字段:

可以看到每个表中都有看起来存储数据库和表的字段 

但是 需要注意的是这几个表有点局限 需要root 才能访问。

类似的,可以利用的表还有 :

mysql.innodb_table_stats、mysql.innodb_table_index同样存放有库名表名

总结一下,一下数据库或者表均可以代替 information_schema数据库:

sys.schema_auto_increment_columns

sys.schema_table_statistics_with_buffer

mysql.innodb_table_stats

mysql.innodb_table_index

这里可以使用mysql.innodb_table_stats数据库为例来查询一下security数据库中的表:

那么我们再到inforamtion数据库被过滤的第一关尝试进行注入:

id=-1' union select 1,group_concat(table_name),3 from mysql.innodb_table_stats where database_name="security" --+

可以看到成功注入出了security数据库中的所有的表名

但是上面的数据库中最多都只能查找到表名,并没有列名,因此第三个技巧就是需要进行无列名注入的技巧。 

技巧3:无列名注入

利用 join-using 注列名绕过

相信熟悉mysql数据库的小伙伴一定知道join的作用,通过join 可建立两表之间的内连接,在实际应用中经常会用到join连接

我们就可以使用join来解决上面那些数据库注入出了表名但是没有列名的问题

比如可以使用下面的这种方法来获取第一列的字段名及后面每一列字段名

?id=-1' union select*from (select * from users as a join users as b)as c--+

 这里利用的原理就是将两张相同的表连接,将连接的结果给c,查c,数据库就会报错,说我们的id字段重复了,这样我们就知道了id这个字段,如果想要查询别的值可以使用using来去掉我们已知大id,就可以查到除了id以外的值

?id=-1' union select*from (select * from users as a join users b using(id,username))c--+

依次类推,就可以查出所有的字段名,直到完成

?id=-1' union select*from (select * from users as a join users b using(id,username,password))c--+

注:数据库中as作用是起别名,as是可以省略的,为了增加可读性,建议不省略。

利用子查询绕过

正常的查询:

select 1,2,3 union select * from users; 无列名注入关键 就是要猜测表里有多少个列,要一一对应上,上面例子是有3个列 1,2,3的作用就是对列起别名,替换为后面无列名注入做准备

这里我们就将列名重命名为了1,2,3,这样我们就不需要知道列名是什么就可以查询出指定例的值

例如:要查询第二列的值,可以使用下面的语句

 select `2` from (select 1,2,3 union select * from users)as a;

这里我们是在前面使用的``来查询的 

当反引号被禁用时,就可以使用起别名的方法来代替

还是查询第二列的值,这里使用起别名的方式

 select b from (select 1,2 as b,3  union select * from users)as a;

可以看到这里也可以达到同样的效果

到此,SQL注入联合查询的三个绕过技巧就介绍完毕了,后面还会和大家分享更多的关于SQL注入的技巧和实验(^▽^)

  • 57
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
SQL注入的原理 什么SQL注入SQL代码插入到应用程序的输入参数中,之后,SQL代码被传递到数据库执行。从而达到对应用程序的攻击目的。 注入原理 常见攻击方法 检测是否可以注入【检测注入点】 示例:http://192.168.0.1/temp.aspx?id=a or 1=1-- 如果上面语句可以执行说明可以实现注入,则可以 利用系统过程、系统表注入数据库 示例【给系统添加一个用户,黑客可以实现远程登录控制服务器】:http://192.168.0.1/temp.aspx?id=1;exec xp_cmdshell 'net user admin 123456 /add' 绕过程序的限制 示例:程序中往往限制单引号的数据,但是黑客传入单引号的ASCII码 跨站点注入Web页面挂某些恶意的HTML、JavaScript代码 防范SQL注入 限制错误信息的输出,避免错误信息的输出使得黑客知道网站的技术实现采用什么数据库,采用什么平台 示例:在Web.config文件中设置 限制访问数据库账号的权限 在开发应用系统的时候就应该限制,给程序最小访问数据库的权限 使用参数命令传递参数 不要使用拼接字符串的方式构造SQL语句而采用参数命令 使用存储过程 存储过程在数据库中 只能执行存储过程中固定的代码 限制输入长度 防止黑客输入超大字符串,导致服务器瘫痪 防止黑客输入较长的恶意脚本等 实现方法:文本框的MaxLength属性 URL重写技术 示例: http://testWeb/news.aspx?id=111 重写成:http://testWeb/10101111.html 传递参数尽量不用字符串 http://testWeb/news.aspx?id=111 and 1=1【黑色部分给了SQL注入的机会】 SQL优化 为什么要优化 开发是对性能考虑不多【技术差、项目工期紧等原因没有考虑性能问题】 系统运行中,数据量扩大,访问量增多,蹩脚的SQL危害开始显露 低效SQL的危害 系统响应变慢,软件开发中的8秒定律,当打开一个软件或网页超过8秒时间还没有显示,则响应太慢。 死锁,当不同用户都访问某些资源的时候SQL语句不当导致死锁 客户失去信心,软件失败 低效SQL低效在哪里?  性能低下的根源  硬件原因,数据库的配置不合理,数据库的数据文件和日志文件没有分磁盘存放,会极大影响IO性能  没有建立索引,或者SQL没有走索引。在千万级数据的表上建索引是很有必要的。  SQL过于复杂,过长的SQL语句满足程序需求但是影响性能。子查询嵌套过多对性能有影响,查询关联的表特别多也影响性能  频繁访问数据等等 SQL如何被SQLServer执行的 SQL执行原理  解释:首先解释SQL语句【语法是否正确】  解析:检验语句的出现的对象是否有效【进行一个解析,要检查对象所有权的权限】  优化:【检查SQL语句是否能够使用索引,SQL语句如何执行效率高,制定一个执行计划】  编译:  执行SQL语句:【把编译过的查询要求提交并进行处理】 如何优化SQL 完善开发的管理 完善代码审核、测试机制,软件开发是艺术! 检测SQL查询的效率 语法【对IO和Time对SQL执行进行统计】: SET STATISTICS IO ON SET STATISTICS TIME ON ------------SQL代码--------- SET STATISTICS IO OFF SET STATISTICS TIME OFF 注意:在检测之前要清理缓存,因为当我们执行SQL语句的时候查出的数据会在数据库中进行缓存,重新查询会返回缓存中的信息。 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE 经验:使用子查询嵌套不要过多,尽量使用表连接查询代替子查询,因为表连接查询效率稍高一点。 SQL优化工具 使用报表服务 通过Reporting Service查找低效SQL 选择 性能 - 批处理执行统计信息和性能相关的几个报表服务: 性能 - 对象执行统计信息 性能 - 按平均CPU时间排在前面的查询 性能 - 按平均IO次数排在前面的查询 性能 - 按总CPU时间排在前面的查询 性能 - 按IO总次数排在前面的查询 操作示范: 1. 数据引擎上点击右键—报表—标准报表—关心的
1。支持数据库注入方法:   MSSQL 2000 / 2005错误   MSSQL 2000 / 2005无错误联盟总部   MSSQL盲   MSSQL时基   基于MySQL的联盟   MySQL盲   基于MySQL的错误   MySQL的时间   基于Oracle的联盟   基于Oracle错误   Oracle盲   基于PostgreSQL的联盟   基于MS访问联盟   MS Access盲   Sybase(ASE)   Sybase(ASE)Blind   2。HTTPS支持   三.多线程   4。代理支持   5。自动信息服务器检测   6。自动参数类型检测(字符串或整数)   7。自动关键词检测(发现正面和负面的反应之间的区别)   8。自动扫描所有参数。   9。尝试完全不同的注射方法   10。替代房屋的选择,…针对IDS或过滤器   11。避免开发字符串(绕过magic_quotes和类似的过滤器)   12。手动注入语法支持   13。手动查询结果   14。强迫法外联盟   15。随机信号发生器   16。完全可定制的协议头(如参考,用户代理…)   17。从网站加载Cookie(s)进行身份验证   18。加载HTML类型的输入   19。协议基本和摘要认证   20。注入统一资源定位器重写页面   21。绕过防火墙和类似防火墙ModSecurity的互联网应用   22。绕过webknight互联网应用防火墙和类似防火墙   23。即时结果 软件特色   Havij这个注入工具大家应该多蛮清楚的吧,大牛小牛应该多有玩过。   算是比较著名也比较好用的SQL注入工具了。用的人也很多,它经常更新。   正版是要钱的。要感谢国内的破解大牛Hmily。每次多是它破解的最好用了。   这次这个也是它破解的。虽然网上有好几个版本。这个是免安装。注册一下控件就行了
MyBatis是一个优秀的持久层框架,它提供了很多防止SQL注入的机制,但是还是存在某些情况下可能出现SQL注入的问题。下面我将介绍MyBatis中存在的三种SQL注入方式及相应的防范措施。 1. 字符串拼接注入方式: 在拼接SQL语句时,如果直接使用字符串拼接的方式,可能导致用户的输入被误认为是SQL语句的一部分。为了避免这个问题,我们应该使用参数化查询或者使用预编译语句。参数化查询使用占位符来代替用户输入,然后将用户输入作为参数传递给SQL语句。而预编译语句则是将SQL语句预先编译好,再根据用户的输入来填充相关信息。 2. SQL关键字注入方式: 攻击者可能通过输入SQL关键字来改变原本的SQL语句逻辑,例如输入WHERE 1=1来绕过原本的条件过滤。为了防止这种情况,我们可以使用白名单机制,对用户输入进行严格检查,只允许合法的输入。 3. SQL注释注入方式: 攻击者可能通过注释的方式绕过字符串过滤,例如输入' or '1'='1来改变SQL语句的逻辑。为了防范这种注入方式,我们可以使用过滤器来对用户输入进行过滤,将可能存在的注释进行处理。 综上所述,虽然MyBatis有一些内置的机制来防止SQL注入,但是我们仍然需要在代码中加入一些额外的防范措施,以增加系统的安全性。同时,我们也应该对用户的输入进行充分的验证和过滤,以减少潜在的安全风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未知百分百

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值