标签:数据库 group 代码 转换 lis lse gic word nop
打开题目看到提示 "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 opcode、sql 报错注入)
标签:数据库 group 代码 转换 lis lse gic word nop
原文地址:https://www.cnblogs.com/leixiao-/p/9784904.html