【ctfshow】Web入门-命令执行wp(连载中)
Web29

不允许出现flag,这好办,先ls列出文件,然后cat fl*来规避flag匹配即可。
Web30

不让用system了,用passthru即可。
Web31

过滤空格和点其实是最要命的,这就让我们很难通过普通的命令执行去读文件,那我们就换一种思路,先获取到文件本身再使用show_source之类的函数读取内容,这里采用无参RCE的方式。
获取目录下所有文件:
?c=print_r(scandir(pos(localeconv())));
pos(localeconv())获取点,pos可以写成current,两个函数一样的。
读取flag.php:
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
其中先用array_reverse进行翻转,使得flag.php变成第二个文件,再用next指向它,show_source获取到flag.php的内容。试了用两次next不好使,还不理解为什么。
Web32

过滤了分号和左括号,非常难受,但我们想起萌新区的RCE题,分号可以用?>来代替,过滤左括号可以构造文件包含配合伪协议读取文件内容。
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
Web33

多过滤了一个双引号,问题不大,使用上一题的payload即可绕过。
Web34

过滤了冒号,但可以使用上一题的payload,为什么呢。
因为我们get的c并不是我们输入的整个串,而是&之前的部分,这部分里不出现问题即可。
Web35

多过滤了左尖括号和等号,但是对于33的payload使用完全没有影响,还用那个就行。
Web36

多过滤了斜杠和数字,还是没有影响,接着用。
Web37

使用了文件包含,第一想法是伪协议,由于过滤了flag,所以想用base64编码的data伪协议来绕过flag的输入,payload:
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
Web38

多过滤了php和file,但还是可以使用data伪协议绕过。同时本题也可以包含日志文件进行日志注入。
Web39

伪协议data://text/plain,已经相当于执行了php语句,.php因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么作用,直接传入即可:
?c=data://text/plain,<?php system("tac fla*");?>
Web40

过滤了数字和各种符号,但是!!!!注意看过滤的是全角括号,所以英文括号完全没问题,采用无参RCE就行。
还有另一种解法,是利用cookie获取参数进行命令执行(GXYCTF的禁止套娃)。
Web41

无数字字母shell,需要用各种符号和运算来获取数字和字母,这里用了个强力脚本直接梭了。
Web42

/dev/null是一个只写文件,相当于一个黑洞,>/dev/null 2>&1就是丢弃一切输出流(包括正确和错误的)。
我们需要让system执行完命令之后不要执行后面的丢弃,需要使用命令分隔符。
可以使用换行符%0a分隔命令,输入ls%0a即可执行ls并回显。
Web43

过滤cat,用tac即可。
Web44

又过滤了flag,但是问题不大,用通配符*即可。
Web45

又过滤了空格,使用${IFS}即可绕过。
Web46

过滤了星号,数字和美元符号,过滤数字意味着不能使用%0a分隔,那我们可以使用||代替,第一个命令失败时才会执行后面的。
过滤了美元符号,意味着不能使用${IFS}绕过空格,可以使用重定向符来代替。
输入:tac<fla'g'.php||即可。
Web47

又过滤了5个读文件的命令,不过还有tac和nl在外面。
Web48

又过滤了几个之前完全不知道的命令,这也是对知识的补充,这题还是nl或tac即可。
Web49

过滤了百分号,不过没什么影响,只影响已经被ban掉的%0a,和上一题一样的payload即可。
Web50

又过滤了x09和x26两个hex字符,09是制表符tab,26是代替符sub,对解题没什么影响。
Web51

过滤了tac,只剩nl了。
Web52

过滤了重定向符,但是总感觉放出来了什么,原来是美元符放出来了,那就IFS走起了。
Web53

又过滤了wget,而且代码逻辑变了。不过这样就不需要命令分隔符了,反而更简单。
另外,实际上因为没有过滤引号,上面的题所有的关键字过滤都可以用引号绕过,例如c'a't是可以执行的。
Web54

在正则表达式中,点表示任意字符(不包括换行),*表示匹配前面的字符0次或多次,所以".*c.*a.*t.*"的意思就是在cat这个词中,每个字母前中后任何的位置插字符也不行,不插字符也不行,这一点就堵死了用引号绕过关键字的方式。但是这里少过滤了一种东西,那就是mv指令,我们可以利用mv命令给文件重命名:
mv${IFS}fla?.php${IFS}z.txt
然后ls一下,发现z.txt文件出现了,直接访问即可。
Web55

过滤了字母,本来以为是一个无数字字母shell,但是发现还过滤了分号,就没有办法用异或等方法来构造了。
这里我们看了P神的文章:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpxxxxxx,文件名最后6个字符是随机的大小写字母。
然后使用通配符来绕过字母,

浙公网安备 33010602011771号