i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper 、php opcode、sql 报错注入)
打开题目看到提示 "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代码则为
<?php echo 'do you know Vulcan Logic Dumper?<br>';
$a=$_GET['flag1'];
$b=$_GET['flag2'];
$c=$_GET['flag3']; if($a!='fvhjjihfcv')
{
echo 'false<br>';
}
elseif($b!='gfuyiyhioyf')
{
echo 'false<br>';
}
elseif($c!='yugoiiyhi')
{
echo 'false<br>';
}
else
{
echo 'the next step is xxx.zip';
} echo '<!-- index.php.txt ?>';
?>
代码很简单,不用多解释
构造/?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了,,被坑了好久,最后才发现。。
最新文章
- mac 下修改jenkins的 端口号
- NHibernate Demo 和 效率测试
- hdu 4185 二分图匹配
- Chart控件,把Y轴设置成百分比
- Amoeba:开源的分布式数据库Porxy解决方案
- 【UVA】【11021】麻球繁衍
- Jplayer(转)
- Linux内核是如何创建一个新进程的?
- Eclipse启动jboss局域网无法访问的问题
- UIAlertController的创建以及添加
- NET 2016
- 2.4 PCI总线的配置
- canvas动画气球
- Linux修改本机/etc/hosts的hostName
- SQL Server 之 内部连接
- Oracle logminer 日志挖掘
- BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)
- SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)
- 使用Python启动一个简单的服务器
- 求n(n>;=2)以内的质数/判断一个数是否质数——方法+细节优化
热门文章
- MySQL添加CSV文件中的数据
- 201871010109-胡欢欢《面向对象程序设计(java)》第八周学习总结
- python字典基本操作
- javaConfig下的springmvc配置
- loadrunner12 Runtime Settings位置
- Codeforces Round #605 (Div. 3) 题解
- [LeetCode] 9. Palindrome Number 验证回文数字
- Linux性能优化实战学习笔记:第五十讲
- 一次失败的尝试:arm(aarch64架构)上使用docker运行Gogs
- cloudstack4.11 centos7 安装文档