BUUCTF-Web-[GWCTF 2019]我有一个数据库
本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助
打开靶机,看到一行乱,F12查看源码和Burp抓包没有找到有用信息,
用dirsearch扫描网站,
发现了phpmyadmin
,
phpMyAdmin 是一套开源的、基于Web的MySQL数据库管理工具。
可以通过URL打开,
注意到他的版本号为4.8.1
,通过网上搜索发现,这个版本的phpmyadmin
在源码上存在文件包含漏洞,
这是一个师傅对这个漏洞的讲解:https://blog.csdn.net/weixin_44037296/article/details/111039461
我们这里主要看他漏洞的原理,
漏洞位于index.php文件的文件包含逻辑中,具体在55-63行代码,
1 | // If we have a valid target, let's load that script instead |
要成功利用此漏洞,需要满足以下五个条件:
1.target
参数不为空
2.target
参数是字符串
3.target
不以”index”开头
4.target
不在黑名单中(黑名单包含import.php
和export.php
)
5.通过Core::checkPageValidity()
函数的检查
关键绕过点Core::checkPageValidity()
1 | /** |
构造payload:
1 | /phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../../../flag |
利用?
的二次编码进行绕过,%253f
是问号(?)
的二次URL编码:?
→ 第一次编码为%3f
%3f
→ 第二次编码为%253f
(1)当请求发送到Web服务器时:(第一次解码)
服务器自动对URL进行一次解码:%253f
→ %3f
此时参数值变为:
1 | db_sql.php%3f/../../../../../../flag |
(2)函数验证阶段(第二层解码)
前面的白名单检查通过不了,
到了$_page = urldecode($page);
1 | $_page = urldecode('db_sql.php%3f/../../...') |
→ 成功!因为db_sql.php
在白名单中(默认白名单中有),
虽然验证时检查的是db_sql.php,但实际包含的是:
1 | include 'db_sql.php%3f/../../../../../../flag'; |
%3f
在文件系统层面被当作普通字符(不是URL参数分隔符)
PHP的文件操作函数会正常处理包含路径遍历的路径
最终解析为绝对路径:/flag
测试成功,
获得flag