webgoat-(A2)Cryptographic Failures 加密机制失效

加密解密基础知识 Crypto Basics

这节课讲了在web应用中常用的的加密技术
可参考https://zhuanlan.zhihu.com/p/652570763

目的

熟悉以下技术
Encoding、Hashing、Encryption、Signing、Keystores、Security defaults、Post quantum crypto

base64编码

编码不是真正的密码学,但它在围绕加密功能的各种标准中被大量使用。尤其是 Base64 编码。

Base64 编码是一种用于将各种字节转换为特定字节范围的技术。此特定范围是 ASCII 可读字节。 这样,您可以更轻松地传输二进制数据,例如密钥或私钥。您甚至可以将它们打印出来或写下来。 编码也是可逆的。因此,如果您有编码版本,则可以创建原始版本。

在维基百科上,您可以找到更多详细信息。基本上,它会遍历所有字节,并将每组 6 位转换为可读字节(8 位)。结果是编码字节的大小增加了约 33%。

Hello ==> SGVsbG8=
0x4d 0x61 ==> TWE=

Basic Authentication

Web 应用程序有时会使用基本身份验证。这使用 base64 编码。因此,至少使用传输层安全性(TLS 或更常见的 https)来保护其他人读取发送到服务器的用户名密码非常重要。

$echo -n “myuser:mypassword” | base64
bXl1c2VyOm15cGFzc3dvcmQ=
HTTP 标头将如下所示:

Authorization: Basic bXl1c2VyOm15cGFzc3dvcmQ=

如果截获了Authorization,就能破解出用户名和密码。

0x02

直接对 eWFuZ3lhbGk6cGFzc3cwcmQ=进行base64解码,输入账号密码得到结果。
在这里插入图片描述

在线编码解码:https://www.sojson.com/base64.html

其他编码

URL 编码

在向服务器发送表单数据和请求参数时,会大量使用URL编码。由于 URL 中不允许有空格,因此将其替换为 %20。对其他字符进行了类似的替换。
URL 编码是一种用于将特殊字符转换为安全格式以便在 URL 中传输的方法。URL 编码确保所有特殊字符都被转换为 URL 安全的形式。

在 URL 编码中,一些字符被保留,包括字母 a-z,A-Z,数字 0-9,和以下特殊字符:

