学习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试试。
先写这么多,等会继续写。。。
原文地址:https://www.cnblogs.com/piaomiaohongchen/p/9526006.html