0.前言

  上一篇我们介绍了SQL手工注入的流程以及步骤,但在实际的安全问题以及CTF题目中,查询语句多种多样,而且是肯定会对用户的输入进行一个安全过滤的,而这些过滤并不一定是百分百安全的,如何利用一些技巧绕过一些安全过滤,这就是我们这一篇要介绍的事情。

  如果你还不熟悉SQL注入的流程以及步骤,请先阅读我的上一篇博文。

  文中有误之处,还请各位师傅指出。

1.各种select语句绕过

 (1)select xxx from xxx limit $num;

  上篇我们讲解了where条件查询的注入方法,那么如果不是where而是其他语句呢,例如limit限制,这可能会出现在限制每页展示多少行中用到,例如对于如下语句

  select * from student limit $num;

  $num是我们上传的变量,假如我们依然使用order进行查列数将于返回如下结果

  Mysql会提示语法错误,因为排序需要在分页的前面使用,那么这个时候我们该如何查列数呢,答案是上次提到的利用into @,@,@,@就是‘@’字符,它代表Mysql的一个临时变量。

  例如  

  必须保证变量数等于列数,利用这个特性我们就可以查出列数。

(2)updata,insert,delete相关

  和select类似,还是先找到参数的位置,再判断注入类型,最后构造表达式进行SQL注入。

(3)order by注入

  前面已经讲了利用order by查列数,实际上order by可以通过位运算来执行表达式

select * from student order by 1|(sleep(5));

2.时间函数进行盲注

  有些时候当网页没有错误回显时,可以考虑使用时间函数进行盲注。原理是利用条件判断进行睡眠,我们只需要观察响应时间即可。

  例如

select * from student where id=1 and if(user()='root@localhost',sleep(5),null);#判断用户

select * from student where id=1 and if(substr(user(),1,1)='r',sleep(5),null);#逐字判断

  我们可以先用一个永真条件判断sleep()是否可用,当sleep()被禁用的时候,我们可以用下面其他几种延时方法代替。

 (1)延时方法

  • sleep()函数。
  • benchmark(count,expr),重复expr函数count次,我们可以利用一些MySql自带的加密函数作为expr执行多次达到睡眠的效果。具体执行次数可以根据CPU来进行变动。
select * from student where id=1 and if(true,benchmark(10000000,sha(1)),null);
  • 笛卡尔积,利用计算笛卡尔积达到延时;
select count(*) from information_schema.columns A,information_schema.columns B;#count(*)返回行数
  • get_lock(str,timeout),这个需要开启两次会话,第一次给str进行上锁,第二次再执行就会等待timeout的时间,若timeout为负,则无限等待。get_lock()只会在执行release_lock()或隐式的会话中止时显式释放锁,事务提交或回滚不会释放锁。
  • length(str),利用rpad构造长字符串,再用length返回一列。
