web应用一般采用基于表单的身份验证方式(页面雏形如下图所示),处理逻辑就是将表单中提交的用户名和密
码传递到后台数据库去查询,并根据查询结果判断是否通过身份验证。对于LAMP架构的web应用而言,处理逻辑采用PHP,后台数据库采用MySQL。而在这一处理过程,由于种种处理不善,会导致不少严重的漏洞,除去弱口令与暴力破解,最常见的就是SQL注入。SQL注入可以在SQLNuke——mysql 注入load_file Fuzz工具看到如何利用,而本篇博客的重点是利用MySQL隐形的类型转换绕过WAF的检测。

下面使用实例来展示这一过程。
 
实例包括2个脚本login.html与login.php,1张存放用户名与密码的member.user表

(1)表单login.html

<html>
<body>
<form id="form1" name="form1" method="post" action="login.php">
<label>UserName
<input name="user" type="text" id="user"/>
</label>
<br/>
<label>Password
<input name="password" type="text" id="password"/>
</label>
<br/>
<label>
<input name="login" type="submit" id="login" value="Login"/>
</label>
</body>
</html>

(2)认证处理login.php

<?php
if(isset($_POST["login"]))
{
$link = mysql_connect("localhost","root","toor") or die ("cannot connect database".mysql_error()); mysql_select_db("member") or die ("cannot select the db"); $query = "select * from user where user='".$_POST["user"]."'and password='".md5($_POST["password"])."'"; echo $query."<br/>"; $result = mysql_query($query) or die ("the query failed:".mysql_error());
echo "<br/>"; $match_count = mysql_num_rows($result); if($match_count){
while($row = mysql_fetch_assoc($result)){
echo "<strong>User: </strong>".$row["user"]."<br/>";
echo "<strong>Password: </strong>".$row["password"]."<br/>";
echo "<br/>";
}
}
else { echo "Wrong User or password <br/>"; echo '<a href="http://10.1.36.34/login.html">Back</a><br/>';
} mysql_free_result($result); mysql_close($link);
}

注意红色字体部分,为用户输入的用户名和密码,没有进行任何过滤就传入到数据库中去进行查询. 该脚本将查询字符串及查询结果展示在页面中以供直观的演示SQL查询结果。

 
(3)member.user

大家看一张常见的用户表user表,由两个字段构成user用户名和password字段。

表中包含8行数据

很明显这是一段有SQL注入的程序,接下来我们来看看下面这些有趣的查询结果
 
(1) 输入用户名a’+'b#

查询结果如下图所示

(2)输入用户名45a’+'b’#

 产生以上结果的原因是算术操作符+的出现将字符型的user转换为了数值性的user
 
dani,tanjiti,dani123,0dani 对应的数值为0
123dani,123tanjiti对应的数值为123
45dani,045tanjiti对应的数值为45
'a'+'b'对应数值为0+0=0,会把类型转换后为0的用户名搜索出来
'45a'+'b'对应数值为45+0=45,会把类型转换后为45的用户名搜索出来
除了+号,其他算术操作符号也会发生类型的类型转换,例如MOD,DIV,*,/,%,-,
 

(3)输入用户名a’MOD’1′#

’a'MOD’1′对应的数值为0 MOD 1 =0,会把user对应数值为0的搜索出来

(4)输入用户名‘-”#

”-”对应的数值为0 -0 =0,会把user对应数值为0的搜索出来

bit操作符&,|,^,<< ,>>也有同样的效果

(5)输入用户名‘/’1′#

”/’1′对应的数值为0 /1 =0,会把user对应数值为0的搜索出来

bit操作符&,|,^,<< ,>>也有同样的效果

(6)输入用户名a’&’b'#

’a'&’b'对应的数值为0&0 =0,会把user对应数值为0的搜索出来

对应WAF防火墙而言,当输入’ or 1=’1 时,ModSecurity防火墙会报错(我没有试验过ModSecurity,博客中有介绍)

而上面的实例则可以绕过防火墙.
 
总的来说,利用MySQL隐性的类型转换来绕过WAF对SQL注入的检测是蛮有想法的。
 
参考:

http://vagosec.org/2013/04/mysql-implicit-type-conversion/

