[BUUCTF]刷题记录8
Posted huamanggg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BUUCTF]刷题记录8相关的知识,希望对你有一定的参考价值。
[De1CTF 2019]SSRF Me
- python代码审计
- ssrf
- hash拓展攻击
flask题
#! /usr/bin/env python
#encoding=utf-8
from flask import Flask
from flask import request
import socket
import hashlib
import urllib
import sys
import os
import json
reload(sys)
sys.setdefaultencoding('latin1')
app = Flask(__name__)
secert_key = os.urandom(16)
class Task:
def __init__(self, action, param, sign, ip):
self.action = action
self.param = param
self.sign = sign
self.sandbox = md5(ip)
if(not os.path.exists(self.sandbox)): #SandBox For Remote_Addr
os.mkdir(self.sandbox)
def Exec(self):
result = {}
result['code'] = 500
if (self.checkSign()):
if "scan" in self.action:
tmpfile = open("./%s/result.txt" % self.sandbox, 'w')
resp = scan(self.param)
if (resp == "Connection Timeout"):
result['data'] = resp
else:
print resp
tmpfile.write(resp)
tmpfile.close()
result['code'] = 200
if "read" in self.action:
f = open("./%s/result.txt" % self.sandbox, 'r')
result['code'] = 200
result['data'] = f.read()
if result['code'] == 500:
result['data'] = "Action Error"
else:
result['code'] = 500
result['msg'] = "Sign Error"
return result
def checkSign(self):
if (getSign(self.action, self.param) == self.sign):
return True
else:
return False
#generate Sign For Action Scan.
@app.route("/geneSign", methods=['GET', 'POST'])
def geneSign():
param = urllib.unquote(request.args.get("param", ""))
action = "scan"
return getSign(action, param)
@app.route('/De1ta',methods=['GET','POST'])
def challenge():
action = urllib.unquote(request.cookies.get("action"))
param = urllib.unquote(request.args.get("param", ""))
sign = urllib.unquote(request.cookies.get("sign"))
ip = request.remote_addr
if(waf(param)):
return "No Hacker!!!!"
task = Task(action, param, sign, ip)
return json.dumps(task.Exec())
@app.route('/')
def index():
return open("code.txt","r").read()
def scan(param):
socket.setdefaulttimeout(1)
try:
return urllib.urlopen(param).read()[:50]
except:
return "Connection Timeout"
def getSign(action, param):
return hashlib.md5(secert_key + param + action).hexdigest()
def md5(content):
return hashlib.md5(content).hexdigest()
def waf(param):
check=param.strip().lower()
if check.startswith("gopher") or check.startswith("file"):
return True
else:
return False
if __name__ == '__main__':
app.debug = False
app.run(host='0.0.0.0',port=80)
Exec方法中有两条路走
第一是如果action里面有scan,那么就会执行scan方法,读取param的前五十个字符,然后再写入result.txt
def scan(param):
socket.setdefaulttimeout(1)
try:
return urllib.urlopen(param).read()[:50]
except:
return "Connection Timeout"
如果是read在action里面,那么就会读取出result.txt的内容
所以总体的思路就是,先把flag写入result.txt,然后在读result.txt
在进入这两条路之前,会有一个checkSign,这里会指向这样的判断
他会拿现在的action和param去生成一个签名,再与cookie里面的sign去比较
def checkSign(self):
if (getSign(self.action, self.param) == self.sign):
return True
else:
return False
def getSign(action, param):
return hashlib.md5(secert_key + param + action).hexdigest()
所以这个Sign我们是可以而且需要去伪造的
这里他是拼接了param和action
生成sign的路由是:
会发现他自己就带了一个scan,那么此时我再去拼接一个read,那么就可以同时满足上面的两条路了
这个时候他是拿flag.txtreadscan
去生成sign的
@app.route("/geneSign", methods=['GET', 'POST'])
def geneSign():
param = urllib.unquote(request.args.get("param", ""))
action = "scan"
return getSign(action, param)
payload:
/geneSign?param=flag.txtread
得到sign
这时候就可以去伪造cookie进行ssrf了
这时候对应的我们的payload就要和我们刚刚生成的sign的模式一样,param=flag.txt,action=readscan,sign=刚刚生成的
成功读取到flag
这里还有第二个方式,hash长度拓展攻击
这里就不是在flag.txt后面接一个read了,是利用hash的这个漏洞来拼接这个read
首先生成一个flag.txt的sign
/geneSign?param=flag.txt
hash拓展脚本
import hashpumpy
# sacn需要拼接一个read
h = "a54fe303932462179e629661e8242c03"
sign = hashpumpy.hashpump(h,'scan','read',24)
print(sign)
得到如下
('6b4b0dfd4023edd12835febbe95dadbe', b'scan\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xe0\\x00\\x00\\x00\\x00\\x00\\x00\\x00read'
这个\\x需要换成%
scan%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%e0%00%00%00%00%00%00%00read
这时候我们拿这个去伪装cookie
成功拿到flag
[RoarCTF 2019]Easy Java
第一次做java站的题
一进去有一个登录框,下面有一个help
会跳转到这个页面
Download?filename=help.docx
但是返回是notfound
换post试了一下,竟然还真下载到了
那么看看能不能去找到WEB-INF/web.xml,找里面的路由
看里面果然有一个flag路由
找他的servlet
这个已经给了com.wm.ctf.FlagController,要去找找前面的目录,刚好最近在搞java开发,对比了一下自己的目录
试了几次,发现这个成功了
/Download?filename=WEB-INF/classes/com/wm/ctf/FlagController.class
以上是关于[BUUCTF]刷题记录8的主要内容,如果未能解决你的问题,请参考以下文章