欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

“百度杯”CTF比赛 十月场 Vld

程序员文章站 2024-03-19 23:02:10
...

知识点

  • Vulcan Logic Dumper
  • 代码审计
  • SQL注入

WP

首先进入环境,查看源码发现index.php.txt,进入后发现是我看不懂的东西。。可以上网查Vulcan Logic Dumper,还弄懂怎么从这些东西来还原php代码,还原的代码如下:

 1 <?php
 2 
 3     echodo you know Vulcan Logic Dumper?<br>;
 4     $a=$_GET[‘flag1‘];
 5     $b=$_GET[‘flag2‘];
 6     $c=$_GET[‘flag3‘];
 7 
 8     if($a!=‘fvhjjihfcv‘)
 9     {
10         echofalse<br>;
11     }
12     elseif($b!=‘gfuyiyhioyf‘)
13     {
14         echofalse<br>;
15     }
16     elseif($c!=‘yugoiiyhi‘)
17     {
18         echofalse<br>;
19     }
20     else
21     {
22         echo ‘the next step is xxx.zip‘;
23     }
24 
25 
26     echo<!-- index.php.txt ?>;
 ?>

或者直接猜。。。大致看一下,发现了get,大致能看出来flag1,flag2,flag3,然后看到fvhjjihfcv,gfuyiyhioyf,yugoiiyhi,正好三串,大概率就是传三个进去。
然后得到1chunqiu.zip。得到源码,进行代码审计。

SQL注入的点在login.php的这里:

$username = $db->safe_data($_POST['username']);
$password = $db->my_md5($_POST['password']);
$number = is_numeric($_POST['number']) ? $_POST['number'] : 1;

$username = trim(str_replace($number, '', $username));

$sql = "select * from"."`".table_name."`"."where username="."'"."$username"."'";

safe_data是转义的:

    public function safe_data($value){
        if( MAGIC_QUOTES_GPC ){
            stripcslashes($value);
        }
        return addslashes($value);
    }

注意trim(str_replace($number, '', $username))
发现非常多余。。。大概率就是故意给的入口点。这题也就是利用这个来进行SQL注入。
首先我们要知道,addslashes除了转义单引号双引号和反斜杠,还会转义NULL。
转义结果如下:

<?php
$a=$_GET['a'];
$a=addslashes($a);
var_dump($a);

“百度杯”CTF比赛 十月场 Vld
因此这题可以这样构造来闭合sql语句,实现报错注入:

number=0
username=%00' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-- -

首先username会被addslashes转义成\0’,然后只能执行str_replace,username中0被替换为空,变成了\’,这样变成了反斜杠被转义,单引号成功逃脱。后面就可以进行报错注入了。

需要注意的是,后面的注入语句仍然不能有单双引号和0,尤其是0,因为0会被替换为空。
一般注入是这样的updatexml(1,concat(0x7e,database(),0x7e),1),因为0变成了空,所以十六进制就不能用了。
注意这些再进行报错注入就OK了。

反思

这题自己卡在了SQL注入那里,虽然注意到了那个str_replace,但是当时没想到这个可以闭合单引号,因此去思考其他的地方了。还是自己太菜了,还要努力学习!