PolarD&N(swp)
一、网站地址:https://www.polarctf.com/
二、打开题目
三、解题思路
-
根据提示去找swp文件,首先了解什么是swp文件
-
swp即swap(交换分区)的简写,在编辑文件时产生,它是隐藏文件。这个文件是一个临时交换文件,用来备份缓冲区中的内容。类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。
-
如果文件正常退出,则此文件自动删除。如果并没有对文件进行修改,而只是读取文件,是不会产生swp文件的
-
swp文件名为 .filename.swp。直接访问.swp文件,下载回来后删掉末尾的.swp,获得源码文件
-
.swp的产生
1.当你用多个程序编辑同一个文件时
- 解决方法:选择readonly(只读)
2.非常规退出,强行关闭vi时,比如电源突然断掉或者你使用了Ctrl+ZZ,vi自动生成一个.swp文件,下次再编辑时就会出现一些提示。
- 解决方法:如果你正常退出,那么这个这个swp文件将会自动删除。
vi -r xxx.c
来恢复文件,然后用
rm -rf xxx.swp
删除swp文件,不然每一次编辑时总是有这个提示
如果你不想产生交换文件,可以在vim配置中 (/etc/vimrc) 添加
set noswapfile
命令禁止产生交换文件
也可以用添加
set swapfile
这条命令设置生成交换文件
-
四、下载并分析swp文件
-
访问/.index.php.swp,获得源码
function jiuzhe($xdmtql){ return preg_match('/sys.*nb/is',$xdmtql); } $xdmtql=@$_POST['xdmtql']; if(!is_array($xdmtql)){ if(!jiuzhe($xdmtql)){ if(strpos($xdmtql,'sys nb')!==false){ echo 'flag{*******}'; }else{ echo 'true .swp file?'; } }else{ echo 'nijilenijile'; } } #preg_match 函数用于执行一个正则表达式匹配 #strpos() 函数查找字符串在另一字符串中第一次出现的位置
-
首先网站用post方式接收了一个xdmtql变量,用if判断变量是否是数组,不是数组接下来交给jiuzhe函数,这个函数的作用是去匹配变量里的sys nb,匹配到了就输出nijilenijile,没有匹配到就进入下一个if语句,strpos这个函数的作用是匹配sys nb,如果匹配到了,就输出ture,然后由于有!所以变成false,条件成立输出flag
五、绕过
-
根据上面的分析,输出flag的条件是:POST传入、不能是数组、绕过preg_match函数、通过strpos函数
-
preg_match()绕过方法
- 数组绕过,即传入的参数为数组,此题不适用
- 利用PCRE回溯次数限制绕过:让回溯次数超过最大限制就可以使preg_match()函数返回false,从而绕过限制,中文的回溯次数在100万次就会崩溃,这个回溯保护使PHP为了防止关于正则表达式的DDOS
- 换行符绕过:.不会匹配换行符,所以使用%0a就可以绕过,此题不适应
-
绕过
import requests data = {"xdmtql": "sys nb" + "aaaaa" * 1000000} res = requests.post('http://xxx.www.polarctf.com:8090', data=data, allow_redirects=False) print(res.content)
-
获得flag