Upload-labs
使用工具:
burpsuite
中国蚁剑
Pass-01 前端js绕过
前端JS代码对上传文件合法性的验证
- 先上传一个不合法php文件来测试


- 该文件类型不允许上传

- burpsuite未抓到包,则证明上传的文件在前端就被拦截,还未到传给服务器的步骤
- 他只允许图片(jpg、png)及动图(gif)文件上传,那么我们就将文件改为图片的后缀来上传,从而绕过前端的拦截

- 能抓到包,证明绕过了前端验证

- 然后将文件后缀名从jpg重新改回php上传,一句话木马就植入服务器了,这里看到打开图片连接,实际上是php文件

- 可以用后门连接工具(蚁剑)来连接并控制服务器,输入url和连接密码(也就是post传入的参数)

- 连接成功,并添加,打开数据记录就可以控制服务器目录

- 可以对服务器的目录进行操作,此处演示删除操作

另一个方法:
在网页前端设置中禁用JavaScript,就可以正常上传php文件了
- 鼠标右键-检查-设置-禁用JavaScript
设置:

禁用:

Pass-02 content-type绕过
基本流程第一步先上传php文件去尝试,回显文件类型错误,猜测通过content-type的内容来拦截不合法的文件格式上传

- 用burpsuite先抓包,拦下数据包,然后将php文件的content-type内容改为图像对应的内容(image/jpeg)上传,即可绕过
原始包内容:

修改后:

然后放行,显示上传成功
同样可以用蚁剑来连接
Pass-03 特殊后缀绕过
先上传php文件去尝试,回显不允许上传的文件后缀名,猜测对后缀名写了黑名单,来拦截不合法的文件格式上传
可以通过上传同样可以被解析为php文件的一些后缀,类似php3、php5、phtml等,是否能成功取决于中间件(apache)的配置文件中是否有设置

更改apache配置文件:设置什么样的文件后缀可以php的方式来解析
- 步骤:打开配置文件-(httpd-config)-找到addtype

- 找到addtype,取消注释,添加类型

如果还是不行,那么考虑是php的版本问题,切换到不带nts的低版本,就可以用蚁剑连接成功
nts(非多线程安全)、ts(多线程安全)
上传php文件,在burpsuite中将后缀名改为php5(php3,phtml)然后放行,关闭抓包
打开图片链接,并且复制图片链接,在蚁剑上连接
Pass-04 .htaccess绕过
老样子,先上传php文件,看回显,文件不允许上传
作为练习,那么看源码来分析

源码:
1 | $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini"); //后缀名黑名单 |
.htaccess文件在站点的根目录下面,不是在apache目录下,但它属于apache的一个局部配置文件,它负责相关目录下的网页配置,修改后即生效。而httpd.conf是apache全局主配置文件,影响整个服务器,修改后需重启服务器才生效
通过htaccess文件,可以帮助我们实现:网页301重定向、自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能
其中.htaccess文件中的“SetHandler application/x-http-php”的意思是设置当前目录所有文件都使用php解析,那么无论上传任何文件,只要符合php语言代码规范,就会被当做PHP执行,不符合规则则报错。.htaccess通常用于伪静态的一个转换。
前提条件:目标服务器apache必须开启“mod_rewrite”模块和“AllowOverride ALL”。



- 写一个.htaccess文件并上传,内容为:
1 | SetHandler application/x-httpd-php //将所有文件都解析成PHP文件 |
- 将一句话木马的php后缀改为jpg或者txt,然后上传,蚁剑连接的时候后缀就是jpg,可以连接
也可以将php文件合并到图片文件中一起上传
方法1:
- 在文件当前目录打开cmd,输入命令合并两个文件
1 | copy shell.php+1.jpg/b 000.jpg |
/b:二进制
000.jpg:合并之后的文件
方法2:
- burpsuite抓包,上传一个图片,在图片的内容最后加上一句话木马内容,然后上传
当然,如果只看这道题,还有一个方法绕过
抓包之后将文件名改为“shell.php. .”(加了点 空格 点),是根据源码过滤规则来绕过的,过滤之后发往服务器的文件名是“shell.php.”,然后需要知道windows的命名规则中后缀名之后的”空格”和”.”是会被去除的
所以服务器中保存到文件名为“shell.php”
Pass-05 .user.ini绕过
配置文件
.htaccess
作用:分布式配置文件,一般用于URL重写、认证、访问控制等
作用范围:特定目录(一般是网站根目录)及其子目录
优先级:较高,可覆盖 Apache的主要配置文件(httpd-conf)
生效方式:修改后立刻生效httpd-conf
作用:包含 Apache·HTTP服务器的全局行为和默认设置
作用范围:整个服务器
优先级:较低
生效方式:管理员权限,重启服务器后生效.user.ini
作用:特定于用户或特定目录的配置文件,通常位于Web应用程序的根目录下,它用于覆盖或追加全局配置文件(如php.ini)中的PHP配置选项。
作用范围:存放该文件的目录以及其子目录
优先级:较高,可以覆盖 php.ini
生效方式:立即生效php.inie
作用:存储了对整个PHP环境生效的配置选项。它通常位于PHP安装目录中
作用范围:所有运行在该PHP环境中的PHP请求
优先级:·较低
生效方式:重启 php或 web 服务器
.user.ini可以生效的前提:
- php版本最好是7.x的版本
- Server API为CGI/FastCGI(通过phpinfo查看)
.user.ini文件上传漏洞的前提:
- .user.ini可以生效
- 并且上传目录由php文件
写法:
auto_prepend_file=shell.txt(这个文件中包含php内容)
A:echo“hello”.php
B:echo“world”.txt
auto_prepend_file=B.txt………………hello world
- 写一个.user.ini文件,此文件的作用是在该目录下上传文件时都会预先加载文件中的内容,此处内容则是预先加载shell.jpg文件去包含一句话木马,这意味着在每个 PHP 脚本执行之前,都会先执行 shell.jpg 文件,然后将其上传

