upload-labs
(一)JS上传类型
前端验证(浏览器或前端代码中完成)
判断标准:
-
用户上传文件时,页面立即给出反馈(如文件类型错误、大小超限),且没有提交到服务器。
-
开发中常见使用 JavaScript(如 HTML5 File API)、前端框架(如 React、Vue)等进行处理。
-
控制台中无网络请求或仅发生前端逻辑处理。
- 在浏览器里面设置里面禁用js或将checkfile删除 鼠标右键 -> 查看 -> 点击三点 -> 设置 -> 调试程序 —> 禁用js
禁用完之后再去上传php文件就能上传了
2.或者 直接f12将checkfile删除 改为ture也行
(二)Content-type类型(后端验证类型)
后端验证(服务器端进行验证)
判断标准:
- 用户点击“上传”后,页面出现加载或发送网络请求,服务器返回错误信息(如返回 JSON、状态码、错误提示)。
- 通过抓包工具(如浏览器开发者工具 -> Network)可以看到请求发送到服务器。
- 后端代码(如 PHP、Node.js、Python)中有处理逻辑,验证文件大小、类型、内容等。
抓包后将Content-type删除如果上传不成功就证明是后段验证
我们这里直接上传php文件 提示:文件类型不正确 知道文件是通过判断文件类型进行上传的
上传php文件 修改这里的文件类型 jpg的文件属性image/jpeg 将Content-type属性复制,粘贴 到要上传的文件Content-type属性粘贴后即可上传成功
(三)特殊后缀绕过
在apach里面修改httpd_conf,
添加上可以用过php文件的后缀,抓包修改文件后缀即可上传成功
(四).htaccess绕过
上传php文件 发现.htaccess文件没有禁用
在.htaccess文件下面添加 .jpg .txt以php格式去解析
上传把php文件后缀改为jpg显示上传成功,Cmd打开 将1.jpg和111.php合并为000.ipg
将一句话木马插进图片
(五)user.ini绕过
.user.ini上传前提是上传的目标文件里面必须先包含有php文件
将含有一句话木马的php文件后缀改为jpg
然后写一个.user.ini的文件
里面写入auto_prepend file=666.jpg
这句话的意思是上传的这个文件的目录下面的所有php文件执行之前先预先去加载一下666.jpg
先上传.user.ini,再上传111.jpg,去访问这个readme.php文件
(六)大小写绕过
在Windows中会自动把文件后缀改为小写,因此我们在抓包过程中把文件后缀改为大小写混合
(七)空格绕过
代码里面可知上传没有对空格进行过滤,抓包在文件后缀加上空格即可绕过
(八)加点绕过
没有对文件上传的点进行过滤,抓包在文件后面添加上一个点即可绕过
(九)::$DATA绕过
在文件结尾加上::$DATA上传,把url里面的::$data删除,最后放到webshell链接工具里面链接(注意连接路径不要加上::$DATA)
绕过原理:补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。
(十) 点空格点绕过. .
点空格加点 zoe.php. .因为靶场过滤只过滤一遍,Windows下会自动把文件后缀的点和空格删除,抓包将文件名后缀改为111.php. .
(十一) 双写后缀绕过
源码可知函数str_ireplace将字符串里面的数组将相应的地方替换掉,替换为空\zoe. pphphp,字符串替换为zoe.php
(十二)%00截断 前置知识点“空字符
在做12关13关之前先把配置文件修改一下
在老版本的php中或者是C语言中,对于字符串读取的时候如何出现0X00就会当做字符串结束的标识
0x00%000x00和%00都表示位空
一个是在编程语言使用0x00,一个是在url编码中使用%00
%00截断
文件保存是通过路径来决定的,路径上写什么最后的结果是什么
在后面加上要上传的php文件名,后面跟上%00截断 将后面的临时文件截掉显示为空 这样子我们上传的php文件就会被保存了
上传成功访问,将zoe.php后面的内容临时路径删掉再使用webshell链接工具链接成功
第二种方式
可以看到这里的save_path是用get请求获取的,通过url里面的get路径用url编码传递的参数
(十三)0x00截断
在upload后面加上你要上传的文件名,然后在php后面空格选中占位符,这里为+号
Code hex是十六进制把这个hex里面的默认值改为16进制的00再上传,一定要点Apply changes
为什么要进行16进制转换 ?
00截断是 %00解码的结果
url上面 %00 (自动解码一次)
post 下面 %00 二次解码 需要手工解码
(十四) 字节标识绕过 均为十六进制
文件只读取两个字节将上传的图片的前两个字节进行读取
转换为十进制 如果转化后的字节与图片类型相符 就显示上传成功
补充知识:
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。
将php文件改为jpg文件用记事本打开 在文件的开通空两格档做占位符 ,右键用010editor打开
Aa的十六进制为61 61
将开头两位的编码还为十六进制的 89 和 50
再去上传这个文件111.jpg
上传成功但是是以png格式解析的文件这里蚁剑是链接不了的
这里要利用文件包含漏洞
1.文件包含漏洞概述
和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。
什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。
为什莫可以利用这个文件包含漏洞去上传我们的一句话木马去链接呢?
文件包含会把这个文件信息以php的这个形式去展开
这样我们就可以利用之前上传的带有一句话木马的png文件去链接webshell
有文件包含漏洞的页面在upload的上级目录
./upload/
再把刚刚上传的文件名粘贴上去
访问成功 在用webshell链接
总结:先去上传一个非法的文件包含一句话后门 修改文件头的两个字符 变成网站过滤对方时候合法的十六进制编码 这时候需要一个东西让jpg文件去解析 需要文件包含漏洞把jpg文件的内容变成php文件去解析所以才能连上一句话木马
(十五)图片码绕过
索引2代表图像类型的常量值 GIF 代表1 JPG 代表2 以此类推
头两个 512 代表宽是512 高是 512
后面两个512 代表的是包含图像属性的字符串
这个1代表的是类型的常量值这里代表的是GIF
这个函数负责将文件图像类型的常量值1转化为GIF这个类型的后缀
将图像2.png和111.php文件结合生成图片 (注意:这里要将图片放在前面,111.php放在后面生成图片 不然可能后续会上传不成功)
上传图片
新建标签 复制文件存放地址 利用文件上传漏洞把png文件以php类型展开去解析
上传成功 然后以webshell链接
(十六)图片码绕过2
判断图片类型 输出一个数值 1代表gif 2 代表 jpg 3 代表 png,剩下的操作跟第十五关一样的
(十七)二次渲染绕过
文件移动到目录里面如果可以将文件进行一个重写就是进行一个二次渲染
上传我们尽量上传GIF文件 图片的重写或者二次渲染并不会把文件内容中的十六进制或者说是内容全部改变 可能会保留一部分
上传一个没有进行二次渲染的源文件
上传成功后将二次渲染后的另存文件保存到本地 打开010editor
点击tool 下的compare files
将两个文件进行对比
点击match
蓝色选区是没有变的内容 蓝色区域是不会被二次渲染的地方 插入一句话木马的时候就插入到这片蓝色区域 插入一句话木马的时候尽量往后写
插入一句话木马,上传文件,新标签打开图像 复制文件路径 利用文件包含漏洞将gif以php形式解析
两种思路
第一种 先上传一个正常的图片 将上传渲染之后的图片下载到本地 然后在去通过软件比较渲染之后的图片和源文件哪里没有变化 再在原图片图片没有变化的地方插入一句话木马 上传 上传之后就不会去把这个一句话木马给渲染了
第二种
把图片先上传 将上传渲染后的图片进行保存 在把渲染后的图片和原文件进行对比哪里没有变化 再在没有变化的地方进行一句哈木马插入 再上传
(十八)条件竞争原理与绕过
文件先去服务器上判断是不是合法的,再决定删除或者保留
正是因为服务器对后台语言可以让文件上传到服务器上之后再去判断才会有合后台语言竞争的机会
文件会在服务器上停留特别少的时间 通过不停的发送上传文件 和不停的访问上传文件请求,最后达到if没有删除之前上传成功
发送请求模块
这个代码通过php语句生成一句话木马 2.php里面写入这一句话木马 上传 抓包
右键打开到攻击模块 将里面的占位符全部清除 攻击模式默认狙击手 在show_code后面添加一个空位符&p=
点击payload 在类型这里选这个number 点击random 限制发送次数为10000
在options里面设置线程为25 进行发送请求攻击 访问上传模块
访问2.php所在的目录 文件还没上传所以显示错误
打开burpsuite抓包 访问2.php路径请求 将2.php文件请求抓包下来 右键发送到攻击模块
Payload可以选着为 NUll payload 然后选择持续生成
将线程修改为20 然后先攻击上传2.php达到不停上传的目的 然后再点击访问攻击达到不停访问的目的 在上传的同时访问
上传成功 最后webshell链接就好了
(十九)apach解析漏洞+条件竞争原理绕过
什么apach解析漏洞?
这里有个php文件后面加了个.7z apach通过网站访问文件是通过从右往左看 它不会去解析7z就会解析php这个后缀 Apach解析不了7z 只能解析php了 把这个文件当做php去执行 这个文件里面是hello
打开代理 2.php文件里面写的一句话木马 将2.php文件后面加上.7z显示上传成功
这个网站会把最后那个7z当做后缀名 重命名的时候 把这个7z加上时间戳 这个时间序列进行一个拼接形成这个7z文件
虽然可以访问可以上传 但是不会被执行 我们要做的把这个文件重命名之前 进行一次访问 文件里面也是要那种能生成小马的php文件
上传2.php.7z 发送到攻击模块 清除占位符 不停上传的同时进行不停的访问 两边都开始攻击
上传成功 webshell访问就行
(二十一)审计+数组后缀绕过
代码审计先对type进行的检查是不是上面的类型然后将文件转为数组在这里用.分割
通过点分割将1.php 分解成1 和 php
$ext=end($file)这个函数获取数组最后一位值然后在判断php是不是在下面 这个白名单里面
Rest($file)获取数组第一位 $file[count($file)-1] 回到下标 count($file)获取数组有多少个元素
数组的下标是从0开始第0项是第1项是1 第2项是第1项是php 所以要减1
count($file)是判断个数的 $ext=end($file)有想和数组最后一个拼接 我们手动在post的数组请求里面添加了一个数组$file [8]=1 此时这样子$file [2]~$file [7]之间都是null count($file)个数远远小于下标数字 count($file)现在的有效各数为3 null不算 $file[count($file)-1] 就是 3-1=2 这里我们下标访问的为$file [2] 这个数组里面的是null为空
我们pist请求里面传递一个我们想要给他的数组
将$file[0]改为含有一句话木马的1.php 然后我们传递的数组最后$file[8]=jpg一位必须是jpg png gif file[8]或者其他数组大于1就行(原因是·分割将1和php分成两个数组,而数组下标是从0开始的所以第0项是第1项是1 第2项是第1项是php 所以大于1)
首先burpsuite打开上传我们含有php文件的一句话木马
抓包修改文件类型
将save_name改为save_name=[0] 相当于一个数组 这样数组的第一位就是1.php
上传再用webshell链接
复制一个新建将save_name改为save_name[3]大于1就行这样数组的最后一位拼接的就是png