搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 天山网络安全 > 通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入

通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入

天山网络安全 2017-11-29

直入主题,二次注入,形成原因为攻击者输入的攻击载荷首先会存储到web服务器中,然后web服务器调用这一攻击载荷时,会形成危害。


可以想象的到,二次注入可以发生在任何地方。不仅仅在同一个web应用程序,还可能感染使用同一数据库的web应用程序。因此,使用扫描器去发现这种漏洞是几乎不可能的。在这篇文章中,我会展示最近我们项目中发现的最有趣的一个注入漏洞。


我们手动渗透测试的方法


对于一次渗透测试是否成功,关键在于你是否了解到你的目标系统的业务流程。对于这点,我经常花费一到两天的时间像普通用户一样使用目标站点的功能。因此我可以了解到目标的全部工作流程。在填写表单或者提交任何请求时,我都会为填写的内容进行编号:

  1. 给主要模块进行编号(比如发票、新闻、费用等等,这些你经常在导航栏中看到的内容)


随着从事渗透测试工作时间的变长,我久而久之开发了这一方法,以便于对数据进行跟踪。如果我在渗透测试过程中发现了johnticket1字段,这可能需要4-5天的时间,那时我还是可以清楚的了解到我应该回到哪个地方入手,进行二次注入测试。


初始阶段:检测


在我对目标进行浏览时,在Burp Suite日志中发现了如下请求和响应:


我正在向心愿单添加一个产品,如果命令执行成功,应用程序就会重定向到主页,但是如果我浏览/wishlist/,我可以看到产品的详细信息。


有一些事情引起了我的注意,为什么在http响应头中发现了set-cookie参数?为了确定我得到的答案,我尝试着添加了不同id的产品到愿望单中,结果果然是我想的那样,每次请求之后都会有新的set-cookie参数。让我注意的地方:

1. 我现在没有登录,但是应用程序能够捕捉到我添加的产品。
2. 当我请求添加不同id的产品时,我会得到set-cookie响应。

所以答案很明显了,它会加密客户端这边的会话。应用程序将产品的id存储在我的cookie中,然后在返回时对这一值进行加密处理。同时我发现目标是使用的Laravel框架开发的,因为Laravel框架会有名为XSRF-TOKEN的cookie值,并且会默认对cookie进行加密。

通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入

通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入

这时需要明白的是服务端的工作流程,当我提交/wishlist/add/<id>这一内容时,服务端会将其加密存储到cookie中。如果浏览/wishlist/页面,接下来的步骤如下:

1. 获取cookie值
2. 解密cookie值
3. 从cookie中得到心愿单数组
4. 在查询中使用获取来的数组
5. 展示产品的详细信息

一个小tip:如果你相信这一复杂的查询是在一个sql语句中完成的,想象一下开发过程,那么可能会使用了where id IN <values>这样的语句。


第二阶段-自动化工具问题


说实话,Burp以及Netsparker都无法检测到这一漏洞。为了解的更清楚,以下是自动化工具扫描的工作流程:


  1. 输入用户帐号密码或者使用提供的cookie进行登录。

  2. 发送类似于 /wishlist/add/9" and 1=1 –或者 /wishlist/add/9' or 1=1 –或者 /wishlist/add/9' OR SLEEP(25)=0 LIMIT 1–这类语句。

  3. 计算响应时间间隔或者http返回内容。

  4. 等待发送的异步请求。


根据上述流程,扫描器不会看到任何http响应的实体内容。并且响应时间间隔并没有太大的差距。在这种情况下,应用程序只是简单的将用户输入加密并且存储到了cookie中。


当扫描器会对每一个url进行浏览,当访问到/whislist/时,SQL查询会进行,但是扫描工具输入的内容已经扰乱了sql查询,导致sql查询失败,所以http响应返回500标志。


第三阶段-对sqlmap进行定制,变得更强大


下方是sqlmap产生的前五个http请求,特别是前两个一直保持不变。

通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入

如果你进一步查看前两个请求,你会发现sqlmap尝试绕过waf,然后强制对请求进行编码。之后它会逐一发送sql查询语句,那么问题就在于这些攻击载荷都会加密到cookie中,导致当sqlmap到–seconde-order目录时,会返回500错误。也是因为第一个请求已经将sql语法扰乱,导致sqlmap这次攻击出错。


所以我们需要为sqlmap发送的每个http请求提供一个新的会话。于是我通过自定义的tamper脚本实现了这一功能。


遵循HTTP请求和响应形式是强制应用程序启动新会话的一种方式。

通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入

可以进行以下步骤:

  1. 发送不带有任何cookie的请求。

  2. 解析set-cookie,得到XSRF-TOKEN以及SESSION

  3. 更新sqlmap产生的请求

  4. 所以每次sqlmap请求都会产生新的会话,当sqlmap发送载荷之后,访问/wishlist/时,/wishlist/响应只与之前发送的payload有关。


我非常建议你使用https://github.com/h3xstream/http-script-generator这一工具产生http请求。这一拓展会生成脚本重复发送所选请求。

通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入


以下是我sqlmap tamper的模块,它向主页发送HTTP请求并检索新的cookie值。然后它会更新sqlmap生成的HTTP请求的Cookie值。

通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入

最后注入成功:

结论

不要相信自动化扫描器的结果,还有一条就是遇到问题要尝试去解决。


*文章主要内容来自嘶吼

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《通过Burp以及自定义的Sqlmap Tamper进行二次SQL注入》的版权归原作者「天山网络安全」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注天山网络安全微信公众号

天山网络安全微信公众号:X_IntSec

天山网络安全

手机扫描上方二维码即可关注天山网络安全微信公众号

天山网络安全最新文章

精品公众号随机推荐