题目描述: 其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
题目链接点进去如下:
可以看到界面上有一个设备维护中心,点击设备维护中心,跳转到如下界面
再次点击,发现变成这样了
1. 思路分析
从已知信息来看,就只有一个page参数可利用,且输入的参数如果是字符串和数字的话就会回显在界面上。尝试输入一些特殊字符,发现无回显,说明注入命令之类的方式大概率行不通。这种回显的问题和之前的一道题unserialize3有点类似,但是这里没有php源码。
前端也只有一个页面,没有其它额外的信息提供,到这里没有思路了,网上参考其它人的解法
攻防世界web进阶区ics-05详解_無名之涟的博客-CSDN博客
这里提到了使用php伪协议可以获取到源码(这个在知识面外了,了解这个充当知识积累)
知道了关键点就ok了,获取到源码,然后根据源码逻辑进行绕过即可
2. 解题过程
2.1 先使用php伪协议获取源码 page=php://filter/convert.base64-encode/resource=index.php
使用base64进行解码(Base64 编码/解码 - 在线工具),解码出来后关键代码如下:
2.2 分析源码,确定POC
不携带page参数的情况下,源码中存在几个点可以构造
a. X_FORWARDED_FOR头部字段必须是127.0.0.1
b. 会传入三个参数,pat, rep和sub,然后执行preg_replace函数进行字符串替换
我们先试试随机构造X-Forwarded-For以及pat, rep和sub,这个时候要去掉page,结果如下:
既然进入到这里的逻辑了,那么该如何利用呢? 唯一的利用点就是preg_replace函数了,不过对这个函数不了解,不清楚该如何利用,搜索这个函数的漏洞(慎用preg_replace危险的/e修饰符(一句话后门常用)_php技巧_脚本之家),发现这个函数存在一个危险的/e修饰符,通过/e修饰符可以实现命令注入
2.3 通过preg_replace实现命令注入
既然知道了preg_replace有个/e参数,那么我们构造如下POC实现命令注入
GET /index.php?pat=/(\w )/e&rep=system('ls')&sub=abc
从结果来看,存在回显,命令已经执行。
ok,既然存在命令执行,那没啥好说的,直接find我们的flag
GET /index.php?pat=/(\w )/e&rep=system('find / -name *flag*')&sub=abc
这里第一行的应该就是我们要找的flag了,将其内容输出即可(经验证flag为第二个文件/var/www/html/s3chahahaDir/flag/flag.php)
GET /index.php?pat=/(\w )/e&rep=system('cat /var/www/html/s3chahahaDir/flag/flag.php')&sub=abc
最终获取到flag:cyberpeace{1ce2c80d4459c731bfe0fa97c2a007bf}
总结:这道题的关键点主要有三个,一个是通过php伪协议获取源码,一个是X-Forwarded-For头部字段伪造,还有一个是利用preg_replace的/e修饰符进行命令注入(PS:扩充了我的知识面)