解决nginx 反代 tomcat 应用不能获取到正确域名 技术文章
今天在帮朋友迁移部署tomcat应用得时候遇到了这么个问题:原来是在Windows服务器上直接使用tomcat部署到80端口的,新机器是Linux+宝塔面板,要是直接部署到80端口,其他网站或者nginx这类的就只能换端口,很是不方便,我就建议她使用nginx反代tomcat应用,那么问题就来了,我不是第一次使用nginx反代,但是之前都是反代后端的网络应用,不存在这些问题,使用宝塔添加了网站后,把应用上传到tomcat的webapps目录下,名称为shop,在网站设置启用tomcat,但是测试的时候就发现后端不能获得网站使用者正确的请求域名,获取的是本地的,http://127.0.0.1:8080/shop/xxxxxx,导致出现一些bug,返回的路径是本地的:
经过初略阅读+搜索应用源代码,找到了关键代码:
想吐槽一下这个程序员,不合格!!!这都9102年了,判断居然没有443???WTF!!!不让程序使用SSL???什么操作。。。
先说一下这个 request.getServerName() ,根据API上写的:
Reconstructs the URL the client used to make the request. The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.
也就是说, getRequestURL() 输出的是不带query string的路经(含协议 端口 server path等信息).
并且,还发现:
request.getScheme() //总是 http,而不是实际的http或https request.isSecure() //总是false(因为总是http) request.getRemoteAddr() //总是 nginx 请求的 IP,而不是用户的IP request.getRequestURL() //总是 nginx 请求的URL 而不是用户实际请求的 URL response.sendRedirect( 相对url ) //总是重定向到 http 上 (因为认为当前是 http 请求)
接下来就该批斗宝塔了!
看看默认的启用tomcat的配置里面没有 proxy_set_header Host $host;
最关键的就是没有这个,导致后端的Java程序的 request.getServerName() 获取不到正确的域名!
所以解决办法也简单,那就是在你的反代location里面加上 proxy_set_header Host $host; 后端就可以正确获取到当前的浏览器域名了。完事儿。
最后说一下,如果后端不是我上面说的那个不合格的程序员写的没有判断HTTPS的话,只需要在location里面添加 proxy_set_header X-Forwarded-Proto $scheme; 即可正确处理HTTPS了。
日常踩坑记录。。。
参考:
https://www.cnblogs.com/interdrp/p/4881785.html
https://blog.csdn.net/tpkey/article/details/18550039
CVE-2019-12409/Apache Solr由于错误配置JMX RMI导致远程代码执行漏洞 业界新闻
0x1 背景
Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。
Solr仅新版本 8.1.1, 8.2.0受到该漏洞影响,Solr用户不应该把自身的 Solr 集群暴露于公网之中。
在Linux 下的环境下的Apache Solr 8.1.1和8.2.0版本中默认启用不安全配置(ENABLE_REMOTE_JMX_OPTS="true"),如果开启JMX监听服务,可能导致远程代码执行的风险,建议使用Apache Solr的用户尽快更新到无漏洞版本或
由于 Solr 新版默认启动时开启JMX服务,如果你的服务器是在公网上,请立即做好环境网络配置自查工作,或关闭JMX相关功能。
0x2 漏洞详情
Java ManagementExtensions(JMX)是一种Java技术,为管理和监视应用程序、系统对象、设备(如打印机)和面向服务的网络提供相应的工具。
JMX 作为 Java的一种Bean管理机制,如果JMX服务端口暴露,那么远程攻击者可以让该服务器远程加载恶意的Bean文件,随着Bean的滥用导致远程代码执行。
CVE-2019-12409漏洞:在Linux 下的环境下的Apache Solr 8.1.1和8.2.0版本存在默认不安全配置(ENABLE_REMOTE_JMX_OPTS="true"),通过该配置开启RMI服务(默认监听在TCP 18983端口)后,攻击者可利用网上公开的JMX漏洞利用工具进行远程代码执行(RCE)攻击,从而获取服务器权限。
1.启动一个可以被用于远程类加载的 MLet web服务
2.使用JMX服务使目标服务器远程加载恶意类
3.调用恶意 Bean 实现代码执行
0x3 漏洞证明
0x4 修复&缓解措施
临时缓解措施:
本次官方更新主要更新配置选项ENABLE_REMOTE_JMX_OPTS为false,因此在不影响业务系统正常运行的情况下,可以直接修改Apache Solr的bin目录里的solr.in.sh配置文件中的ENABLE_REMOTE_JMX_OPTS字段值为false,修改完配置需要重启服务才能生效。
附漏洞POC利用地址:
https://github.com/jas502n/CVE-2019-12409
参考地址:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12409
https://nosec.org/home/detail/2544.html
https://www.n0tr00t.com/2015/04/17/JMX-RMI-Exploit-Demo.html
https://github.com/mogwailabs/mjet
自定义百度网盘分享密码 (Javascript) 杂七杂八
转载自:GIUEM
首先看下效果吧。(一不小心就开车了)
链接: http://pan.baidu.com/s/1gf4jcQZ 密码: mrxn
原理:
分析代码发现,百度网盘的自定义密码是在本地生成的
这也就给了我们玩耍的机会。
实现方法:
不二 和 LiesAuer 他们都是采用构造请求的方法,我觉得不够 hacker,而且不太方便。
所以我决定采用 JS 的方式修改密码。
方法很简单:修改 makePrivatePassword 这一函数即可。
具体代码
说明:代码可以转载,但请不要说是你原创之类的话!!!
压缩版
javascript:require(["function-widget-1:share/util/service/createLinkShare.js"]).prototype.makePrivatePassword=function(){return prompt("请输入自定义的密码","1234")}原版
require(["function-widget-1:share/util/service/createLinkShare.js"]).prototype.makePrivatePassword = () => { return prompt("请输入自定义的密码", "1234") }
使用方法 :
别急,你可别复制走代码就用了,一不小心就会出现这样的错误:
Uncaught Error: Cannot find module `function-widget-1:share/util/service/createLinkShare.js`(…)
首先,选择要分享的文件,点击分享按钮。 这时候,按 F12 打开控制台,切换至 Console ,输入代码按回车即可。
当然,你也可以存为书签,点一下书签。 然后点击创建私密链接,会弹出输入框,输入密码即可!
注意使用代码前要先点一下 分享 按钮,相关模块才会载入,这时候用代码才有效果。