在SQL注入中利用MySQL隐形的类型转换绕过WAF检测的更多相关文章

  1. SQL注入中利用XP_cmdshell提权的用法(转)

    先来介绍一下子服务器的基本情况,windows 2000 adv server 中文版,据称 打过了sp3,asp+iis+mssql .首先扫描了一下子端口,呵呵,开始的一般步骤. 端口21开放: ...

  2. Sql注入中连接字符串常用函数

    在select数据时,我们往往需要将数据进行连接后进行回显.很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数.在sqli中,常见的字符串连接函数有concat(),group_ ...

  3. 【sql注入】浅谈sql注入中的Post注入

    [sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...

  4. Web安全学习笔记 SQL注入中

    Web安全学习笔记 SQL注入中 繁枝插云欣 --ICML8 权限提升 数据库检测 绕过技巧 一.权限提升 1. UDF提权 UDF User Defined Function,用户自定义函数 是My ...

  5. 【漏洞汇总】SQL 注入漏洞之 mysql

    日期:2019-07-23 19:55:59 更新:2019-08-02 10:40:37 作者:Bay0net 介绍:Mysql 注入笔记 0x01. 基本信息 1.1 基本术语 数据库: 数据库是 ...

  6. SQL注入之PHP+Mysql

    PHP+Mysql(GET方法+数值型+有错误回显)的注入方法 目标系统:PHP+MYSQL(GET方法+数值型+有错误信息) 环境说明: 后台地址:http://ip/cms/admin/login ...

  7. sql注入中关于--+的一点探索

    在sql-labs游戏中,经常使用--+放在最后注释多余部分,而mysql中的注释符为#和-- 却不能直接使用,以前没学过mysql,一直不理解,也不知道+号的作用,今天有时间特地探索了一下,算是搞明 ...

  8. DedeCMS全版本通杀SQL注入漏洞利用代码及工具

    dedecms即织梦(PHP开源网站内容管理系统).织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,近日,网友 ...

  9. SQL注入中的WAF绕过技术

    目录 1.大小写绕过 2.简单编码绕过 3.注释绕过 4.分隔重写绕过 5.Http参数污染(HPP) 6.使用逻辑运算符 or /and绕过 7.比较操作符替换 8.同功能函数替换 9.盲注无需or ...

随机推荐

  1. [JSOI2008]Blue Mary的职员分配

    由于Blue Mary呕心沥血的管理,Blue Mary的网络公司蒸蒸日上.现在一共拥有了n名职员,可惜没有任何的金钱和声誉.平均每名每天职员都可以给公司带来x单位金钱或者y单位声誉(名利不能双全). ...

  2. Linux基本命令总结(一)

    java开发的服务器一般都是linux系统,因此把有关命令小结一下: 1,cd [目录名] 进入相应的目录下. cd / 进入系统的根目录 cd .. 或者 cd .. // 退入当前位置的上级目录 ...

  3. numpy 多维数组及数组操作

    NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机 ...

  4. JS判断一个数是否为质数

    function isPrime(number) { if (typeof number !== 'number' || number<2) { // 不是数字或者数字小于2 return fa ...

  5. Haproxy 安装初体验

    20180916 haproxy Haproxy简介 Haproxy是一款免费的.快速的和稳定的解决方案,提供HA和LB功能,同时对基于TCP的应用和HTTP的应用进行代理,对于流量很大的web站点来 ...

  6. springcloud的turbine集成zookeeper

    1.turbine监控界面显示一直是loading的状态,如何解决 http://blog.didispace.com/spring-cloud-tips-4/ 2.通过追踪turbine的依赖可以看 ...

  7. vim: 基本知识;

    1. 函数: function!   funcName(para.) content; endfunction 如果添加!,将覆盖已存在的重名函数: 注: 该博文为扩展型: 2.调用外部命令: exe ...

  8. mac crontab调用python时出现ImportError: No module named XXX的问题

    写了一个监控mq的脚本,把这个脚本加入crontab里进行时刻监控,于是#crontab -e,添加语句: * * * * * cd /目录 && python mq脚本名.py &g ...

  9. jmeter打开图形化界面时指定代理

    \apache-jmeter-4.0\bin>jmeter -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888 如果不想在每个请求里面指定代理的话可 ...

  10. oracle数据泵导入导出命令

    1.在PL/SQL的界面,找到Directories文件夹,找到目录文件的路径 2.通过SSH进入服务器 找到相应的路径 cd /u01/oracle/dpdir 输入指令 df -h   查看资源使 ...