记录“文件上传漏洞防御--图片写马的剔除”之摘抄

一、内容

       上传功能常见于图片的上传,例如博客头像设置,广告位图片上传等。

        上传检测方法在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张图片

       举例说明:

        (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字段。

            记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第2张图片

            表中包含8行数据

            记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第3张图片     

            很明显这是一段有SQL注入的程序,接下来我们来看看下面这些有趣的查询结果

            (1)输入用户名a'+'b#

             记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第4张图片

            查询结果如下图所示:

            记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第5张图片

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

            记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第6张图片

            记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第7张图片

            产生以上结果的原因是算术操作符+的出现将字符型的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'#

               记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第8张图片


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

                记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第9张图片

                 (4) 输入用户名'-''#

                     记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第10张图片

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

                     记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第11张图片

                  (5) 输入用户名'/'1'#

                         记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第12张图片

          ''/'1'对应的数值是0/1=0,会把user对应数值为0的搜索出来

                      记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第13张图片

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

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

               记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第14张图片

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

              记录“文件上传漏洞防御--图片写马的剔除”之摘抄_第15张图片

                      


你可能感兴趣的:(记录“文件上传漏洞防御--图片写马的剔除”之摘抄)