ASISCTF2017-Mathilda-writeup
文件包含 apache配置userdir
Task
|
|
Solution
打开后是如上,查看源代码,发现:
访问:http://178.62.48.181/~rooney/ 。底下有个file选项,链接为: http://178.62.48.181/~rooney/?path=rooney
猜测path参数存在文件包含漏洞。经过尝试,可以发现后端会把path参数里的../
替换为空。如下:
尝试读取index.php,如果直接访问 http://178.62.48.181/~rooney/index.php?path=index.php ,会发现直接返回Security failed!
,鉴于会过滤../
,可以用p../hp
来绕过。经过一番尝试,最后访问:http://178.62.48.181/~rooney/index.php?path=..././index.ph../p
不过似乎没啥信息。
接着尝试读取 /etc/passwd
,比如路径为 ../../../../etc/passwd
,则根据过滤,传入的参数应为:..././..././..././..././etc/passwd
。
访问:
或者访问
最底下有一行:
说明存在一个用户:th1sizveryl0ngus3rn4me
接下来需要知道一些apache的知识。apache中有一个功能 Per-user web directories。在多用户的操作系统上,如果apache配置了UserDir,则每个用户可以在自己的目录下建立一个web服务器,对应的url即为:http://example.com/~username/ ,就本例而言 http://178.62.48.181/~rooney/ 即表示rooney用户自己的目录的web服务器。
所以尝试访问: http://178.62.48.181/~th1sizveryl0ngus3rn4me ,结果直接返回个 Invalid Device 。
继续看看关于apache:UserDir的知识。UserDir指令可以指定被网络读取的用户网站目录,有如下几种不同的形式。
- 路径前没有反斜杠,则被当作用户目录下的文件夹,比如配置为:1UserDir public_html
那么 http://178.62.48.181/~rooney/index.php 会被解释为 /home/rooney/public_html/index.php
- 路径前有反斜杠,则利用路径和文件名构造。比如配置为:1UserDir /var/html
那么 http://178.62.48.181/~rooney/index.php 会被解释为 /var/html/rooney/index.php
- 如果路径中存在星号
*
,则用用户名去替代,比如配置为:1UserDir /var/www/*/docs
那么 http://178.62.48.181/~rooney/index.php 会被解释为 /var/www/rooney/docs/index.php
- 设置多重路径,比如配置为:1UserDir public_html /var/html
那么 http://178.62.48.181/~rooney/index.php 会先去查找 /home/rooney/public_html/index.php ,如果找不到,那就去查找 /var/html/rooney/index.php
以上的这些配置指令取自Per-user web directories的例子。这些指令需要在userdir.conf中进行配置。我们尝试读取一下服务器端的userdir.conf,访问:
所以可以知道,如果我们访问:http://178.62.48.181/~th1sizveryl0ngus3rn4me/index.php
实际上会被apache服务器解释为 /home/th1sizveryl0ngus3rn4me/public_html/index.php 。由于直接访问不允许,我们可以利用 rooney 的文件包含来读取,访问:
所以看起来,我们用了非预期的解法hhh。可以看出同目录下就有flag.php,我们可以直接读取:
得到flag: