学习Web安全好几年了,接触最多的是Sql注入,一直最不熟悉的也是Sql注入。OWASP中,Sql注入危害绝对是Top1。花了一点时间研究了下Mysql类型的注入。

    文章中的tips将会持续更新,先说说这些天研究的

    这里博主以数字类型注入类型进行讲解,字符类型同理,这里不在敖述。

    我们的环境:phpstudy+mysql+php

      我们的测试代码如下:

          

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
$id= $_GET['id'];//接受get传递的参数名x的值并赋值给变量id
$conn = mysql_connect('127.0.0.1','root','root');//连接mysql数据库
mysql_select_db('shop',$conn);//选择$conn连接请求下的test数据库名
$sql = "select * from product where pid=$id";//定义sql语句并组合变量id
$result = mysql_query($sql);//执行sql语句并返回给变量result
while($row = mysql_fetch_array($result)){//遍历数组数据并显示
echo "ID:".$row['pid']."</br>";
echo "pname:".$row['pname']."</br>";
echo "info:".$row['pdesc']."</br>";
}
mysql_close($conn);//关闭数据库连接
echo "<hr>";
echo "Sql=";
echo $sql;
?>

    这里sql语句直接代入查询,没有进行过滤,所以存在sql注入。

    Sql注入的测试过程我是这样理解的,从安全测试不影响企业的角度考虑出发,不从渗透测试角度出发。

    过程如下:

    判断数据库类型--->针对数据库类型进行Sql注入探测判断是否存在Sql注入--->简单注入证明出数据库名/版本号等--->提交安全漏洞

       在实战测试中,需要大家去进行判断数据库类型然后针对性注入。本篇文章都是以Mysql数据库为例子那么咱们就没必要浪费时间了。

      大家测试sql注入都知道,如果是数字类型的,我们一般都会尝试

          

  通过and 1=1和and 1=2进行简单测试。

    但是随着安全的快速发展,现在很少能遇到and 1=1和and 1=2就能简单判断出的sql注入,多数都有过滤。那么我们这时候就需要花样式的tips的进行简单的探测是否存在sql注入。

      发现漏洞你成功了70%,写出漏洞证明你就完善了后面的30%,所以发现Sql注入这个环节很重要。

      以数字类型为例子

        在Mysql注入中有哪些语句可以代替and 1=1和and 1=2进行判断的?

        这里先从if开始讲起~

        语法:select if(expr1,expr2,expr3)

        解释:当expr1为true,则执行expr2,反之执行expr3

        在Mysql中我们知道0 =false和null=true,非0的数字代表true

        那么我们可以这样判断:

            

    通过这种方法去判断是否存在sql注入,继续衍生下去,还可以怎么玩?

      

通过if我们的组合利用将会变得多种多样,这里不一一举例子了。

      Mysql中盲注有基本的两种姿势

          1.and sleep(3)

          2.and BENCHMARK(10000000,ENCODE('hello','mom'))

        如果存在注入,这两个语句都会产生延迟

              

  在前面讲了if,以sleep(3)延迟为例子,benmark延迟同理不讲解了。     

        

可以通过这种方法进行盲注测试,然后再if上继续延生下去:  

  在Mysql中和and差不多意思的语句是哪个? like?

  使用like进行判断:

      

  如果把顺序换下会怎么样?

      

    如果过滤了and怎么办?我们如何进行Sql注入判断?

    

使用xor,xor用法详细:https://blog.csdn.net/csdn_0_001/article/details/79515643

这样判断等同于and 1=1和and 1=2

    因为不想文章内容太过啰嗦,先介绍几个关系点

    1.and和like用法相近

    2.or和xor用法相近

and,like,or和xor这几个都是运算符,所以可以随便调换,所以在下面的文章中比如:and if(1,1,0)也可以like if那么同理也可以xor if(),也可以or if

    就是sql语句稍微有点差别罢了

        

继续往下:

    and /or/xor/like都能为我们所用,那between呢?事实证明可以。

    演示下:

    利用between进行盲注  

       陷入循环延迟中。。。这个延迟时间很长。。。

        

  这样也是可以判断sql注入的,那么还能怎么玩?

      

进行这样进行sql注入判断。。

      写到这里我有点累。。继续吧。。

        还是从Mysql if开始说起吧。。。

       Mysql中小数不代表false我们还可以怎么玩?

          

    通过这样尝试绕过某些限制。。

      好吧有点扯淡了。再一个要介绍Myql中的<>

    简单演示下,也能判断注入

      

那么之前就说过能and ,就能like,就能xor,就能or进行sql注入判断,实在是举例子起来太多。。

xor比较复杂点,以xor为例子吧。。。

    

  认真写一篇文章真的好累。。

      如果过滤了if我们还能怎么办。。好吧我们还有亲戚[想不到吧?]

       语法: ifnull(expr1,expr2)

       解释:如果expr1不是null就是expr1,如果expr1是null就是expr2

      简单演示下:

      

还是以xor为例子演示一遍,or like不说了

    