密码类型
必须是 4 个字符。
如:
abcd
1234
ab12
啊a (中文加一个数字或字母)
其他类型请各位自己探索,可在下方给我留言。
好像如果密码有中文,第一次访问时会提示错误,刷新一下才正常。
关于A+B+C问题三种语言的解决办法,Java、C语言、Python 代码人生
原题是这个样子的:
这是一个非常简单的题目,意在考察你编程的基础能力。千万别想难了哦。输入为一行,包括了用空格分隔的三个整数A、B、C(数据范围均在-40~40之间)。输出为一行,为“A+B+C”的计算结果。
样例1
输入:
22 1 3
输出:
26
由于我也是刚刚接触Python,所以代码有点长,希望有大神可以指出,帮助我改进,在此 感激不尽!下面就开始贴上我的代码吧,顺序分别是Java、C、Python
Java:
import java.util.Scanner; class Main { public static void main(String[] args) { int a,b,c; Scanner input=new Scanner(System.in); a=input.nextInt(); b=input.nextInt(); c=input.nextInt(); if((a>=-40&&a<=40)&&(b>=-40&&b<=40)&&(c>=-40&&c<=40)) System.out.println(a+b+c); else System.out.println("erro"); } }
C语言:
#include<stdio.h> int main(void) { int a, b, c; scanf("%d%d%d", &a, &b, &c); if(a > 40 || a < -40 || b > 40 || b < -40 || c > 40 || c < -40) return 0; printf("%d", a+b+c); return 0; }
Python:
lst = raw_input().split(' ') sum = 0 for i in lst: sum = sum+int(i) print sum
至于其他的语言,比如什么C++/Ruby,目前还不会。暂且略懂贴出来的这三种语言外加PHP。还希望高手多多指教。最近博主比较忙,也就是要学习Python了,所以,更新估计会慢,还请大家多多包含,多多支持!谢谢!