2021.1.11
菜鸡今天又来水题了
【狗头】
以后决定,先把题解写好,然后再总结知识点,不然战线拉得太长效率也不高。
Writeup
首先打开题目环境:
本以为很高大上,结果就是一个简陋的不能再简陋的前端页面,一个简单的图片,加上几个点都点不了的导航栏,点了一圈,发现只有设备维护中心能点进去。
也是一个简陋的页面,直接F12,看到了?page=index,可以GET传入名为page的参数。根据大佬wp的思路提醒我,应该自然的联想到可能存在利用文件包含读取网页源代码的漏洞,于是构造payload:
这时index.php文件的源代码就以base64编码的格式返回到页面上,我们查看源代码:
对其进行base64解码,即可得到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();
}
查看源代码我们知道,有三个参数pat,rep,sub。简单的说就是再subject里查找是否有pattern格式的字符串或数组,然后用replacement代替。
这时候重点来了,就是preg_replace()这个函数,存在/e漏洞,会对PHP代码进行执行。
还有一个要注意的SERVER中,X-Forwarded-For这个请求头一定要是127.0.0.1。
在burpsuite中抓包,然后send to repater,先把http请求头加上,然后构造payload如图,先测一下ls
根据提示找到不一样的目录,因为flag可能藏在里面,所以我们查看s3chahahaDir这个目录,注意要对空格和and符号进行URL编码。
果然,看到了flag文件夹,然后进入flag
看到了flag.php,然后cat flag.php就能得到flag啦!
又到了每日艰难的知识点总结环节【狗头】
- ?page=
- 如何想到文件包含?nikto
- 文件包含漏洞
- php://filter
- base64编码解码
- X-Forwarded-For
- preg_replace()的/e漏洞
- system()函数书写
nikto
nikto是一个Web服务器扫描仪,适合短时间内对Web服务器进行目标扫描,并发现漏洞,但是他不是隐藏的扫描,意味着每次扫描都会被记录到对方的服务器日志的高级防火墙中。
最终发现了,形如这样的扫描结果,这个就比较好理解了,属于文件包含漏洞。
(小白没啥经验,得多看看工具咋用)
php://filter
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
简单的说,可以理解为经常用它进行base64编码,可以运用多种过滤器(字符串/转换/压缩/加密),经常用于读取文件或源码。
php://filter/read=convert.base64-encode/resource=file://文件路径
对应的知识应该还有文件包含漏洞和PHP伪协议,但是这两个稍显重要,篇幅应该略长,日后专门写。【狗头】
preg_replace()
简单描述为:
preg_replace($pattern, $replacement, $subject)
//作用:搜索subject中匹配pattern的部分, 以replacement的内容进行替换。
$pattern: 要搜索的字符串或字符串数组,是一个正则。
$replacement: 用于替换的字符串或字符串数组。
$subject: 待替换的目标字符串或字符串数组。
一句话就是如果pattern中带着/e,并且pattern和subject的内容一致,则会直接执行repalcement的代码。
base64编码
下面即为解码后的PHP源代码。