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

https://www.ichunqiu.com/battalion?t=1&r=0

opcode中的 BEGIN_SILENCE就是@,不显示报错信息
猜测opcode中的 EXT_STMT就是;,表示一个语句的结束

opcode中的FETCH_R意思是从某个变量中取出值并把这个值赋给另一个变量

详细信息参考php opcode

JMPZ,若比较结果为false,则跳转到指定地址处的代码
i春秋 “百度杯”CTF比赛 十月场 Vld

vld输出结果的分析如下:

<?php

echo 'do+you+know+Vulcan+Logic+Dumper%3F%3Cbr%3E';

$a = @$_GET['flag1'];
$b = @$_GET['flag2'];
$c = @$_GET['flag3'];

比较 $a 和 'fvhjjihfcv'是否相等
 如果不相等,跳转至38  
 继续执行39,输出  'false%3Cbr%3E'
 
比较 $b 和 'gfuyiyhioyf'是否相等
 如果不相等,跳转至35 
 继续执行36,输出  'false%3Cbr%3E'
  
比较 $c 和 'yugoiiyhi'是否相等
 如果不相等,跳转至32
 继续执行33,输出  'false%3Cbr%3E'

如果以上三个判断都为true,就会执行30
ECHO  'the+next+step+is+xxx.zip'

所以我们要向index.php提交三个参数,flag1、flag2、flag3,值分别为:fvhjjihfcv、gfuyiyhioyf、yugoiiyhi

这是返回结果

do you know Vulcan Logic Dumper?
the next step is 1chunqiu.zip

直接使用URL访问1chunqiu.zip,我们就可以得到一份源代码

审计源代码,发现存在SQL注入漏洞

    $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));

$username变量中与$number相等的字符串会被替换为"",我们可以结合dbmysql.class.php中的safe_data成员方法中的addslashes函数来进行'的绕过

PHP的一个语言特性,PHP中的addslashes函数除了会对 ' " \ 进行转义之外,还会对 url编码为 %00 的字符进行转义,转义结果为 \0,因为在ascii码中,0对应的字符为 \0,是没有办法直接输出的,但是使用addslashes函数之后,就可以显示了 ,\\0 输出就是\0

这一点我们可以通过在本地环境中验证来得到

然后我们就可以在burp suite这样来构造我们的$number$username

$number = 0
$username = %00'

$username的处理结果为\0\',因为我们构造的$number0,因此最终的$username\\',前面的\被转义失效,这样就成功绕过了'的过滤,接下来执行报错注入即可

上一篇:谷歌AlphaGo弱爆了 人机***颠峰大战揭秘


下一篇:入门题-01——没错,题目就是flag!