select LENGTH(concat(rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a')));
  • rlike,regexp,先利用rpad或者式repeat构造长字符串再利用rlike正则匹配返回一列,通过控制构造的字符串长度控制时间。
select concat(rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a'),rpad(1,9999999,'a')) rlike '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)';

  p.s.构造字符串长度不能超出MySql内存限制,否则会报错。

 (2)条件判断

  • if(expr,expr1,expr2).
  • case when xx then xx;利用case when语法达到判断条件的方法。

 (3)字符串截取

  • substr(str,pos,len),同Python的substr()函数,但MySql中首位置为1或-len。
  • mid(str,pos,len),基本同上
  • substring_index(str,delim,count),返回第count个delim串左边的所有内容
select substring_index('a.b.c.d','.',3);#返回a.b.c
  • left(str,len),返回str左边len个字符。
  • right(str,len),返回str右边len个字符。

  本质上时间盲注就是bool盲注的一种,利用回显消息不同,只是这里的回显没有显式显示在屏幕上罢了。

3.bool盲注

  利用回显的不同来猜测数据库的信息,例如order by就是一种bool盲注,一般可以利用二分或者逐位拆解的方式进行盲注。可以利用一些位运算的短路机制进行连接表达式。

4.多行注入

  当调用数据库函数支持多行sql语句才能使用,原理就是利用';'结束语句插入自己的sql语句。

5.MySql编码注入

(1)弱类型转换

  先来看这样一个查询语句select * from student where name=1;

  

  为什么可以被查询呢,因为name会被转换成数字和1比较,而MySql的默认转换和php的转换类似,找到第一个不为数字的字符就结束。利用这个特性我们可以进行一些查询判断。

(2)宽字节注入

  当当前数据库使用了GBK编码的时候,会把两个字符转化为汉字(前一个字符大于128),利用这个特性再配合后端的过滤实现注入。

  例如当后端过滤'将其变成\'的时候,如果式gbk编码,则传入的就是%5C%27,这时候我们提交%df'则会被编码成%df%5C%27,而前面的%df%5c则会被编码成中文,达到了注入效果。

(3)SQL字符集特性

  对于utf8_unicode_ci字符集,不区分大小写,而且Ä=A,Ö=O,Ü=U等条件都成立,且ß=ss,

  对于utf8_general_ci字符集,ß=s。

  更多条件等式可以自行测试。

(4)进制转换

  如果表名和列名过滤了字符可以将其转换为16进制实现,前面带上0x

6.总结

  本篇博文就是在上一篇的基础上讲解了一些其他的注入方法,已经引入了很多MySql函数。到现在 对Mysql的知识已经讲完了,下一篇我们将会着重讲解如何绕过后端对传输参数的一些过滤绕过。

  如果还有什么补充的地方,请各位师傅在评论区留言。

SQL手工注入进阶篇的更多相关文章

  1. MySQL手工注入进阶篇——突破过滤危险字符问题

    当我们在进行手工注入时,有时候会发现咱们构造的危险字符被过滤了,接下来,我就教大家如何解决这个问题.下面是我的实战过程.这里使用的是墨者学院的在线靶场.咱们直接开始. 第一步,判断注入点. 通过测试发 ...

  2. SQL手工注入基础篇

    0.前言 本篇博文是对SQL手工注入进行基础知识的讲解,更多进阶知识请参考进阶篇(咕咕),文中有误之处,还请各位师傅指出来.学习本篇之前,请先确保以及掌握了以下知识: 基本的SQL语句 HTTP的GE ...

  3. 【新手篇】搭建DCN漏洞靶机及简单的SQL手工注入

    很多新手小白入门后发现想要学好“网安”技术,除了掌握基础理论知识,更需要经常模拟不同的漏洞环境,但是如果使用外网服务器练习,会存在一定风险,因此能够搭建一个本地的模拟环境去测试漏洞将是一个不错的方案. ...

  4. Kali学习笔记42:SQL手工注入(4)

    前三篇文章都是在讲发现SQL注入漏洞 如何查询得到所有的信息 那么另一条思路还未尝试过:能否修改数据? 例如这样: '; update users set user='yiqing' where us ...

  5. 小白日记41:kali渗透测试之Web渗透-SQL手工注入(三)-猜测列名、表名、库名、字段内容,数据库写入

    SQL手工注入 靶机:metasploitable(低)  1.当无权读取infomation_schema库[MySQL最重要的源数据库,必须有root权限]/拒绝union.order by语句 ...

  6. 小白日记40:kali渗透测试之Web渗透-SQL手工注入(二)-读取文件、写入文件、反弹shell

    SQL手工注入 1.读取文件[load_file函数] ' union  SELECT null,load_file('/etc/passwd')--+ burpsuite 2.写入文件 ' unio ...

  7. 小白日记39:kali渗透测试之Web渗透-SQL手工注入(一)-检测方法

    SQL手工注入(一) SQL注入:通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.[SQL注入原理] ##服务端程序将用户输入参数作为查询 ...

  8. (后端)sql手工注入语句&SQL手工注入大全(转)

    转自脚本之家: 看看下面的1.判断是否有注入;and 1=1;and 1=2 2.初步判断是否是mssql;and user>0 3.判断数据库系统;and (select count(*) f ...

  9. python辅助sql手工注入猜解数据库案例分析

    发现存在sql注入漏洞 简单一点可以直接用sqlmap工具暴库 但是如果想深入理解sql注入的原理,可以尝试手工注入,配合python脚本实现手工猜解数据库 首先hachbar开启 获取cms登录后的 ...

随机推荐

  1. 如何使用WorkManager执行后台任务(下)

    0x00 WorkManager的高级用法 在上一文中已经了解到 WorkManager的基本用法之后,今天来看看它的一些高级用法: 链式任务调用 唯一任务序列 传递参数和获取返回值 0x01 链式任 ...

  2. Mac查看及清理QQ、微信之前下载的图片、视频或DB等

    之前写过一篇清理Mac空间的文章: Mac系统清理.占用空间大.空间不够.查看系统文件大小分布 其实这篇文章不是太全,有些资源还是清理不彻底,正好前段时间需要找微信下载的资源,其实可以算作空间清理的续 ...

  3. 多线程与高并发(五) Lock

    之前学习了如何使用synchronized关键字来实现同步访问,Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功 ...

  4. 2018年蓝桥杯b组国赛真题

    1.标题:换零钞x星球的钞票的面额只有:100元,5元,2元,1元,共4种.小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱.小明有点强迫症,他坚持要求200元换出 ...

  5. c语言的输出

    Cpp是c plus plus Cpp c++的源文件 c++支持c语言的语法 %x是十六进制x后面输出小写%X输出的结果是大写. %o是八进制. %lf是双精度double,默认小数点后六位,输出最 ...

  6. SpringBoot与Shiro整合权限管理实战

    SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...

  7. tesseract4.0:win10 +x64+vs2015 源码安装(ViewerDebugging)安装记录

    参考文章: https://blog.csdn.net/u013985291/article/details/78295789 https://blog.csdn.net/u013985291/art ...

  8. MongoDB 数据库的学习与使用

    MongoDB 数据库 一.MongoDB 简介(了解) ​ MongoDB 数据库是一种 NOSQL 数据库,NOSQL 数据库不是这几年才有的,从数据库的初期发展就以及存在了 NOSQL 数据库. ...

  9. 开发APP必须知道的API集合,来源http://www.cnblogs.com/wikiki/p/7232388.html

    笔记 OneNote - OneNote支持获取,复制,创建,更新,导入与导出笔记,支持为笔记添加多媒体内容,管理权限等.提供SDK和Demo. 为知笔记 - 为知笔记Windows客户端开放了大量的 ...

  10. HelloDjango 第 13 篇:分类、归档和标签页

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 侧边栏已经正确地显示了最新文章列表.归档.分类.标签等信息.现在来完善归档.分类和标签 ...