i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper php opcodesql 报错注入)
Posted 淚笑-l3yx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper php opcodesql 报错注入)相关的知识,希望对你有一定的参考价值。
打开题目看到提示 "do you know Vulcan Logic Dumper?" ,再查看源码看到"<!-- index.php.txt ?>",访问后发现一堆看不懂的东西
这肯定就是所谓的Vulcan Logic Dumper了,先了解下相关概念
PHP内核-Zend引擎:http://www.php.cn/php-weizijiaocheng-355597.html
PHP中的opcode:https://blog.csdn.net/weiyuanke/article/details/76921476
Vulcan Logic Dumper:http://www.phppan.com/2011/05/vld-extension/
也就是说我们刚才看到的一堆代码其实就是借助vld得到的,php语言中供zend引擎执行的中间代码opcode。有了opcode便可以将其翻译成php代码。 网上也没找到翻译opcode的工具,只好借着对照表自己人工翻译了...
(opcode对照表:http://www.php.net/manual/en/internals2.opcodes.list.php)
这段代码比较简单,其实掌握下规律还是挺好分析的,这是我初步分析的结果
<?php echo\'do+you+know+Vulcan+Logic+Dumper%3F%3Cbr%3E\'; $0=$_GET[\'flag1\']; $1=$_GET[\'flag2\'] $2=$_GET[\'flag3\']; 21 如果$0不等于\'fvhjjihfcv\' 22 跳转到38行 24 如果$1不等于\'gfuyiyhioyf\' 25 跳转到35行 27 如果$2不等于\'yugoiiyhi\' 28 跳转到32行 30 echo\'the+next+step+is+xxx.zip\'; 31 跳转到34行 32 EXT_STMT 33 echo\'false%3Cbr%3E\'; 34 跳转到37行 35 EXT_STMT 36 echo\'false%3Cbr%3E\'; 37 跳转到40行 38 EXT_STMT 39 echo\'false%3Cbr%3E\'; 40 NOP 41 EXT_STMT 42 echo%3C%21--+index.php.txt+%3F%3E%0D%0A%0D%0A\'; ?>
进一步转换为php代码则为
1 <?php 2 3 echo \'do 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 echo \'false<br>\'; 11 } 12 elseif($b!=\'gfuyiyhioyf\') 13 { 14 echo \'false<br>\'; 15 } 16 elseif($c!=\'yugoiiyhi\') 17 { 18 echo \'false<br>\'; 19 } 20 else 21 { 22 echo \'the next step is xxx.zip\'; 23 } 24 25 26 echo \'<!-- index.php.txt ?>\'; 27 ?>
代码很简单,不用多解释
构造/?flag1=fvhjjihfcv&flag2=gfuyiyhioyf&flag3=yugoiiyhi
接着访问/1chunqiu.zip,下载完文件后解压,开始代码审计。
password经过md5加密,number只能是纯数字,所以都不存在注入点。但是username虽然经过addslashes()处理(单引号,反斜杠等前面都会被加上反斜杠而转义,防御sql注入),但是又再次被这句代码处理 " $username = trim(str_replace($number, \'\', $username)); ",所以我们可以利用这里让单引号逃逸出来,这句代码来的很突兀,而且没什么意义,很明显故意的漏洞。
构造number=0&username=%00\' &password=3
看到数据库报错,说明单引号逃逸成功,当username提交 %00\' ,经过addslashes()处理后(addslashes()会在NULL前加 \\ ,0等于NULL)是 \\0\\\'。而number也是0,所以将从username中去掉0,username则变成 \\\\\' ,单引号前的\\被\\转义,所以单引号逃逸成功,后台sql语句为 select * from`users`where username=\' \\\\ \' \' ,可见多出一个单引号,当然报错。
由于没有数据回显点,所以考虑进行报错注入,number=0&username=%00\' and updatexml(1,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,41),1) #&password=x&submit=
测试多次,无论表名列名都有4个字符不显示,本来以为服务器会过滤掉这段4个字符的字符串,但是尝试部分截取也还是不显示。。。 猜到是flag,所以就直接查询了
注意语句中不要再出现0了,,被坑了好久,最后才发现。。
以上是关于i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper php opcodesql 报错注入)的主要内容,如果未能解决你的问题,请参考以下文章
i春秋 “百度杯”CTF比赛 十月场 web题 Backdoor