网站建设往年的高考题,推广平台有哪几个,可以拿自己电脑做网站主机,如何设计一个网页挂到百度上目录
什么是文件包含漏洞#xff1f;
文件包含的环境要求
常见的文件包含函数
PHP伪协议
file://协议
php://协议
php://filter
php://input
zip://、bzip2://、zlib://协议
zip://
bzip2://
zlib://
data://协议
文件包含漏洞演示
案例1#xff1a;php://inp…目录
什么是文件包含漏洞
文件包含的环境要求
常见的文件包含函数
PHP伪协议
file://协议
php://协议
php://filter
php://input
zip://、bzip2://、zlib://协议
zip://
bzip2://
zlib://
data://协议
文件包含漏洞演示
案例1php://input
案例2php://input
案例3php://filter
案例4zip:// 什么是文件包含漏洞
文件包含File Include漏洞也是web安全中很重要的一个漏洞它主要会出现在PHP与JSP应用中如果应用在运行过程中会动态加载其他脚本文件并且加载的文件的文件路径由外部输入变量控制就有可能产生文件包含漏洞
文件包含漏洞又可以被细分为两类
本地文件包含Local File Include远程文件包含Remote File Include
本地文件包含漏洞很多时候也是路径穿越漏洞include()函数其加载的文件如果是外部输入变量控制的但是文件包含漏洞特指文件被Web应用载入并执行比如在PHP中用include或者require函数载入文件并执行。在允许上传文件的场景中攻击者可以上传恶意代码再通过本地文件包含漏洞来执行该代码
远程文件包含是指应用可以通过一个URL加载并执行远程代码比如PHP中的include()就支持指定一个URL作为参数利用远程文件包含漏洞攻击者无须上传恶意文件到目标服务器只需要将其放在远程服务器上即可
文件包含的环境要求 allow_url_fopenOn 规定是否允许从远程服务器或者网站检索数据 allow_url_includeOn 规定是否允许include/require远程文件
常见的文件包含函数 include() require() include_once() require()_once()
include与require的区别在错误处理方面: include()只生成警告E_WARNING并且脚本会继续 require()会生成致命错误E_COMPILE_ERROR并停止脚本 include_once()与require()_once()表示如果文件已包含则不会包含
PHP伪协议
有的小伙伴就会好奇了上面还是文件包含漏洞怎么突然就到PHP伪协议那当然是可以用得到了那么下面就先介绍一下常见的php伪协议
PHP 提供了一些杂项输入/输出IO流允许访问 PHP 的输入输出流、标准输入输出和错误描述符 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
file://协议
file:// 协议在下面两个配置均是on/off的情况下均可以正常使用 allow_url_fopen off/on allow_url_includeoff/on file:// 用于访问本地文件系统在CTF中通常用来读取本地文件的因为它的使用不受allow_url_fopen与allow_url_include的影响
使用格式file:// [文件的绝对路径和文件名]
可以可以测试一下在已经本地物理路径的前提下可以尝试读取一下文件比如说现在index.html文件目录中有一个web.txt文件我们尝试使用file://伪协议来进行包含
web.txt
?php phpinfo();?
然后尝试使用file://伪协议包含一下该文件 可以看到这里我们的txt文件使用了file://伪协议包含后成功的将php文件解析了。这就说明使用file://伪协议包含的文件会被视为php文件来解析
注在Linux中也可以使用file://伪协议来读取文件
php://协议
php:// 访问各个输入/输出流I/O streams在CTF中经常使用的是php://filter和php://input
php://filter用于读取源码php://input用于执行php代码。
条件 allow_url_fopen:off/on allow_url_include : 仅php://input php://stdin php://memory php://temp 需要on php://filter
php://filter 读取源代码并进行base64编码输出不然会直接当做php代码执行就看不到源代码内容了。
php://filter在双off的情况下也可以正常使用 allow_url_fopen off/on allow_url_includeoff/on 常见的过滤器
字符串过滤器作用string.rot13等同于str_rot13()rot13变换string.toupper等同于strtoupper()转大写字母string.tolower等同于strtolower()转小写字母string.strip_tags等同于strip_tags()去除html、PHP语言标签
转换过滤器作用convert.base64-encode convert.base64-decode等同于base64_encode()和base64_decode()base64编码解码convert.quoted-printable-encode convert.quoted-printable-decodequoted-printable 字符串与 8-bit 字符串编码解码
压缩过滤器作用zlib.deflate zlib.inflate在本地文件系统中创建 gzip 兼容文件的方法但不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。bzip2.compress bzip2.decompress同上在本地文件系统中创建 bz2 兼容文件的方法。
下面就可以尝试使用php://filter伪协议的过滤器来包含一下文件看看有什么效果
比如使用转换过滤器读取上面的web.txt文件 可以看到是一串字符将其进行base64解码就会发现是文件的内容
但是并没有对该文件进行解析说明它是无法解析php的
php://input
php://input可以访问请求的原始数据的只读流将post请求的数据当作php代码执行。
当传入的参数作为文件名打开时可以将参数设为php://input,同时post想设置的文件内容php执行时会将post内容当作文件内容然后导致任意代码执行。
条件 allow_url_fopen off/on allow_url_includeon 还是使用上面的web.txt文件然后换成php://input伪协议包含一下看看
因为这里需要畸形POST提交因此我使用Burpsuite抓下面的数据包然后添加phpinfo();来测试再进行发送看看是否会解析
http://127.0.0.1/include/include.php?filephp://input 可以看到成功的解析了php文件
zip://、bzip2://、zlib://协议
条件 allow_url_fopen:off/on allow_url_include :off/on 作用zip:// bzip2:// zlib:// 均属于压缩流可以访问压缩文件中的子文件更重要的是不需要指定后缀名可修改为任意后缀jpg png gif xxx 等等。
zip://
格式zip://[压缩文件绝对路径]%23[压缩文件内的子文件名]#编码为%23
这里还是使用上面的web.txt文件然后将web.txt进行zip压缩,压缩文件名为web.zip,如果可以上传zip文件便直接上传若不能便将file.zip重命名为file.jpg后在上传其他几种压缩格式也可以这样操作。 bzip2:// 这里没有解析成功不知道是什么原因按道理是可以解析成功的(╥﹏╥)
zlib:// data://协议
data:// 协议是是受限于allow_url_fopen的官方文档上给出的是NO所以要使用data://协议需要满足双on条件
即 allow_url_fopen on allow_url_includeon 然后可以使用data://伪协议来包含一个txt文件:
格式1data://text/plain,
格式2data://text/plain;base64, 文件包含漏洞演示
案例1php://input
代码
meta charsetutf8
?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 tipsflag在当前目录的某个文件中;include($file); //用户传递过来的
}else{echo a href?filehttp://www.baidu.comclick go baidu/a;
}
?
访问发现是一个链接点击会跳转到百度页面 在百度页面可以看到是给file传入了一个www.baidu.com网址因此跳转到了百度页面
尝试更换file的网址发现网页提示我们flag在某一个文件中 那么现在就可以使用上面的PHP伪协议来尝试获取一个页面中的文件可以使用php://input来进行获取因为php://input需要使用POST传参因此我们首先抓一个数据包然后尝试在后面加上执行的命令例如执行一个phpinfo()文件 为了找到flag可以使用下面的命令查看当前目录然后发现另一个flag.txt文件 使用下面的命令打开该文件就可以拿到flag了
案例2php://input
代码
?php
show_source(__FILE__);
include(flag.php);
$a $_GET[a];
if(isset($a)(file_get_contents($a,r)) I want flag){echo success\n;echo $flag;
} flag
//flag.php
?php
$flag ‘flag{flag_is_here}’;
?
访问页面发现这里说flag就在这样有本事就来拿吧 查看了代码后发现当参数$a不为空且读取的文件中包含’I want flag’时即可显示$flag。
所以可以使用php://input得到原始的post数据,访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行来进行绕过。
注遇到file_get_contents()要想到用php://input绕过。 案例3php://filter
代码
meta charsetutf8
?php
error_reporting(0);
$file $_GET[file];
if(stristr($file,php://input) || stristr($file,zip://) || stristr($file,phar://) || stristr($file,data:)){exit(hacker!);
}
if($file){include($file);
}else{echo a href?fileflag.phptips/a;
}
?
可以看到种类将php://input、zip://、phar://、data://伪协议都限制了但是却并没有限制php:filter伪协议可以使用它可以进行读取文件 可以看到得到了一串base64的编码解码后 案例4zip://
代码
//index.php
meta charsetutf8
?php
error_reporting(0);
$file $_GET[file];
if (!$file) echo a href?fileuploadupload?/a;
if(stristr($file,input)||stristr($file, filter)||stristr($file,data)/*||stristr($file,phar)*/){echo hick?;exit();
}else{include($file..php);
}
?
!-- flag在当前目录的某个文件中 --
//upload.php
meta charsetutf-8
form actionupload.php methodpost enctypemultipart/form-data input typefile namefupload /input typesubmit valueupload! /
/form
you can upload jpg,png,zip....br /
?php
if( isset( $_FILES[fupload] ) ) {$uploaded_name $_FILES[ fupload ][ name ]; //文件名$uploaded_ext substr( $uploaded_name, strrpos( $uploaded_name, . ) 1); //文件后缀$uploaded_size $_FILES[ fupload ][ size ]; //文件大小$uploaded_tmp $_FILES[ fupload ][ tmp_name ]; // 存储在服务器的文件的临时副本的名称$target_path uploads\\.md5(uniqid(rand()))...$uploaded_ext;if( ( strtolower( $uploaded_ext ) jpg || strtolower( $uploaded_ext ) jpeg || strtolower( $uploaded_ext ) png || strtolower( $uploaded_ext ) zip ) ( $uploaded_size 100000 ) ) {if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// Noecho preupload error/pre;}else {// Yes!echo pre.dirname(__FILE__).\\{$target_path} succesfully uploaded!/pre;}}else {echo preyou can upload jpg,png,zip..../pre;}
}?
访问index.php文件看到有一个upload?点击后就来到了upload.php页面 可以看到这里我们可以传入jpg,png,zip文件这里就可以使用我们上面的zip://伪协议了
先上传一个zip文件 然后使用zip://伪协议包含 可以看到也是成功的包含并且解析了