如果ifnull也过滤了怎么办?还有好基友帮忙:

    语法:nullif(expr1,expr2)

    解释:如果expr1等于expr2返回null,如果expr1不等于expr2返回expr1

    以xor为例子

      

然后还能测试盲注。

  

改成1试试。

  

前面的很多很多都是对Mysql注入的探测,那么还有哪些姿势可以进行探测呢?

    语法:space(n)

    解释:由n个空格字符组成的一个字符串。

  先看下ascii表

    

    演示下:

        

    xor演示下:

      

  如果过滤了and/or/xor/between我们还能判断注入吗?显然是可以的,我们怎么做?

    使用div进行判断是否存在注入:

      

前面讲的and if/or if等用法均适用于div,div是mysql中的整除函数:

    

除了div我们还有什么? 别忘了having

    

我们还有什么方法可以探测sql注入是否存在的?div的朋友们:

  1.mod -- 取余函数

精简到最短的探测方法:

  

那么mod也可以和and/or/xor等 一样配合if等条件函数进行利用:

  

既然mod可以判断。那么round函数是否也可以判断?

    round是mysql中的四舍五入函数:

    用like进行演示:

      

  除了这些探测方法还有哪些?

    使用case when,因为这个语句比较长,我把它放到了最后:

      控制流程语句case when一样可以辅助我们进行sql注入探测:  

  and CASE WHEN 1>0 THEN sleep(3) ELSE sleep(1) end

      

使用xor/like/or/mod等都可以进行注入判断:

  以xor为例子:

  

陷入循环延迟中。。

  

  还有哪些方法可以探测?

漏讲了一个知识点:

    

字符串代表着0

使用xor:

  

也可以like 1这样。。你们自己去衍生。。

  使用soundex函数进行注入探测:

    含义:返回str的一个同音字符串。听起来“大致相同”的2个字符串应该有相同的同音字符串。一个“标准”的同音字符串长是4个字符,但是SOUNDEX()函数返回一个任意长的字符串。你可以在结果上使用SUBSTRING()得到一个“标准”的 同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。

  

继续吧,干到底!

  使用函数LOCATE进行sql注入探测:

  使用locate模拟 or 1=1和or 1=2

该函数不区分大小写。

    

当locate中的第一个参数为null,那就是null。

继续,已经讲到locate了,那么不得不说下position了!

语法:POSITION(substr IN str)

POSITION(substr IN str)是 LOCATE(substr,str)同义词,和locate用法类似

  

这次换个方法演示不用xor,使用div,你也可以使用mod或者round。

  

其实探测方法还有一些,不想一一举例子了。其实方法都大同小异。

我头大了 先写这么多。。针对Mysql的探测,可以根据我这个进行拓扑下去。到时候后期慢慢更新tips的。

  陆陆续续讲完了Mysql的sql注入探测,那么下一步就是关键的注入出数据库用户名/数据库名字/版本号等来简单的证明是否存在漏洞了。。

    咱们本篇文章以讲解探测数据库名字为中心,来列举一些探测数据库名字的技巧:

    无非围绕着Mysql的字符串函数居多。

      列举一部分,后面慢慢更新更多的注入数据payload

      先从常见的开始讲起:

        关于字符串截断的最让人熟悉的莫过于substring函数了。实在是文章内容太多,很多基础知识点不想再敖述,直接正片:

        

通过substring和ascii结合探测数据库名字:

    目前已知我的数据库名字是shop,先简单的探测下:

      

这里只要依次替换前面的数字进行遍历下去即可

   只使用substring:

      

char(115)是s。

    使用left函数进行探测数据库名字:

      

这样依次类推下去。

    使用right:

      

探测方法和left差不多。

    继续结合,if和left结合探测:

        

使用right:

if,ascii和substring三者结合:

    

然后substring,soundex结合查看:

    

倒过来探测所有:

    

探测数据库第二位:

substring双结合+soundex

    

探测数据库长度:

    

使用repeat:

  

  使用elt+substring进行探测:

有必要进下elt,elt语法:ELT(N,str1,str2,str3,...)

    解释:如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于参数个数,返回NULL。ELT()是FIELD()反运算。、

其实前面判断数据库是否存在注入的时候忘记讲elt了

  可以这样探测:

    

继续

  

    

   

探测:探测:

使用field和substring进行探测:

    

探测如下:

探测数据库第二位:

    

  使用make_set探测:

    

探测如下:

    

使用position探测:

    

使用or进行探测: 

  

