https://www.ichunqiu.com/battalion?t=1&r=0
opcode中的 BEGIN_SILENCE就是@,不显示报错信息
猜测opcode中的 EXT_STMT就是;,表示一个语句的结束
opcode中的FETCH_R意思是从某个变量中取出值并把这个值赋给另一个变量
详细信息参考php opcode
JMPZ,若比较结果为false,则跳转到指定地址处的代码
对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\',因为我们构造的$number为0,因此最终的$username为\\',前面的\被转义失效,这样就成功绕过了'的过滤,接下来执行报错注入即可