在SQL注入中利用MySQL隐形的类型转换绕过WAF检测
挺好的,看完后就想给大家分享。
图片太多了,实在不好传啊。
感谢管理员或是版主贴的图片(没显示谁编辑的帖子)
完了,在本帖多交流。
先分享点个人心得,心得版权归t00ls。:
有的输入框会限制字符长度。但是你的注入语句很长,已经超出了它限制输入的长度,怎么办呢?
有办法,你把源代码保存到本地。本地修改限制,再提交。
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>
<?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);
}
(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的搜索出来
(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/
评论24次
这种隐形的类型转换在不同类型的数据库应该有不同的表现吧,先学xi学ximysql的!对于过WAF还是很有用的,多谢了
思路学xi了
好东西 ,收藏了
想法挺好的--
支持原创
学xi一下 谢谢分享
确实是很深入浅出 本来很模糊的概念讲的很透彻 赞一个
学xi了.长姿势了
所以一般对于这种提交的情况,我在开发服务端的时候,对于所有提交的东西都做了验证,验证这东西不能给客户端来做。 还有一个,今天在开源中国上面看到一个与之类似的表单攻击:http://www.oschina.net/news/44272/password-too-long-is-insecurity 基本上设置一个长密码去折腾也会出事
只能说还可以,因为经常遇到不再同一个表的情况,另外 'or 1# 这个也可以,但能不能绕过防火墙就不知道了
from框注入06年玩过几次,那个时候整天玩灰鸽子。就没好好学xi,所以到现在还是没长进 这种注入,和你分享点心得: 有的框架会限制字符长度。但是你的注入语句很长,已经超出了它限制输入的长度,怎么办呢? 有办法,你把源代码保存到本地。本地修改限制,再提交。
good,that's cool. 是这样写吧?
长贱识了。。。学xi。
貌似几年前就有了,反正看过
辛苦了 学xi了 谢谢了 见识了 才发现 php手注没入门
不错
好资料 ,收藏了 谢谢
很新颖的 个人不太好消化 先收下了
楼主辛苦了,深入浅出啊
1024!!!
太猛了这个。这对于原来WAF不过的情况大有帮助啊!!