练习15-文件后缀解析漏洞
Abstract: upload-labs
中的 Pass-03 - Pass12
文件后缀解析漏洞。
Table of Contents
- 文件上传漏洞总结
文件上传漏洞总结
文件上传分类
如何判断上传漏洞类型
根据不同类型选择不同方式
Pass-03
先判断上传漏洞的类型
打开第三关首页,寻找上传点,我们可以很容易找到上传点。
先选择一个 404.txt
文件上传,
发现可以上传成功,右击复制图片地址,可以查看文件内容。
返回首页,选择 shell.php
文件上传,发现上传失败。
根据以上操作,可以发现该判断机制为后缀的黑名单判断。除此之外,通过 Wappalyzer
插件可以搜集到很多信息。
根据已知信息构造后缀绕过检查
根据提示可知 .php
文件是不允许的,那么可以通过修改后缀名来绕过后缀名检查。可以新建一个 2.phtml
然后直接上传 2.phtml
文件绕过后缀名检查。
也可以打开 burpsuite
软件,在上传时,修改 2.php
的后缀为 2.phtml
。来绕过后缀名检查。
上传成功后,右击选择复制图片地址,在新标签页打开,可以发现
Pass-03 代码分析
核心代码:
1 |
|
可以发现,黑名单中含的名单过少,所以可以通过 .phtml
绕过。由于 deldot()
、strtolower()
和 trim()
函数的存在,所以无法用后缀那个加 .
或者 空格
等方法绕过。 当我们输入 2.php.空格.
时,经过 deldot()
函数后,变为 2.php.空格
,再经过 strrchr()
函数后变为 .空格
,经过 strtolower()
和 str_ireplace()
后,没有变化,最后经过 trim()
函数后,变为 .
。2.php.空格.
虽然可以绕过上传成功,但是文件名为随机数加 .
,无法解析。
Pass-04
先判断上传漏洞的类型
选择 1.php
点击上传,发现无法上传。
选择 webshell.txt
点击上传,发现可以上传成功,
右击选择复制图片地址,在新标签页中打开,可以看到上传的文件名和文件内容。
发现服务器并没有对文件名进行重命名。
此上传类型为不重命名的黑名单上传。
根据已知信息构造后缀绕过检查
使用 .htaccess 绕过
新建 .htaccess
文件,写入
1 | SetHandler application/x-httpd-php |
新建 404.jpg
用记事本打开,写入一句话木马,
1 | phpinfo(); |
另存为 404.jpg
文件。
先上传 .htaccess
文件,使得上传的文件按 php
解析。
再上传 404.jpg
文件
查看图片地址,
虽然是 .jpg
格式,但按照的是 php
文件的解析,所以可以成功。
利用系统特性覆盖空的php文件
windows
系统下,<
等于 *
,即代表任意字符。
参考文章:
思路:利用特殊方法生成一个 php
文件,然后再利用改特性将文件覆盖。
打开 burpsuit
软件,选择 2.php
点击上传,抓取数据包,然后发送到 Repeater
模块,这这里进行尝试,知道发现可以上传的文件后缀名为止。
依次尝试文件上传思维导图中黑名单中的方法,发现当文件名为 2.php:.jpg
可以上传成功。
返回到 Proxy
模块,修改文件后缀为 3.php:.jpg
,点击 Forward
,
右击选择复制图片地址,在新标签页中打开,由于 windows
系统会把后缀名解析为 3.php
,
修改文件后缀名,继续查看。
发现没有内容,打开服务器,查看 3.php
发现没有内容。
重新上传,用 burpsuite
修改后缀名为 3.<<<
,上传成功后,重新查看文件。
发现本次可以显示内容,
在服务器查看 3.php
文件。
Pass-04 代码分析
核心代码
1 |
|
黑名单中名单虽多,但是并没有 .htaccess
所以可以先上传 .htaccess
,之后把 404.php
另存为 404.jpg
,上传 404.jpg
,会以 php
文件解析。 当输入为 2.php:.jpg
时,经过处理后输出为 .jpg
,可以绕过检测,上传至服务器上,由于 windows
特性,上传的文件名为 2.php
。之后再修改文件名为 2.<<<
,系统检测到后匹配
到 2.php
文件,之后把内容覆盖掉。
Pass-05
先判断上传漏洞的类型
选择 2.php
文件,无法上传。
选择 webshell.txt
,上传成功,
查看文件,
该类型为黑名单的文件重命名上传。
根据已知信息构造后缀绕过检查
打开 burpsuite
软件,选择一个文件点击上传,用 burpsuite
抓取数据包,右击发送到 Repeater
模块。
修改 2.php
为 2.pHP
发现可以上传成功,
返回 Proxy
模块,修改后缀 .php
为 .pHP
,
查看文件
Pass-05 代码分析
1 |
|
与 Pass-04
代码相比,可以发现,黑名单中增加了 .htaccess
后缀名。但是,缺少了 strtolower()
函数,所以可以通过大写绕过。
Pass-06
先判断上传漏洞的类型
上传 1.php
,提示此文件类型不能上传。
上传 webshell.txt
,发现可以上传,
查看文件,
可以发现,文件名已经改变,故该类型为黑名单重命名上传类型。
根据已知信息构造后缀绕过检测
用 burpsuite
抓取数据包,在 Repeater
判断绕过的方法。
多次尝试后,发现在后缀名后添加空格就可以绕过检测。
返回 Proxy
模块,修改后缀名,可以上传成功,查看文件
Pass-06 代码分析
1 |
|
最后缺少 trim()
,所以可以通过后缀名加空格来绕过。
Pass-07
先判断上传漏洞的类型
上传 1.php
提示:此文件类型不允许上传!
上传 webshell.txt
,可以上传,查看文件,
可以判断该类型为黑名单不重命名的上传类型。
根据已知信息构造后缀绕过检测
用 burpsuite
抓取数据包,在 Repeater
判断绕过的方法。多次尝试后,发现把 2.php
改成 2.php.
可以绕过检测。
返回 Proxy
模块,进行上传,
发现可以上传成功,点击查看文件,
Pass-07 代码分析
1 |
|
程序通过对末尾 .
的处理,来取出后缀,但输入为 2.php.
的话,最后输出为 .
可以绕过检测。上传至服务器的后缀名为 .php.
由于服务器系统特性,也可以解析为 .php
。
Pass-08
先判断上传漏洞的类型
上传 1.php
,无法上传,提示:此文件类型不允许上传。
上传 webshell.txt
,上传成功,查看文件,
可以看出,该类型为黑名单重命名的上传类型。
根据已知信息构造后缀绕过检测
用 burpsuite
抓取数据包,在 Repeater
判断绕过的方法。多次尝试,发现把 2.php
修改为 2.php::$DATA
可以绕过检测。
返回 Proxy
模块进行上传。
上传成功后,点击查看文件,
把后面的 ::$data
重新上传
Pass-08 代码分析
1 |
|
与前几篇的对比可以发现,通过 ::$DATA
绕过。
Pass-09
先判断上传漏洞的类型
上传 1.php
,无法上传,提示:此文件类型不允许上传。
上传 webshell.txt
,可以上传成功,查看文件,
可以看出,该类型为黑名单不重命名的上传类型。
根据已知信息构造后缀绕过检测
使用点空格点绕过
上传 2.php
文件,同时使用 burpsuite
改包,把 2.php
修改为 2.php. .
,点击 Forward
,上传成功。
查看文件
利用系统特性覆盖空的php文件
用 burpsuite
抓取数据包,在 Repeater
判断绕过的方法。多次尝试,将 2.php
改成 2.php:jpg
,可以长传成功。
返回 Proxy
模块,上传文件成功,查看文件,
把 :jpg
删掉,
刷新网页,
打开服务器,查看 2.php
,发现确实没有数据,
重新上传,把 2.php
修改为 2.<<<
,
查看文件,
把 <<<
改为 .php
查看服务器端的 2.php
文件
Pass-09 代码分析
1 |
|
文件名的处理过程如图所示,
当输入文件名为 1.pHP.
时,1.pHP.
→ 1.pHP
→ .pHP
→ .php
→ .php
→ 输出。
当输入文件名为 1.php.空格
时,1.php.空格
→ 1.php.
→ 1.php
→ .php
→ 输出。
当输入文件名为 1.php.空格.
时,1.php.空格.
→ 1.php.空格.
→ 1.php.空格
→ .空格
→ .
→输出。
Pass-10
先判断上传漏洞类型
上传 1.php
文件,发现可以上传成功,
点击查看文件,
发现文件名字变为 1.
,推测有可能检测到后缀名中有 php
后就把后缀的 php
给去掉了,尝试双拼绕过。
点击上传,可以上传成功,查看文件,
Pass-10 代码分析
1 |
|
把在黑名单中出现的后缀名替换为空,即可以通过双拼绕过。
Pass-11
先判断上传漏洞类型
上传 1.php
文件,没有成功,提示:只允许上传 .jpg|.png|.gif
类型文件。首先确定为白名单策略。
选择图片上传,
查看图片,
可以判断出该类型是白名单重命名上传类型。
根据已知信息构造后缀绕过检测
用 burpsuite
抓取数据包,在 Repeater
判断绕过的方法。多次尝试,把 2.php
改成 2.php%00.jpg
。
打开服务端,里面没有 2.php
文件。
在 burpsuite
改包,
上传成功后,查看
查看服务端,
文件名只保留 2.php
,刷新页面
Pass-11 代码分析
1 |
|
设置白名单,通过寻找 .
的位置,截取文件名,取出文件后缀,之后与白名单中的后缀做对比。关键问题出在可以设置保存路径上。把 save_name
设置为 /uploads/404.php%00
,上传文件名为 404.jpg
后,传至服务器的文件名为 /uploads/404.php%00404.jpg
由于windows
特性实际上传至服务器的名字为 /uploads/404.php
。
Pass-12
先判断上传漏洞类型
上传 1.php
文件,观察页面的报错提示。
上传一个头像,
此类型为白名单重命名的上传类型。
根据已知信息构造后缀绕过检测
用 burpsuite
抓取数据包,在 Repeater
判断绕过的方法。在 burpsuite
中我们可以发现,save_path
的参数通过 POST
方式发送,所以应该把它转换成 hex
。
把 404.php
保存为 404.jpg
,文件内容为 <?php phpinfo();?>
。
上传 404.jpg
文件,
同时使用 burpsuite
抓包,把 save_path
修改为 ../upload/404.php%00
,由于 POST
方式并不进行 URL
解码,故转换成十六进制。
点击 Hex
,找到对应的位置做修改,
返回 Raw
查看,
未点击 Forward
之前,服务端没有 404.php
,
点击 Forward
,上传成功,查看服务端,
在浏览器中查看图片,
只留下 404.php
Pass-12 代码分析
与 Pass-11
主要的不同就是 save_path
传输方式。Pass-11
以 GET
方式传递,Pass-12
以 POST
方式传递。由于 POST
方式不会经过 URL
解码,所以需要在数据包中把 %00
修改为 Hex
方式。