关于postgresql不出网利用其实有一个小坑点,p神之前在自己的文章里没有仔细提到,导致大家本地可能都遇到了一些奇奇怪怪的问题。
众所周知,postgresql jdbc 的利用一般会用到下面这两个类:
org.springframework.context.support.ClassPathXmlApplicationContextorg.springframework.context.support.FileSystemXmlApplicationContext
这两个类的传参里都支持通配符,因此我们可以通过先打spring临时文件留存一个临时文件,然后通过通配符精确的指到tomcat的临时文件目录,这样就免去了爆破 fd 的麻烦,但这里面其实有个小坑点,就是这两个类对于通配符的处理逻辑有点神奇。
FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext 都继承 AbstractXmlApplicationContext,最终都走同一套 XmlBeanDefinitionReader 加载流程,通配符命中到的每个 Resource,都会被当作 XML Bean 定义去解析,解析是逐个进行的;只要其中一个资源抛出 BeanDefinitionStoreException / SAXException 等,整个 refresh() 会失败并退出


这也在我当时那个题目的设计之中,所以需要选手们对配置文件做一定的变形,让他既满足 java property 又满足 xml 格式,这样解析的时候才不会中途退出。许多师傅留存临时文件可能用的是 p 神之前知识星球发的那个脚本:

但这个临时文件的留存逻辑其实是通过流式上传缓慢的上传一个新文件,然后在里面不断的塞入a:

因此如果用p神这个脚本留存临时文件,然后再用通配符解析xml就会报错,因为那个fake.txt里全是a,不符合xml的格式,所以会报错退出:

要想真的稳定留存,这个新的fake.txt必须不破坏xml的格式,比如在前面先塞一段正常的xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="poc" class="java.lang.String">
<constructor-arg value="a" />
</bean>
</beans>
然后后面填充字符的时候不能用a,只能用换行符这种不会破坏xml格式的内容来填充体积