一、内容
上传功能常见于图片的上传,例如博客头像设置,广告位图片上传等。
上传检测方法在paper中也写的比较明朗,这里总结一下:
1.客户端使用JS对上传图片做检测,例如文件大小,文件扩展名,文件类型
2.服务端检测,例如文件大小(免得拒绝服务),文件路径(避免0x00截断,目录遍历),文件扩展名(避免服务器以飞非图片的文件格式解析文件),文件类型(避免修改Content-Type为image/jpeg等),文件内容(避免图片写马)
上传检测绕过的方法,总结一下:
1.客户端检测,相当于没有检测,可以使用HTTP代理例如burp绕过
2.服务端检测,一般采用白名单+黑名单的方式,但也极有可能出纰漏。例如大小写,不在名单内的特例,操作系统bt特性(windows系统会自动去掉文件名最后面的点和空格),0x00截断,服务器文件解析漏洞,最后还有图片写马绕过类型检测
总结一下,对于文件上传的防御,做好以下几点:
1.客户端初步检测文件大小,文件扩展名,文件类型
2.服务端检测文件大小,文件扩展名(为了避免麻烦,可以替换上传文件的文件名,就是将文件路径与文件名都写死),文件类型
3.服务端根据用户图片生成新的图片存储到数据库
二、在SQL注入中利用MySQL隐形的类型转换绕过WAF检测
对于LAMP架构的web应用而言,处理逻辑采用PHP,后台数据库采用MySQL。
举例说明:
(1).表单login.html
(2) 认证处理login.php
";
$result=mysql_query($query) or die("the query failed:".mysql_error());
echo "
";
$match_count=mysql_num_rows($result);
if ($match_count) {
while($row = mysql_fetch_assoc($result)) {
echo "User:".$row["user"]."
";
echo "Password:".$row["password"]."
";
echo "
";
}
}
else {
echo "Wrong User or password
";
echo 'Back
';
}
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,045danjiti对应的数值为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的搜索出来