攻防世界-mfw
一道有关git泄露以及命令执行漏洞的题目
一、基础知识
- git泄露
Git是一个开源的分布式版本控制系统,开发者可通过其对站点进行部署。在配置不当的情况下,可能会将“.git”文件直接部署到线上环境,这就造成了git泄露问题。
漏洞确认方式:存在.git文件夹。漏洞利用:可以使用githack工具对泄露的文件进行下载。
使用方法,在cmd命令行输入python GitHack.py http://www.target.com/.git/自动下载文件
- assert函数(参考链接)
检查断言是否为false,将传入的参数视为代码执行。判断是否会执行错误,没有错误则返回True否则返回False,与在参数中传入调用外部命令的方法如system可以构造出一个webshell
-
PHP逻辑运算符
and、or、||、&&等,逻辑与在连接两个逻辑表达式时,若第一个为假就不会执行第二个表达式;逻辑或连接两个逻辑表达式时,若第一个为真就不会执行第二个。
二、解题过程
点进题目是几个页面,在About页面中发现了网站相关信息,看到git,尝试是否存在git泄露
在原url后加上/.git看是否存在目录。
存在此目录,使用GitHack工具下载源码。使用方法python GitHack.py http://61.147.171.105:64085/.git/
得到源代码,在index.php文件中发现有assert函数,存在命令执行漏洞
同时发现可通过可控变量$page来改变$file变量从而改变传入的代码字符串,结合system函数可以实现调用外部命令的目的。另外要想执行其他的函数,那么就要破坏strpos的结构。可通过')来对strpos进行闭合,同时使用//将后面的代码字符串非注释掉。中间可用逻辑运算符来连接其他想要执行的表达式代码。由于strops结构不完整,所以会返回false,所以我们用逻辑或连接system('ls')来实现代码执行。另外要在system()后加上;//来构成完整的php代码语句。
查看源码发现能够执行ls命令
执行cat templates/flag.php来查看flag
得到flag为<?php $FLAG="cyberpeace{4744d8196a4a73e15ccafe5c685aa555}"; ?>
三、一点好奇
另外中间用(按位与)【|】(小数点)【.】(按位异或)【^】拼接都能执行system(),具体原因是什么我还不知道。同时使用&&替代and不可以,而且按位与&也不能拼接,使用||替代or却可以。