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
为\\'
,前面的\
被转义失效,这样就成功绕过了'
的过滤,接下来执行报错注入即可