1 配置应用开启druid WAF web.xml 配置servlet,以便于监控 <servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <init-param> <!-- 用户名 --> <param-name>loginUsername</param-name> <param-value>druid</param-value> </init-param> <init-param> <!-- 密码 --> <param-name>loginPassword</param-name> <param-value>druid</param-value> </init-param> </servlet><servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern></servlet-mapping> spring配置开启Filter //Filter别名配置在文件Druid-xxx.jar/META-INF/druid-filter.properties中 <!-- 加载数据库配置信息 --><context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="username" value="${jdbc.username}"/> <property name="url" value="${jdbc.url}"/> <property name="password" value="${jdbc.password}"/> <property name="filters" value="stat,wall"/> //加上这一行配置,Filter才会生效</bean> mybatis配置SQL注入语句 <!-- 查询单个用户 --><select id="queryUserByName" resultMap="BaseResultMap" parameterType="String"> SELECT id, username, password FROM users where username = "${username}" </select> 2 注入测试 当用户名存在时返回 true 当用户名不存在时返回 false 闭合SQL语句,被Filter拦截 druid后台查看拦截原因 使用current_user绕过 条件不成立返回false,成立返回异常 如上图所示,因为等式成立,所以返回多个结果 ,但因为mybatis当前语句只能返回一个结果集,所以抛出异常nested exception is org.apache.ibatis.exceptions.TooManyResultsException substr()与ascii()盲注 最终发现,并不能在druid开启拦截的情况下通过注入获取任意数据。不过在登陆框存在注入时,仍然可以使用万能密码进行登陆。 万能密码 用户名任意填写密码处:" or password like "%% 3 Druid连接WallFilter拦截 默认配置下,druid拦截的关键字与函数 function: version load_file database schema user system_user session_user benchmark current_user sleep xmltype receive_messageschema: information_schema mysql performance_schema variant: basedir version_compile_os version datadir 4 最后 该问题已经官方github项目提交issue https://github.com/alibaba/druid/issues/3145