解题连接:http://ctf5.shiyanbar.com/10/upload/step1.php
拿到题目
查看源码后发现没什么有用的东西,所以我们先随便输入一下
看到了step2.php,我们访问试试
继续访问submit.php,就给出一个you are not an admin,抓包也没看到有用的东西,所以我们之后回头再看看step2.php的信息,这里看了大佬的wp,得知源码这里提示了vim
而vim是linux的一个编辑器,
vim产生的备份文件和临时文件
一、vim备份文件
默认情况下使用Vim编程,在修改文件后系统会自动生成一个带~的备份文件,某些情况下可以对其下载进行查看;
eg:index.php普遍意义上的首页,输入域名不一定会显示。 它的备份文件则为index.php~
二、vim临时文件
vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是submit,则它的临时文件
submit.swp。如果文件正常退出,则此文件自动删除。
这里参考了这篇文章http://www.cnblogs.com/zwfc/p/5466885.html
这下我们得知,vim回产生一个备份文件,所以我们访问submit.php.swp试试,结果弹出个not found
后面查了才知道,是我的访问方式错了,文件名前面还得加个.成功访问后得到一段代码
........这一行是省略的代码........
/*
如果登录邮箱地址不是管理员则 die()
数据库结构
--
-- 表的结构 `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`token` int(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
--
-- 转存表中的数据 `user`
--
INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可见***', '***不可见***', 0);
*/
........这一行是省略的代码........
if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail'); //要求token的长度为10
if($token!='0') die('fail'); //token又要等于0
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
$r = mysql_query($sql) or die('db error');
$r = mysql_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;//重点
}else{
echo "失败了呀";
}
}
根据这段代码我们得知:
- 要传两个值,一个token,一个是emailAddress
- token长度为10且为0
- 正确的emailaddress
知道这三点后,我们一个个解决
1.首先之前源码有提示是get传值
2.token有这两个要求的话,首先长度为10就一定得是十位,又因为php是弱类型语言, 所以当成0000000000只要不用===号判断,那么就相当于0,于是就构造token=0000000000
3.地址之前在step2的时候查vim就发现了
所以最后的payload就是:http://ctf5.shiyanbar.com/10/upload/submit.php?token=0000000000&[email protected]
于是得到flag
总结:讲道理这道题不能说很简单,至少vim这一块的知识不了解的话就没得办法了,然后这题许多信息都放在了源码中,需要我们经常回头去查找,收获了vim备份文件的知识还是挺不错的
今天是我的本命:巧爷