- 然后再上传shell.jpg文件(包含一句话木马),为了方便查看加一句显示的语句

- 上传的目录中自己包含一个readme.php文件,在网页上访问此文件,就会首先加载shell.jpg文件,则会输出“上传成功”,此处因为编码方式不同出现乱码,但是其实已经包含成功

同样,根据这道题的源码来看,可以通过点空格点来绕过
Pass-06 大写绕过
查看源码,发现没有将文件扩展名转为小写的代码,可以使用大写绕过
- 上传文件,burpsuite抓包,然后将文件后缀名任意字母改为大写,然后上传
注意:版本要调低,这里我用的是php5.4.45,版本太高无法连接
Pass-07 空格绕过
查看源码,发现没有将文件扩展名去除首尾空格的代码,可以使用空格绕过
- 上传文件,burpsuite抓包,然后将文件后缀名最后加上空格,然后上传
Pass-08 后缀加点绕过
查看源码,发现没有将文件扩展名去除末尾点的代码,可以使用后缀加点绕过
上传文件,burpsuite抓包,然后将文件后缀名最后加上一个点,然后上传
前面这三种类型为什么能绕过呢?原理就是增加特殊字符,从而绕开黑名单的过滤
额外数据流
在Windows操作系统中,当你看到文件名后跟着”::$DATA”时,它表示文件的一个附加数据流(Alternate·DataStream,ADS)。数据流是一种用于在文件内部存储额外数据的机制。
在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是WindowS·NT·文件系统(NTFS)支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加”::DATA”来访问。
例如,”1.txt”是一个文件,而”1.txt::$DATA”是这个文件的一个附加数据流。这样的数据流可以用于存储文件的元数据、备份信息、标签等。
需要注意的是,大多数常规的文件操作工具不会意识到这些额外的数据流,而只会处理默认
的数据流。要访问或操作这些附加数据流,通常需要使用特定的命令行工具或编程接口。
写入方法:
echo 内容 >>文件名:数据流名
type 文件名 >>文件名:数据流名
查看方法:
notepad 文件名:数据流名
例子:
- 创建一个txt文件,并写入内容

- 给该文件写一个附加数据流,用notepad查看文件只显示文件内容,不显示附加数据流内容


- 按此方法查看,就可以查看附加数据流,“你好”

- type:将2.txt写入1.txt的额外数据流

Pass-09 ::$DATA绕过
::$DATA结尾的是文件附加数据流,在PHP中文件附加数据流是不会验证文件后缀的,因为他仅表示一个文件流,不是一个文件
上传文件,burpsuite抓包,然后将文件后缀名最后加上::$DATA,然后上传,因为他已经是一个文件附加数据流了,所有不是文件,不检查文件后缀名
上传之后,Windows操作系统的会将后缀名的::$DATA去除,也就成了文件,而不再是文件数据流了
Pass-10 点空格点绕过
查看源码,根据代码执行顺序,可以看出(php. .)在每一条代码之后过滤,还剩一个点,从而使它不是php文件,从而绕过,而上传之后windows操作系统在处理后缀名时,会删除后缀名中的点,从而得到最终上传上去的php文件
- 上传文件,burpsuite抓包,然后将文件后缀名最后加上点空格点,然后上传
Pass-11 后缀双写绕过
查看源码,发现他一旦遇到黑名单里的后缀名,就会将其后缀名替换为空,也就是没有后缀名了,因此双写后缀名,即使去除一个,还有一个后缀名
- 上传文件,burpsuite抓包,然后将文件后缀名最后加上点空格点,然后上传
- 修改文件名为shell.pphphp
- 不能是连续的php,不然都要被去掉
Pass-12 %00截断
空字符
(你好 0x00php)php发现了0x00之后就不会读取之后的数据了
- 0x00:编程语言
- %00:URL编码(ASCII码转化为十六进制,再加上%)
查看源码,这道题是白名单
上传jpg文件,burpsuite抓包,然后在文件的保存路径上直接写一个文件,然后%00截断后面的内容,然后上传
jpg是用来通过白名单的

Pass-13 0x00截断