- 文件上传流程
- 前端选择文件,提交
- 浏览器形成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
- 数据传输
- 后端处理
- 扩展名检测
- MIME TYPE检测(描述消息内容类型的因特网标准,包括文本,图像,音频,以及其他应用程序专用的数据,浏览器根据上传的扩展名匹配对应的MIME类型)
- 修改content_type 类型,找到允许通过的白名单
- 文件格式检测
- 文件头检测
- 文件头是位于文件开头的一段承担一定任务的数据,一般在开头部分(文件起始部分中一般开头文件类型如:GIF>开头为 GIF89a/GIF87a)
- 文件完整内容检测
- 通过调用图像函数(如:getimagesize/imagecreatefromgif/imagecreatefrompng),进行检测文件是否为图像,需要文件内容保持相对完整,所以通过追加文件头无法通过
- 针对这种检测可以将图片与欲上传的文件进行合并来染过检测
- 通过copy命令进行合并
- copy /b 1.jpg+phpinfo.php 新文件名称.jpg
- 恶意内容检测
- 内容检测(同WAF/IDS)
- 写入文件系统
- 访问文件
- 无执行权限
- 常见漏洞解析
- IIS/Nginx+PHP fastcgi取值错误解析漏洞
- 开启了cgi.fix_pathinfo,如果开启后,所执行文件不存在,会继续查找上一级文件是否存在
- 并且未设置security.limit_extensions,该选择限制可以执行的文件类型
- 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打包压缩至压缩包中
- 将模板上传处常用压缩包上传后进行自动解压
- 部分此类检测压缩包中内容的,可尝试建立目录进行压缩
- 使用目录穿越(../)的方法向上一级目录进行上传