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

一、内容

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

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

<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>
    </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 herf="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,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的搜索出来

             

                      


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值