学习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,不要让本篇文章局限了你的思想,一定要衍生出去
本篇文章需要一个善于排版和能理清逻辑清晰的大佬进行专业的二次改写。
本篇文章很多技巧博主也是第一次知道,很多都是实践出真知,很多原理博主自己也是一知半解在某些函数结合下所产生的那种效应。
其次博主很菜,希望和互联网的安全朋友一起学习进步!
不忘初心,方得始终!