任意文件读取原理
在源码中有读取文件功能函数的参数没有过滤完全,或是PHP伪协议导致文件被读取。
读取文件函数
fopen()
fopen()
函数一般需要fread()
函数配合使用,fread()
函数用于从已打开的文件中读取指定长度的数据,最后使用fclose()
关闭打开的文件
如果对参数没有任何过滤,并且路径不固定的话,可以用../或者..或者绝对路径来读取
readfile()
此函数可以直接读取文件,不需要用echo输出
用法:
readfile(filename,include_path,context)
成功时返回从文件中读入的字节数, 或者在失败时返回
false
file_get_contests()
此函数与readfile()不同的是,此函数需要echo输出文件内容
用法:
file_get_contents(path,include_path,context,
start
,max_length)
函数返回读取到的数据, 或者在失败时返回
false
实战审计-file_get_contents()
TaoCMS-path参数任意文件读取
针对于file_get_contents()函数,已经有了echo输出,此时跟踪参数是否可控
可以看到参数由$path拼接而成,变量$path由请求直接获取,没有任何过滤。
这样的写法无法防御使用../造成的任意文件读取,但是可以防御使用绝对路径造成的文件读取。
实战审计-fread()
OtCMS-任意文件读取
此处创建Read函数使用fread()来读取文件
跟踪Read函数,在UpFilesLook()函数中有使用到read函数
$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函数读取文件
$file = OT::GetStr(
'file'
);
$file = str_replace(
array
(
'../'
,
"..\"
,
'%'
),
array
(
''
,
''
,
''
), $file);
针对../的过滤,使用..././即可绕过
原文始发于微信公众号(琴音安全):PHP代码审计—任意文件读取函数篇
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论