写这篇文章越写越觉得自己无知,sql注入真的太复杂了。本篇文章仅仅抛砖引玉。

    本篇文章是比较纯的谈数据库注入,而没有考虑到waf,但是考虑到了过滤函数。

    本篇文章在判断数据库是否存在注入上花了很多功夫

    本篇文章在探测数据库方面仅探测出数据库第一位字符证明即可,没有以脚本的形式进行批量获取。

    本篇文章还有很多不足,以后会慢慢完善,也希望大家多提意见和好的思路

    本篇文章中多以and +sql语句为主注入,其实在文章的最开头,博主已经说过,可以and的多半都可以xor/or/like/mod/div/round等进行探测。这里需要大家自己随机应变应对

    本篇文章中在探测数据库方面多数以substring为主,其实也可以组合left,substr,right,不要让本篇文章局限了你的思想,一定要衍生出去

    本篇文章需要一个善于排版和能理清逻辑清晰的大佬进行专业的二次改写。

    本篇文章很多技巧博主也是第一次知道,很多都是实践出真知,很多原理博主自己也是一知半解在某些函数结合下所产生的那种效应。

      其次博主很菜,希望和互联网的安全朋友一起学习进步!

            不忘初心,方得始终!

    

   

      

      

  

      

 

    

        

        

 

      

            

            

    

    

    

Mysql注入小tips --持续更新中的更多相关文章

  1. golang 小知识-持续更新中

    Golang 中的指针 - Pointer Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,ar ...

  2. Office 中的各种小tips(更新中)

    1.Word 中打字输入会擦掉之后原有字符,出现“吃字”的情况? 要将“改写”切换为“插入”,最简单的方法就是点击键盘上小键盘旁边的“insert”键. 其实仔细观察的话,在word文档下方,会看到如 ...

  3. 基础学习:MYSQL命令大全(持续更新中---最近一次:2019.12.6)

    启动mysql : mysql -hlocalhost -uroot -p创建数据库:create database 数据库名字;指定要操作的数据库:use 数===据库名字;查看数据表建表语句:sh ...

  4. linux常用小技巧(持续更新中)

    一.设置固定ip地址1.config查看用的是哪一个网卡这是假设用的是eth12.修改dns地址vim /etc/resolv.confsearch 域名地址nameserver 192.168.3. ...

  5. 前端深入之js篇丨Array数组操作从入门到成神Up Up Up,持续更新中

    写在前面 随着前端深入的不断学习,发现数组这个数据结构在前端中有着相当大的存在感,由于我初学前端的时候并没有系统性的学习数组,所以我将通过这篇文章同你一起学习数组,希望我们能一起进步,学会熟练操作数组 ...

  6. 史上最全的spark面试题——持续更新中

    史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题   版权声明:本文为博主原创文章,遵循C ...

  7. 2020年腾讯实习生C++面试题&持续更新中(2)

    2020年腾讯实习生C++面试题&持续更新中(2) hello,大家好~ 我是好好学习天天,天天编程的天天,一个每天都死磕技术,及时分享的技术宅~ 昨天分享的题目不知道大家是否看过了,以后我计 ...

  8. Pig基础学习【持续更新中】

    *本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...

  9. Pig语言基础-【持续更新中】

      ***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.***   Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的, ...

随机推荐

  1. 面板JPanel,滚动面板JScrollPane,文本域JTextArea

    [面板JPanel] 面板就是一个容器 每一个容器都可以有一个自己的独立的布局和组件,这些容器之间也不会互相干扰 //导入Java类 import javax.swing.*; import java ...

  2. linux下可执行bin程序提示not found/no such file or directory/not executable

    我们经常在执行二进制bin程序时,会遇到提示not found/no such file or directory/not executable等错误信息,在什么情况下会出现这种问题呢,我们一起罗列下 ...

  3. 通过百度地图API--获取全国地图的经纬度

    因为要做一个前端画图需要经纬度,一个个的查询过麻烦,最终弄出这个,以备后查! import threading , time import requests from decimal import D ...

  4. Oracle导入、导出数据库dmp文件

    版本 1.实例数据完全导出 即导出指定实例下的所有数据 exp username/password@192.168.234.73/orcl file=d:/daochu/test.dmp full=y ...

  5. LeetCode算法题-Max Consecutive Ones(Java实现)

    这是悦乐书的第242次更新,第255篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第109题(顺位题号是485).给定二进制数组,找到此数组中连续1的最大数量.例如: 输 ...

  6. Spark的性能调优杂谈

    下面这些关于Spark的性能调优项,有的是来自官方的,有的是来自别的的工程师,有的则是我自己总结的. 基本概念和原则 <1>  每一台host上面可以并行N个worker,每一个worke ...

  7. kernel笔记——定时器与时间管理

    内核中时钟主要完成以下作用: 记录系统运行时间 完成时间相关的统计功能,如cpu占用率等 定时功能,设定某个进程一段时间后完成某项任务 为实现以上功能,硬件以及内核提供了不同类型的时钟. RTC 实时 ...

  8. python之并发编程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  9. web开发-Django博客系统

    项目界面图片预览 项目代码github地址 项目完整流程 项目流程: 1 搞清楚需求(产品经理) (1) 基于用户认证组件和Ajax实现登录验证(图片验证码) (2) 基于forms组件和Ajax实现 ...

  10. 001_ jQuery的表格插件dataTable详解

    一. 1.启用id为"datatable1"标签的html的表格jQuery库 $("#datatable1").dataTable( ) Reference: ...