struts2处理http请求参数的流程

以struts2 s2-21为例,分析跟踪请求从tomcat容器到struts2框架的代码处理流程。


tomcat部分:

tomcat 调用JIoEndpoint.java 的run()创建socket

然后调用processor.process(socket)负责解析http 协议并返回结果内容。

其中processor 是HttpProcessor 的一个实例,事实上tomcat 对HTTP 请求的解析都是通过

HttpProcessor 这个类中的process()这个方法实现的。跟入process()这个函数,主要功能有以下几个:

parseRequestLine()和parseHeaders()分别解析消息头第一行、请求头其他字段等。

prepareRequest()

通过prepareRequest 方法组装request filter,用于处理http 消息体

adapter.service(request, response)

将request 交给tomcat 处理,返回response

inputBuffer.endRequest()

将response 返回给客户端

其中,adapter.service(request, response)将请求交给容器处理。tomcat从connector 到servlet 处理HTTP 请求。http 请求会依次进入engine、host、wrapper,一直到servlet,这里开始关联struts2。

其中filter是struts2的FilterDispatcher实例。执行这个doFilter 方法才开始进入struts2 的代码逻辑,在

这之后程序的控制权由容器转交给struts2。

struts2处理http请求

其实Struts2 的核心就是一个Filter,它的作用只是处理HTTP 请求(request)然后返回给客户端(response),其doFilter方法是struts2 处理HTTP 请求的入口。后面struts2 将HTTP 请求经过一系列处理之后,交给了参数拦截器(ParametersInterceptor),用来设置参数属性。当提交a=b参数时,struts2会自动执行对应的set a方法去设置属性值,具体实现依靠OGNL完成。

参数拦截器(ParametersInterceptor)中的doIntercept 方法:

首先参数拦截器会获取action 实例

Object action = invocation.getAction();

然后生成OGNL 上下文

ActionContext ac = invocation.getInvocationContext();

这里的ac 便是OGNL 上下文了。包括_root、_memberAccess等属性。

通过retriveParamerers,即参数拦截器,获取http请求参数。

调用ActionContext.getParameters() 实现,获得Map 型的参数集parameters。遍历HttpServletRequest、HttpSession、ServletContext 中的数据,并将其复制到Webwork 的Map 中实现,至此之后,所有数据操作均在此Map 结构中进行,从而将内部结构与Servlet API 相分离。

这里newStack 是从OGNL 上下文中取出的ValueStack,保存的是action 的实例。

这里 newStack.setParameter(name, value); 便是将HTTP 请求的参数设置到action 实例当中。此过程中会调用set 方法设置属性。这里newStack.setParameter(name, value); 的执行逻辑都是通过OGNL 实现的,实际上就是遍历上下文去找对应的set 方法。这也是为何利用ognl实现漏洞的原因。

在ParametersInterceptor.java的参数拦截器函数doIntercept()中,其中newStack.setParameter(name, value);函数中,判断参数是否符合要求。

这个 this. excludeParams 便是 struts2-core.jar 中 struts-default.xml 中配置的正则了。因此在s2-021漏洞中可以绕过官方修复。

s2-021 poc:Class['ClassLoader'].resources.dirContext.docBase=xxxx

因为每个action 必然继承容器的 classLoader ,所以每个action 中肯定有对应 classLoader 中的属性。这里请求参数是 Class['ClassLoader'].resources.dirContext.docBase ,跟踪代码最终找到

调用的是tomcat 源码中BaseDirContext 类中的 setDocBase() 方法.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容