PHP代码审计—任意文件读取函数篇

admin 2023年12月29日11:01:29评论48 views字数 1109阅读3分41秒阅读模式

任意文件读取原理

在源码中有读取文件功能函数的参数没有过滤完全,或是PHP伪协议导致文件被读取。

读取文件函数

fopen()

fopen()函数一般需要fread()函数配合使用,fread()函数用于从已打开的文件中读取指定长度的数据,最后使用fclose()关闭打开的文件

PHP代码审计—任意文件读取函数篇

如果对参数没有任何过滤,并且路径不固定的,可以用../或者..或者绝对路径来读取

PHP代码审计—任意文件读取函数篇

PHP代码审计—任意文件读取函数篇

readfile()

此函数可以直接读取文件,不需要用echo输出

用法:   readfile(filename,include_path,context)   成功时返回从文件中读入的字节数, 或者在失败时返回 false 

PHP代码审计—任意文件读取函数篇

PHP代码审计—任意文件读取函数篇

file_get_contests()

此函数与readfile()不同的是,此函数需要echo输出文件内容

用法:   file_get_contents(path,include_path,context,start,max_length)   函数返回读取到的数据, 或者在失败时返回 false

PHP代码审计—任意文件读取函数篇

实战审计-file_get_contents()

TaoCMS-path参数任意文件读取

PHP代码审计—任意文件读取函数篇

针对于file_get_contents()函数,已经有了echo输出,此时跟踪参数是否可控

PHP代码审计—任意文件读取函数篇

可以看到参数由$path拼接而成,变量$path由请求直接获取,没有任何过滤。

PHP代码审计—任意文件读取函数篇

这样的写法无法防御使用../造成的任意文件读取,但是可以防御使用绝对路径造成的文件读取。

实战审计-fread()

OtCMS-任意文件读取

此处创建Read函数使用fread()来读取文件

PHP代码审计—任意文件读取函数篇

跟踪Read函数,在UpFilesLook()函数中有使用到read函数

PHP代码审计—任意文件读取函数篇

  $file  = OT::GetStr('file');  $file = str_replace(array('../',"..\",'%'), array('','',''), $file);GET方式获取file,对file的值进行过滤

  $filePath = OT_ROOT .'upFiles/'. $file;  if (file_exists($filePath)){    die(Str::MoreReplace(File::Read($filePath),'html'));  }else{    die('该文件不存在(../upFiles/'. $file .')');  }最后,拼接路径,使用Read函数读取文件

PHP代码审计—任意文件读取函数篇

  $file  = OT::GetStr('file');  $file = str_replace(array('../',"..\",'%'), array('','',''), $file);针对../的过滤,使用..././即可绕过

PHP代码审计—任意文件读取函数篇

原文始发于微信公众号(琴音安全):PHP代码审计—任意文件读取函数篇

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月29日11:01:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP代码审计—任意文件读取函数篇http://cn-sec.com/archives/2346937.html

发表评论

匿名网友 填写信息