一、我们先来看一下很多网络设备都有的一个常见功能--连通性测试:
很多网络设备都具备与其他设备通信,联动的功能,例如网络设备联动安全设备,网络设备联动认证设备等等。此时都需要一个对端IP和对端端口号作为配置依据。而且一般都有连通性测试功能,作为配置运维人员检查的工具,但是如果没有做好,就会成为攻击者的一款扫描器:
二、我们来看看如何实现这类功能:
1-views.py
1 def ping(request): 2 if request.method not in ["POST","GET"]: 3 return HttpResponseRedirect("/myapp1/ping") 4 if request.method == "GET": 5 return render_to_response("ping.html") 6 if request.method == "POST": 7 try: 8 ipaddr = request.POST["ip"] 9 port = int(request.POST["port"]) 10 except Exception,reason: 11 return HttpResponse("parameters error,reason:%s"%str(reason)) 12 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 13 try: 14 sock.connect((ipaddr,port)) 15 sock.close() 16 return HttpResponse("OK") 17 except Exception,reason: 18 sock.close() 19 return HttpResponse("No")
2-urls.py
1 urlpatterns = [ 2 # Examples: 3 # url(r'^$', 'mysite1.views.home', name='home'), 4 # url(r'^blog/', include('blog.urls')), 5 #url(r'^login/', "myapp1.views.login"), 6 #url(r'^sql/', "myapp1.views.sql_injection"), 7 #url(r'^mainpage/', "myapp1.views.main"), 8 #url(r'^verifycode/', "myapp1.views.verify"), 9 #url(r'^update/', "myapp1.views.update"), 10 #url(r'^session/', "myapp1.views.sessioncheck"), 11 url(r'^ping/', "myapp1.views.ping"), 12 #url(r'^register/',views.register.as_view()), 13 #url(r'^game/',views.savegame.as_view()), 14 ]
3-ping.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>网站连通性测试</title> 5 </head> 6 <body> 7 <center> 8 <form action="http://127.0.0.1:8000/myapp1/ping/" method="post"> 9 <p>IP地址:<input type="text" name="ip"/></p> 10 <p>端 口:<input type="text" name="port"/></p> 11 <input type="submit" value="测试"> 12 13 </form> 14 </center> 15 </body> 16 </html>
来看功能截图:
结果如下:
反之亦然,我们来看:
结果如下:
很明显我们可以构造脚本,对此进行利用,做到内网探测,寻找开放端口,本来一个好好的功能就变成黑客手里的工具了。
如何利用,太简单了,写一个脚本构造post报文,探测就可以了:
1 #随便写一个利用的demo代码: 2 import requests 3 4 def send(ip,port): 5 response = requests.post("http://127.0.0.1/myapp1/ping",data={"ip":ip,"port":port}) 6 if response.content.find("OK") >= 0: 7 return "open" 8 else: 9 return "filter"
三、防御这类问题:
首先要明确是的的确确是一个SSRF漏洞,第二点明确这的的确确是一个需求。
防御的办法:
1、加一个频率限制,缓解措施。
2、加一个验证码,基本可以杜绝扫描一类的恶意利用。