文件上传漏洞(php)

  • 文件上传流程
    • 前端选择文件,提交
    • 浏览器形成POST Multiple报文发送至服务器
      • 报文解析
        • 绿线上为请求头
          • Http协议,浏览器,请求方式,编码类型,请求地址等数据
        • 绿线下为请求数据
          • 普通参数
            • 参数名,参数值(隐藏字段)
          • 文件名,响应请求的函数名,文件类型
    • 服务器中间件接受报文,解析后交给后端代码处理
    • 后端代码将解析文件内容写入临时文件中(PHp特有)
    • 写入文件中,文件名以特定定规则命名
  • 上传漏洞的必要条件
    • 存在上传点
    • 可以上传动态文件
    • 上传目录有执行权限,并且上传的文件可执行
    • 可访问到上传的动态文件
  • 上传检测流程
    • 前端提交
      • JavaScript检测
        • 普通的表单提交
          • 查看onchange事件,onsubmit等事件
            • onchange事件会在域的内容改变时发生
            • onsubmit事件会在表单的确认按钮被点击时发生
          • 删除相关事件中的检测函数
      • Flash AS检测
        • 提交请求上传前.触发AS脚本检测
          • 直接利用burpSuite修改报文,修改成自己想要的样子
      • App上传检测
        • 检测写在App客户端,或者所调用的HTML页面中
          • 将BurpSuite的代理端口监听IP设置为"All Interface"
          • 将WiFi的代理设置为Burpip:8080
          • 访问Http://burPip:8080下载证书
          • (安卓)将修改的证书扩展名改为.crt,设置->安全->凭证存储->从SD卡安装,选择证书进行安装
          • (IOS)按照提示一路下一步安装
          • (IOS)进入设置->通用->关于本机->证书信任设置,将添加的证书设置为信任
          • (如果安卓App使用了证书校验,可以配合Xposed的框架的JustTrustMe使用,IOS暂时没有办法)
        • Mumu模拟器打开WiFi配置的方法
          • adb connect 127.0.0.1:7555
          • Adb shell am start -a android.settings.WIFI_SETTINGS
    • 数据传输
      • WAF拦截
      • IPS拦截
    • 后端处理
      • 扩展名检测
      • MIME TYPE检测(描述消息内容类型的因特网标准,包括文本,图像,音频,以及其他应用程序专用的数据,浏览器根据上传的扩展名匹配对应的MIME类型)
        • 修改content_type 类型,找到允许通过的白名单
      • 文件格式检测
        • 文件头检测
          • 文件头是位于文件开头的一段承担一定任务的数据,一般在开头部分(文件起始部分中一般开头文件类型如:GIF>开头为 GIF89a/GIF87a)
            • 在需要绕过上传检测的,追加合法的文件头
        • 文件完整内容检测
          • 通过调用图像函数(如:getimagesize/imagecreatefromgif/imagecreatefrompng),进行检测文件是否为图像,需要文件内容保持相对完整,所以通过追加文件头无法通过
            • 针对这种检测可以将图片与欲上传的文件进行合并来染过检测
            • 通过copy命令进行合并
              • copy /b 1.jpg+phpinfo.php 新文件名称.jpg
        • 恶意内容检测
          • 检测文件内容中是否包含Webshell等数据
            • 常见会被检测的关键字
              • eval(,base64_encode(,assert(,Java.lang.runtime
            • 使用强混淆的weevely进行尝试,Kali自带
            • HTTPs://github.com/sunge/Weevely
      • 内容检测(同WAF/IDS)
    • 写入文件系统
      • 文件重命名
      • 杀毒软件查杀
    • 访问文件
      • 无执行权限
        • 常见漏洞解析
          • IIS/Nginx+PHP fastcgi取值错误解析漏洞
            • 开启了cgi.fix_pathinfo,如果开启后,所执行文件不存在,会继续查找上一级文件是否存在
          • 并且未设置security.limit_extensions,该选择限制可以执行的文件类型
            • abc.jpg/.php
          • Nginx 文件名逻辑漏洞(CVE-2013-4547),版本->0.8.41~1.4.3/1.5.0~1.5.7
            • 上传一个以空格(%20)为结尾的文件,当访问" ***.jpg%20%00.php" 会将刚上传的 "***.jpg "文件,当作PHP运行
            • 并且需要在burp将访问路径中将%20%00.PHP,使用ctrl+alf+U转码
          • Apache 解析漏洞(配置错误)
            • 如果Apache的conf文件中有如下配置
              • AddHandler application/X-Httpd-.php
            • 则***.php.jpg 也会被当作php去执行
          • 如果在.htaccess中有如下配置,可以将扩展名.XXX当作php执行
            • AddType application/x-Httpd-php xxx
          • IIS 5.0/6.0 解析漏洞
            • 上传文件名:abcde.asp;.jpg
              • 服务器默认不解析;后面的内容
            • 向xxx.asp目录下面上传abcde.jpg
              • 服务器会将xxx.asp目录下的文件都当作asp文件解析
        • 浏览器查看服务器类型
          • F12 ->网络->消息头->Service
          • 访问不存在的网页IIS会暴漏服务信息
      • 未知位置
  • 绕过的高级技巧
    • 重绘图(应用调用图片库对上传的文件进行了图像转换,所以即使将图片与文件合并,也会将尾部转换掉,无法使用前面所讲的方法进行上传wedShell)
      • 将正常图片用目标使用的图形库进行转换
      • 寻找转换前后两次未变的部分
      • 将未变的部分替换为欲上传的webShell
      • 将替换后的文件进行图像转换,看是否转换后仍存在替换后部分
      • G:\靶场\Bypass-PHP-GD-Process-To-RCE-master\odeinj.php(重绘图代码)
    • phpinfo与本地包含的利用
      • 利用函数
        • _PEQUEST["MAX_FILE_SIZE"],_REQUEST["submit"],_POS["MAX_FILE_SIZE"],_POS["submit"],_FILES["upfile"]
      • 某站点存在本地文件包含及PHPINFO,可以利用其执行脚本
        • PHP在解析multipart/from-data请求时,会创建临时文件,并写入上传内容,脚本执行结束后即删除
        • PHPINfo可以输出$_FILES信息
        • 通过多种方式争取时间,在临时文件删除前进行执行包含
          • 通过在数据中加如大量的垃圾数据,使PHPINFO页面过大,导致PHP输出浸入流式输出,并不一次输出完
          • 通过大量请求来延迟PHP脚本的执行速度
    • 在线压缩利用
      • 存在上传压缩包利用点,可使用如下方式利用
        • 将Webshell打包压缩至压缩包中
          • 将模板上传处常用压缩包上传后进行自动解压
            • 部分此类检测压缩包中内容的,可尝试建立目录进行压缩
          • 使用目录穿越(../)的方法向上一级目录进行上传

你可能感兴趣的:(文件上传漏洞(php))