空格(%20)
句点(.)(%2E)
加号(+)(%2B)
减号(-)(%2D)
斜杠(/)(%2F)
下划线(_)(%5F)
冒号(:)(%3A)
分号(;)(%3B)
星号(*)(%2A)
井号(#)(%23)
等号(=)(%3D)
百分号(%)(%25)
所有其他字符都被视为非 URL 安全的字符,并需要编码。例如,一个空格将被编码为 “%20”。

HTML 编码

HTML 编码可确保文本在浏览器中按原样显示,而不是被浏览器解释为 HTML。
HTML 编码通常指的是将特殊字符转换为 HTML 实体,这样可以避免浏览器将这些字符错误地解释为 HTML 标记。常见的实体包括:

& 表示 &
< 表示 <
> 表示 >
" 表示 "
’ 表示 ’
例如,如果你想在 HTML 中显示文本 “<”,你需要将其编码为 <。

在 HTML 中,你可能会遇到两种不同的情况,需要使用不同的编码方式:

当你在 HTML 文档中直接写入特殊字符时,你需要使用 HTML 实体编码。例如,如果你想在网页上显示文本 “Hello, World!”,你应该写 Hello", World!。
当你在 JavaScript 中使用特殊字符时,你需要使用 JavaScript 的字符串编码。例如,如果你想在 JavaScript 中使用引号,你需要使用转义字符 \。
注意:HTML 实体编码和 JavaScript 字符串编码是不同的,尽管它们有时看起来很相似。

UUEncode

Unix-2-Unix 编码已用于发送电子邮件附件。

XOR 编码

IBM的WebSphere这个中间件系统中,就是用xor来保存密码的,默认情况下,xor运算的密码值是固定的,如果在使用过程中,用户没有对默认的配置进行修改,那么使用就容易出现安全漏洞,因为默认的配置是公开的,在拿到密文后,使用默认的密码进行一次xor运算即可获取到原文。

0x03 XOR解码

在这里插入图片描述
XOR解密需要密钥,在XOR的介绍中,给了一些信息,所以需要根据公开的websphere的密钥才解决这个题。
websphere做xor运算的默认的字符串是下划线"_"、
使用在线解密工具 https://www.toolhelper.cn/SymmetricEncryption/XOR
在这里插入图片描述
得到结果为 databasepassword

Plain Hashing

哈希是一种密码学,主要用于检测原始数据是否已更改。哈希是从原始数据生成的。它基于不可逆的加密技术。 如果原始数据更改一个字节,则生成的哈希值也会有所不同。

所以在某种程度上,它看起来像是一种安全的技术。但是,在将其用于密码时,它不是,甚至从来都不是一个好的解决方案。这里的问题是,您可以从字典中生成密码,并从这些密码中计算出各种变体。对于每个密码,您可以计算一个哈希值。这些都可以存储在大型数据库中。因此,每当您找到可能是密码的哈希值时,您只需在数据库中查找哈希值并找出密码即可。

不应再使用某些哈希算法:MD5、SHA-1 对于这些哈希值,可以更改有效负载,使其仍会产生相同的哈希值。这需要大量的计算能力,但仍然是一个可行的选择。

hash是不可逆的,因此准确来说,是不能被反向解密的。但是目前网络上有很强大的彩虹表,就是将各种字符串的hash值进行计算后存起来,然后在提供明文查询。直接对题目给的两个hash值在cmd5上进行查询,可以得到明文结果。

加盐哈希

显然,普通密码不应存储在数据库中。普通哈希也是如此。 OWASP密码存储备忘单解释了当需要安全存储密码相关信息时应使用的内容。
https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html

作业0x04

在这里插入图片描述
在这里插入图片描述

https://www.cmd5.com/
直接使用cmd5网站对两个字符串进行解密即可得到,答案分别是secret和123456

对称加密

对称加密基于用于加密和解密的共享密钥。因此,双方(参与交换机密)共享相同的密钥。

示例协议包括:

AES

3DES

非对称加密

非对称加密基于由密钥对组成的数学原理。这两个密钥通常称为私钥和公钥。私钥需要得到很好的保护,并且只有一方知道。所有其他人都可以自由使用公钥。使用私钥加密的东西可以被所有拥有公钥的人解密,而用公钥加密的东西只能用私钥解密。

示例协议包括:

RSA

RSA

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用一对密钥,公钥和私钥,来加密和解密数据。公钥可以公开,用于加密数据或验证签名;私钥用于解密数据或生成签名。RSA的安全性基于大数因子分解问题的困难性。

DSA

HTTPS 同时使用对称密钥和非对称密钥

以下是打开浏览器并转到 https 站点时会发生什么的简短描述。

您的浏览器连接到服务器并获取 Web 服务器证书

浏览器通过检查证书颁发者证书是否在其信任存储中来检查它是否信任证书颁发者。此信任存储由操作系统和浏览器更新管理。在某些公司网络上,它由公司管理。浏览器从证书中获取公钥。

浏览器现在生成随机字节,用于生成对称密钥,并使用服务器的公钥对其进行加密。所以只有服务器才能解密它。

在此过程结束时,浏览器和 Web 服务器都将使用交换的对称密钥(在非对称密钥交换过程中)来加密和解密在浏览器和 Web 服务器之间来回发送的消息。

之所以使用对称密钥,是因为它可以更轻松地用于大型数据集,并且这样做需要较少的处理能力

06 签名

签名是一种哈希值,可用于检查某些数据的有效性。签名可以与其验证的数据分开提供,或者在CMS或SOAP的情况下可以包含在同一个文件中。(其中该文件的部分包含数据,部分包含签名)。

当完整性很重要时,使用签名。它旨在保证从甲方发送到乙方的数据不会被更改。因此,甲方通过计算数据的哈希值并使用非对称私钥加密该哈希值来对数据进行签名。然后,乙方可以通过计算数据的哈希值并解密签名来验证数据,以比较两个哈希值是否相同。

RAW签名

甲方通常按如下方式计算原始签名:

创建数据的哈希值(例如 SHA-256 哈希值)

使用非对称私钥(例如 RSA 2048 位密钥)加密哈希值

(可选)使用 base64 编码对二进制加密哈希进行编码

乙方也必须获得带有公钥的证书。这之前可能已经交换过了。因此,至少涉及 3 个文件:数据、签名和证书。

CMS 签名

CMS 签名是一种标准化方式,用于将数据 + 签名 + 证书(公钥全部在一个文件中)从甲方发送到乙方。只要证书有效且未被吊销,乙方就可以使用提供的公钥来验证签名。

SOAP 签名

SOAP 签名还包含数据和签名以及(可选)证书。多合一 XML 有效负载。计算数据的哈希值涉及一些特殊步骤。这与从系统发送到系统的 SOAP XML 可能会引入额外的元素或时间戳有关。 此外,SOAP签名提供了由不同方对消息的不同部分进行签名的可能性。

电子邮件签名

发送电子邮件不是很困难。您必须填写一些数据并将其发送到转发它的服务器,最终它将到达目的地。但是,可以使用不是您自己的电子邮件地址的 FROM 字段发送电子邮件。为了向您的收件人保证您确实发送了这封电子邮件,您可以在您的电子邮件上签名。受信任的第三方将检查您的身份并颁发电子邮件签名证书。在电子邮件应用程序中安装私钥,并将其配置为对发送的电子邮件进行签名。该证书是在特定电子邮件地址上颁发的,收到此电子邮件的所有其他用户都将看到发件人已通过验证的指示,因为他们的工具将使用受信任的第三方颁发的公共证书来验证签名。

PDF 或 Word 或其他签名

Adobe PDF 文档和 Microsoft Word 文档也是支持签名的示例。签名也与数据位于同一文档中,因此对数据的一部分和元数据的一部分有一些描述。 政府通常会发送带有包含证书的 PDF 的官方文件。

作业 0x06

题目提供一个private RSA key,把这个RSA key的modulus作为十六进制字符串,然后计算一个signature。这个作业需要一些openssl经验
在这里插入图片描述

第一步:将给的私钥保存为test.ky上传linux
在这里插入图片描述

第二步:通过私钥生成公钥文件:
执行 openssl rsa -in test.key -pubout>test.pub 生成一个test.pub文件
在这里插入图片描述

第三步:提取公钥中的modulus信息:
执行 openssl rsa -in test.pub -pubin -modulus -noout 输出module
在这里插入图片描述
第四步:使用modulus输出签名。

使用私钥对该modulus信息进行签名计算,并将结果进行base64编码,得到一个私钥签名的签名值的base64编码结果:
执行 echo -n “第三步输出的modulus” |openssl dgst -sign test.key -sha256 |base64

输出签名
在这里插入图片描述

通常情况下,签名的算法可能是公开的,但是签名用的秘钥是私密的,如果签名用的共享秘钥、私钥等信息泄露,就会导致签名值被破解,从而伪造合法的签名进行接口调用。

秘钥是我们在应用系统开发中经常会用到的东西,比如数据库的连接密码、签名用的秘钥、https对应的私钥等等。

那么如果这些秘钥在保存时,没有做足够的安全措施,那么就容易造成安全风险,一般来说,我们不建议将密码明文硬编码在代码或者系统的配置文件中,一旦主机被控制,攻击者可以通过翻阅配置文件等获取到这些密码,从而进一步访问数据库等更多的系统。

比较安全的做法是,将代码和秘钥进行隔离,秘钥统一保存在加密机等系统中,
参考:https://zhuanlan.zhihu.com/p/652570763
搞清楚各种签名认证,通常情况下,签名的算法可能是公开的,但是签名用的秘钥是私密的,如果签名用的共享秘钥、私钥等信息泄露,就会导致签名值被破解,从而伪造合法的签名进行接口调用。

07 密钥库

密钥库是存储密钥的地方。除了密钥库,术语信任库也经常被使用。信任库与密钥库是相同的。它通常只包含受信任证书或证书颁发机构的证书(所以基本上只有公钥和颁发者信息)。

File based keystores 基于文件的密钥库
A file based keystore is something that in the end has the keys on a file system. Storing public certificates in a file based keystore is very common

Database keystores 数据库密钥库
Keys and especially public certificates can of course also be stored in a database.

Hardware keystore 硬件密钥库
A hardware keystore is a system that has some sort of hardware which contain the actual keys. This is typically done in high end security environments where the private key is really private. In comparison with file based or database keystores, it is impossible to make a copy of the keystore to send it to some unknown and untrusted environment.

Some certificate authorities that are used to provide you with a server certificate for your website, also create the private keys for you (as-a-service). However, it is by definition no longer considered a private key. For all keystore types, you should keep the private key private and use a certificate signing request to order your signing or server certificates.

在操作系统、浏览器和其他应用中管理密钥
When you visit a website and your browser says that the certificates are fine, it means that the certificate used for the website is issued by a trusted certificate authority. But this list of trusted certificate authorities is managed. Some CA’s might be revoked or removed. These updates happen in the background when browser updates are installed. Not only the browser maintains a list of trusted certificate authorities, the operation system does so as well. And the Java runtime also has its own list which is kept in the cacerts file. Updates of the OS and Java JRE keep this list up to date. In corporate environments, these are usually maintained by the company and also contain company root certificates.

Extra check for website certificates using DNS CAA records
Some companies inspect all or most internet traffic. Even the ones were you think you have an end-2-end secured connection. This works as follows. An employee opens a browser and googles some information. The browser will use https and go to the site of google. The link looks real and the lock is shown in the browser. However, if you would inspect the certificate, you might notice that it has been issued by one of your companies root CA’s! So you have established an end-2-end secure connection with a server of your company, and that server has the secure connection with google. In order to prevent such man in the middle connections to your server, modern browsers now will also check the DNS CAA records to see whether or not a certain issuer is allowed for a certain website. More information: Wiki DNS CAA

Free certificates from Let’s encrypt
Let’s encrypt is a free, automated and open Certificate Authority. It allows you to create valid certificates for the websites that you control. By following and implementing a certain protocol, your identity is checked and a certificate will be issued. The certificates are free of charge and this is done to stimulate the use of authorised certificates and to lower the use of self-signed certificates on the internet. Certificates are valid for 90 days, so they need to be automatically renewed. (Which makes sure that the proof of identity/ownership also takes place frequently)

08 default

在所有的系统中一个很大的问题是默认配置的使用 如默认的username/password,所有密钥库的默认password,默认的未加密模式等

Java cacerts
Did you ever changeit? Putting a password on the cacerts file has some implications. It is important when the trusted certificate authorities need to be protected and an unknown self signed certificate authority cannot be added too easily.

保护你的 id_rsa private key
Are you using an ssh key for GitHub and or other sites and are you leaving it unencrypted on your disk? Or even on your cloud drive? By default, the generation of an ssh key pair leaves the private key unencrypted. Which makes it easy to use and if stored in a place where only you can go, it offers sufficient protection. However, it is better to encrypt the key. When you want to use the key, you would have to provide the password again.

服务器的SSH username/password
当从主机提供商获得服务器时,通常有很多不安全的默认配置。如通过默认的22端口进行ssh连接,并且允许账号密码尝试。你首先不需要做的是修改不能通过ssh登录为root,不能通过ssh使用账号密码连接,而是使用有效的strong ssh key。如果不修改,你会发现攻击者会不断使用暴力破解尝试登录你的服务器。

作业0x08

第一步:
启动docker容器,进入容器,找到root文件夹下的文件,查看内容。

[root@localhost]# docker exec -it  --user root 853af53eeba9 /bin/bash
root@853af53eeba9:/# cd root
root@853af53eeba9:~# ls
default_secret
root@853af53eeba9:~# cat default_secret
ThisIsMySecretPassw0rdF0rY0u

第二步:

把密码复制出来,放到secret.key这个文件

echo "ThisIsMySecretPassw0rdF0rY0u" >> secret.key

第三步:
使用题目给的openssl命令结合这个secret.key文件进行解密

echo "U2FsdGVkX199jgh5oANElFdtCxIEvdEvciLi+v+5loE+VCuy6Ii0b+5byb5DXp32RPmT02Ek1pf55ctQN+DHbwCPiVRfFQamDmbHBUpD7as=" | openssl enc -aes-256-cbc -d -a -kfile 
这条命令是在Unix或Linux系统中使用OpenSSL工具进行数据解密。

echo "U2FsdGVkX199jgh5oANElFdtCxIEvdEvciLi+v+5loE+VCuy6Ii0b+5byb5DXp32RPmT02Ek1pf55ctQN+DHbwCPiVRfFQamDmbHBUpD7as=":这条命令会输出一串字符串。这个字符串可能是已经用某个密钥进行过AES-256-CBC加密的密文。

|:这是一个管道符号,它将前一条命令的输出作为后一条命令的输入。

openssl enc -aes-256-cbc -d -a -kfile:这是OpenSSL的命令,用于解密数据。其中:

-aes-256-cbc:指定使用AES-256-CBC算法进行解密。
-d:表示进行解密操作。
-a:表示输出结果以Base64格式编码。
-kfile:后面跟着密钥文件的路径。这里没有指定路径,所以会从标准输入读取密钥。
所以,这条命令的整体作用是将前一条命令输出的密文通过指定的密钥进行解密,并以Base64格式输出解密后的明文。

执行的openssl命令需要在docker内执行,否则报错。
在这里插入图片描述
可以得到解密后的明文字符串是“Leaving passwords in docker images is not so secure”

存储密码的文件是 default_secret

09 后量子密码学

量子计算机已经出现,并且每年在可用量子位上获得更多能力。量子计算机能够并且将能够解密用被认为安全的算法加密的信息。多年来,许多使用量子易受攻击密码术的加密通信被记录下来。当量子计算机足够强大时,这些信息将被解密。即使信息可能已经过时,它仍然可能包含可以被滥用的有价值的信息。除了有些私人信息会被不相关方知道的事实外。

数学为后量子时代提供了答案。新的密码学已经可用,现在应该使用它来最大限度地减少威胁。

openssl

https://blog.csdn.net/qq_37037348/article/details/131489812
https://blog.csdn.net/weixin_52622200/article/details/119895087

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值