实验吧–忘记密码了
知识点:vim编辑器会产生备份文件.swp
解题流程:
打开链接发现就是一个页面,什么提示也没有,源代码也好像没什么
接下来,我们就随便写一个email上去,他显示
你邮箱收到的重置密码链接为 ./step2.php?email=youmail@mail.com&check=???????
然后我我们访问这个step2.php地址,发现他会马上跳转到step1.php,那这里面的关键信息肯定再这个step2.php中。
通过Burp抓包http://ctf5.shiyanbar.com/10/upload/./step2.php ,再repeater里面go,发现返回的会被跳转的页面信息,整理一下得。
> <meta name=”admin” content=”admin@simplexue.com” />
>
> <meta name=”editor” content=”Vim” />
>
> <form action=”submit.php” method=”GET”>
>
> <h1>找回密码step2</h1>
>
> email:<input name=”emailAddress” type=”text” value=”test@test.com” disable=”true”/></br>
>
> token:<input name=”token” type=”text” /></br>
>
> <input type=”submit” value=”提交”>
>
> </form>
分析上面的代码可知,这个页面会有两个输入框,输入的email和token会以GET方式提交到submit.php文件中去。
于是乎,我们就直接访问这个submit.php文件–http://ctf5.shiyanbar.com/10/upload/submit.php ,但是显示 you are not an admin。
猜测,这个文件可能会判断你传入的email和token是否是某个值,可能就是类似于下面的代码模式。
if(isset($_GET["emailAddress"])&&$_GET["emailAddress"]=="???"){ 这里再进行满足条件后的操作。。。。。。 } else{ echo "you are not an admin" }
于是,觉得应该要传入某个值,此时想到初始step1页面,header标签里的
<meta name="admin" content="admin@simplexue.com" />
会不会是这个(感觉怪怪的全都要留个心眼),于是就把这个email传过去,输入
http://ctf5.shiyanbar.com/10/upload/submit.phpemailAddress=admin@simplexue.com&token=
因为要传入两个值,而另一个token的值目前还没有头绪,就传个空值进去
这时候,没有出现 you are not an admin ,说明我们的猜测还是对的,但是token的值我们还不知道,也许知道了token的值再传到submit.php里面,结果就出来了。但是要知道token该怎么输入,需要符合怎样的格式,肯定要知道submit.php这个文件是怎么处理的,该怎么办呢。
这时候,就要用到vim这个条件了,vim这个编辑器,会产生一些BUG。
一、vim备份文件
默认情况下使用Vim编程,在修改文件后系统会自动生成一个带~的备份文件,某些情况下可以对其下载进行查看;
eg:index.php普遍意义上的首页,输入域名不一定会显示。 它的备份文件则为index.php~
二、vim临时文件
vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是submit,则它的临时文件
submit.swp。如果文件正常退出,则此文件自动删除。
形如:
http://ctf5.shiyanbar.com/10/upload/.submit.php.swp
三、这两个文件要正确处理,否则一些黑客会利用它。还有就是有时候ctf比赛的时候这俩小知识点也是考察的一个点
那我们试试看,程序员有没有把submit.php的vim漏洞堵上。
先输入http://ctf5.shiyanbar.com/10/upload/submit.php~,发现404 。备份文件没了。
再输入http://ctf5.shiyanbar.com/10/upload/.submit.php.swp ,出现了。果然有后门。注意前面有个点。
if(!empty($token)&&!empty($emailAddress)){ if(strlen($token)!=10) die('fail'); if($token!='0') die('fail'); $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必须==”0”,且长度要为10,这就用到了php中==的模糊判断后门了,他不会管你的类型是不是匹配,只要换算成数字相等就是true,于是机智的想起填入十个”0”,也就是输入
http://ctf5.shiyanbar.com/10/upload/submit.phpemailAddress=admin@simplexue.com&token=0000000000 flag就出现了。完结撒花。