目录

  • SSRF逆向分析

    • 0x00 前言
    • 0x01 收集情报
    • 0x02 尝试逆向找到触发点
    • 0x03 尝试构造payload
    • 0x04 总结

SSRF逆向分析

0x00 前言

之前有复现过一些漏洞,但是每次按照别人的思路复现完了之后感觉还是有很多疑问,知道了怎么做但是不知道为什么这么做,所以这次我尝试自己从补丁一步步找到攻击链,构造poc。

0x01 收集情报

补丁地址:
https://gitee.com/ComsenzDiscuz/DiscuzX/commit/41eb5bb0a3a716f84b0ce4e4feb41e6f25a980a3

查看补丁,发现如下:

删去了followlocation,也就是说对于301/302请求,curl不会去跟踪跳转。
既然这里存在一个跳转ssrf,下面就是逆向调用链,找到程序的入口。

0x02 尝试逆向找到触发点

首先这个存在漏洞的函数是_dfsockopen,通过Ctrl+Alt+F大法找到了位于function_core.php的dfsockopen方法。

继续向上找,找到了一处import_block方法。

通过对dfsockopen的第一个参数进行分析,发现其刚好是import_block的第一个参数经过一些处理之后的结果。
由于参数可控,继续向上。

鸡冻人心的发现!第一个参数直接以$_GET传了进去!

0x03 尝试构造payload

下面看一下如何访问到这个语句:

首先,直接通过文件肯定是访问不了的(L10-12)。下面根据L19和L21确定url中基本要必须存在的参数。经过一系列的尝试和Ctrl+Alt+F,终于找到了入口:
/upload/admin.php?action=blockxml&operation=add

跟进一下submitcheck()

继续跟进getgpc()

大概就是返回$_GET[$k],由于这里的$k就是从前面的submitcheck('addsubmit')传进来的,所以这里只要保证$_GET['addsubmit']即可,构成的url如下:
/upload/admin.php?action=blockxml&operation=add&addsubmit=test

继续跟,

可以看到getgpc返回了$_GET['addsubmit']的值,由于我们的url参数中有此参数,因此进入到了else语句块。继续跟进submitcheck

这里又有一个相同的getgpc(),由于参数跟刚刚也相同,就不继续跟了,直接进入到else语句块。可以看到,首先22行有个if语句,必须把条件满足成True,否则是False的话就直接进入Else语句块,这条链就直接中断掉了。仔细看一下这个if条件:

$allowget || ($_SERVER['REQUEST_METHOD'] == 'POST' &&
!empty($_GET['formhash']) && $_GET['formhash'] == formhash() &&
empty($_SERVER['HTTP_X_FLASH_VERSION']) &&
(empty($_SERVER['HTTP_REFERER']) ||      strncmp($_SERVER['HTTP_REFERER'], 'http://wsq.discuz.com/', 22)
=== 0 || preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1",
$_SERVER['HTTP_REFERER']) == preg_replace("/([^\:]+).*/", "\\1",
$_SERVER['HTTP_HOST'])))

最外层是个or,如果$allowget是True就直接省事儿了,可是这是此方法的第二个参数,默认为0,pass。剩下的逻辑如下:
1)必须是POST请求 &&
2)GET请求中必须有formhash参数 &&
3)formhash的值必须等于formhash() &&
4)请求头中没有HTTP_X_FLASH_VERSION &&
5.1)refer为空 ||
5.2)referer的值以http://wsq.discuz.com/开头 ||
5.3)referer与host的主机名部分必须相同

第1、4、5条件好满足,直接抓包改即可。主要看第二个请求和第三个请求,即如何获取这个formhash。看一下函数定义:

其大致是计算一个数的MD5,这个数由几个$_G变量组成。既然不是一个固定的值,那么首先肯定是服务端先发给客户端,然后客户端才能带着这个$_GET['formhash']来进行请求,下面全局搜一下formhash,发现很多页面中都有这个字段:

然后随手在页面上查找一下,没想到真找到了:

(经过一些测试,这里有个比较坑的点是这个formhash在同一个session请求中是不会变的,不过前台和后台的formhash不是同一个,你不能拿前台获取的formhash作为参数去访问后台的接口)。

formhash的问题到这里就解决了,会看一下上面的条件,构成的url暂时如下:

POST ..../upload/admin.php?action=blockxml&operation=add&addsubmit=test&formhash=2b23ba6f

并且去掉referer头。
请求之后可以发现,成功进入了if语句,然后顺其自然的到了return True。

然后就终于回到了最开始的地方,成功调用import_block()

由于这里需要$_GET['xmlurl'],我们暂且传入http://127.0.0.1:2222。

可以看到,最后url赋值给了$signurl,其值变成:
http://127.0.0.1:2222?charset=utf-8&clientid=&op=getconfig&sign=

没有什么太大的变化,继续跟进后就到了最开始说的那个可能存在ssrf的_dfsockopen方法了。通过下图可以看到,先是在33行调用parse_url对用户传来的url进行解析,然后调用_isLocalip()来检查host是否是内网地址,如果是内网地址则直接return掉。所以就算这里存在ssrf,我们的url中也是不能直接传内网地址进来的。

接着看,这里在88行发送了请求,我在这次请求中传入的url是:upload/admin.php?action=blockxml&operation=add&addsubmit=test&formhash=2b23ba6f&xmlurl=http://127.0.0.1:2222

这里看一下我本地监听的2222端口:

访问成功了。

