试想你是黑客,而咱们运用spring mvc+velocity建立体系号码大全,即使大门打开答应上载jsp,你能拿shell?
咱们知道,webshell能够运转的条件无非于1.能够解析 2.能够履行并完结一些关键词挖掘功能性的工作,比方读取文件
如今来看web mvc,mvc的精髓在于“分权”(这个词是我乱编的),我想表达的意思是:他能将数据拜访逻辑、流程操控逻辑、事务逻辑、视图显现逻辑全部剥脱离,这对开发者来说,优点在于使得体系愈加明晰、便于保护;而以安全的角度来看,运用mvc也大大提高安全性,即在view层你没有“权力”做更多工作。咱们就拿jsp webshell来举比如。
先说jsp为什么能写出webshell?
jsp与其他模板技能有一个严重的差异即是他最终是编译为servlet来运转的。简单来说,你能够理解为,jsp即是一个servlet。这个特性使得jsp拥有比其他模板技能更大的能量。只需你情愿,咱们能够彻底能够在jsp中直接写java代码、履行任何想要的东西,不用装备web.xml,jsp直接通过连接完结servlet一切的工作,这种“超频”这使得jsp底子跟php、asp无异了,java谨慎的mvc“分权”彻底被损坏,这时jsp webshell天然应运而生。
spring mvc的呈现极好的处置了这个疑问,咱们通过分权从头让烘托层的东西持续做烘托的工作,于是开发乐了,安全工程师也乐了
一个完好的交互过程是这样的
1.用户恳求
2.web容器匹配映射,如抓出*.htm的送到第三步
3.匹配的映射送到对应的controller里做处置
4.视图解析(包含获取模型,获取vm\jsp\xls这种模板文件),通常结构会一致装备viewResolver,如装备一个bean运用vm做烘托
5.输出
来看这个过程安全在哪里
1.咱们成功上载了一个jsp webshell,拜访这个地址(假定拿到这个地址,只是假定),装备里没有*.jsp,第2步找不到映射,失利
2.咱们成功上载了一个jsp webshell,拜访这个地址,装备里有*.jsp,第3步找不到controller,失利
3.咱们成功上载了一个jsp webshell,拜访这个地址,装备里有*.jsp,第3步有对应controller,第4步viewResolver里没有配jsp,失利
能完成以上3过程的可能性底子没有,由于你要能改我装备、修正java文件,那你底子不需要webshell了:)
此刻你可能会想,那我不一定要用jsp写shell啊,vm是不是也能写?
首要vm相比jsp弱小许多,能够说,他从出世即是一个朴实的烘托层的东西。
kxlzx大牛提出过能够运用#set ($exec =
"kxlzx")$exec.class.forName("java.lang.Runtime").getRuntime().exec("calc")
- indexRead arguments from command-line "http://www.shoudashou.com"
- indexRead arguments from command-line "http://www.4lunwen.cn"
- indexRead arguments from command-line "http://www.zx1234.cn"
- indexRead arguments from command-line "http://www.penbar.cn"
- indexRead arguments from command-line "http://www.whathappy.cn"
- indexRead arguments from command-line "http://www.lunjin.net"
- indexRead arguments from command-line "http://www.ssstyle.cn"
- indexRead arguments from command-line "http://www.91fish.cn"
- indexRead arguments from command-line "http://www.fanselang.com"
这类句子来履行体系级指令,
,可是相同的,他的解析依靠controller,你没有java文件的支撑,就不会解析这个vm,就只能是以文本方式输出这句话,这一点我做过测验。
在测验中我发现,直接拜访不通过解析的vm文件有一个特性
Chrome下
从webshell浅析spring mvc的安全性