下面的整理下思路,由于程序对内网地址进行了限制,导致了除127.0.0.1之外的内网地址都会直接return掉,因此这里我们需要通过一个301跳转,来实现绕过程序对内网url的限制。
可是如果想要curl自动重定向到第一个url返回的地址中去,就必须先要将此curl的CURLOPT_FOLLOWLOCATION属性设置为true才行。然而这一点在本文一开始就已经确认了:

下面就可以通过在vps上上传一个301跳转的php脚本,内容如下:

下面把我们之前的payload中的xmlurl改成我的公网vps的ip,然后重放,同时在本地监听9999端口。

请求结果如下,可以发现,本地的9999端口果然收到了discuz-curl发来的请求!

我的vps的http日志:

至此,这条ssrf的攻击链就已经形成了。

0x04 总结

这次跟下来还是学到了一些东西的,比如构造payload时会遇到的一些坑,然后自己对ssrf也有了跟深入的一些理解。

转载于:https://www.cnblogs.com/litlife/p/10787682.html

Discuz3.4-SSRF-从触发点到构造payload相关推荐

  1. mysql注入 无回显_33. 注入信息无回显?(给盲注戴上眼镜)

    注入信息无回显?(给盲注戴上眼镜) 工具简介: 平常的漏洞检测或漏洞利用需要进一步的用户或系统交互.但是一些漏洞类型没有直接表明攻击是成功的.如Payload触发了却不在前端页面显示.(像ssrf,X ...

  2. Xss-labs闯关总结

    文章目录 前言: Level 1 无过滤机制 查看后台源码: 通关代码: Level 2 闭合标签 查看后台源码: 通关代码: Level 3 单引号闭合 + 添加事件 查看后台源码: 通关代码: L ...

  3. xss challenges闯关详细(6-10)

    XSS Challenges (by yamagata21) - Stage #1 目录 一.第六关 二.第七关 三.第八关 四.第九关 五.第十关 一.第六关 输入good man测试 回显位置,输 ...

  4. XSS Challenges stage#1-10闯关详解

    XSS Challenges stage1-10闯关详解 文章目录 XSS Challenges stage1-10闯关详解 0x01 xss challenges 闯关环境准备 1.XSS chal ...

  5. SSRF盲打 Collaborator everywhere

    目录 什么是盲SSRF漏洞? 如何寻找和利用盲SSRF漏洞? SSRF盲打 Collaborator everywhere(ssrf扫描器 自动发现ssrf注入点) SSRF via the Refe ...

  6. ----已搬运----【总章程】SSRF完全学习,,什么都有,,,原理,绕过,攻击

    目录: 1.漏洞详情: 2. SSRF漏洞相关函数和类 2.1 file_get_contents() 2.2 fsockopen() 2.3 curl_exec() 2.4 SoapClient 2 ...

  7. Web漏洞之SSRF攻击汇总

    目录 靶场拓扑设计 x.x.x.x:8080 - 判断 SSRF 是否存在 172.72.23.21 - SSRF 获取本地信息 FILE 协议获取本地信息 172.72.23.1/24 - SSRF ...

  8. [翻译]盲SSRF利用链术语表

    翻译]盲SSRF利用链术语表 盲SSRF利用链术语表 介绍 什么是服务器请求伪造(SSRF)? SSRF(Server-Side Request Forgery:服务请求伪造)是一种由攻击者构造,从而 ...

  9. 渗透测试-SSRF服务端请求伪造(Server-Side Request Forgery)

    SSRF服务端请求伪造 漏洞原理 本次靶场的设计拓扑图 x.x.x.x:8080 - 判断 SSRF 是否存在 172.72.23.21 - SSRF 获取本地信息 172.72.23.1/24 - ...

最新文章

  1. 5G 智慧城市安全参考架构概述
  2. RecyclerView上拉加载Demo
  3. 刚刚,华为云挂了。。。
  4. 新一代Web的蓝图--语义web
  5. Promise 上手
  6. leetcode257. 二叉树的所有路径(两种做法)
  7. [APIO/CTSC 2007]数据备份(贪心+堆)
  8. 基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案
  9. 退出命令_利好消息!上级命令:乡村医生满60岁要办退出手续
  10. 遥感导论网课_经典课程教材遥感导论.pdf
  11. 前端之vue表格居中处理
  12. jenkins:Failed to get hostnam执行启动脚本不执行
  13. 关于通过前端xslx解析excel日期少一天原因
  14. 普洱市企业登记“区块链云签名”试点工作启动, 用户操作仅需5分钟!
  15. 网络流量分析详解(包含OSI七层模型、TCP协议及Wireshark工具用法)
  16. SQL查询以某个字母开头
  17. 让网页FLASH变成黑白的css语句
  18. “共识2018”北京区块链大会上BNET创始人刘建军发表了“通信网的未来”的重要演讲
  19. c语言如何标志置1与置0,c语言对于文本的基本操作
  20. 记录一次Centos磁盘空间占满的解决办法

热门文章

  1. SAP ABAP——SAP简介(一)【SAP发展历程】
  2. php时间戳与date格式转换
  3. JS实现简单的网页文本转语音阅读
  4. 一文教你分清持续集成,持续交付,持续部署
  5. FMDB-FMDatabaseQueue
  6. JavaScript——计算平方值
  7. SSIS - 1.简介
  8. IBM SPSS Modeler 【5】 关联分析
  9. 解决win10莫名其妙重启问题
  10. 佳能 MG3080 打印机换墨盒