在本节中,将展示如何绕过常见的防御机制上传Web Shell,从而能够完全控制易受攻击的服务器。
混淆文件扩展名
即使是最详尽的黑名单也可能被经典的混淆技术绕过。假设验证代码区分大小写,那么就无法识别exploit.pHp实际上是一个.php文件,如果随后将文件扩展名映射到MIME类型的代码不区分大小写,那么这种差异允许将恶意PHP文件偷偷绕过验证,最终可能被服务器执行。
还可以使用以下技术获得类似的结果:
●提供多个扩展。根据解析文件名的算法,下面这种文件可能被解释为PHP或JPG文件,exploit.php.jpg
●添加尾随字符。一些组件会去除或忽略尾随空格、点等:exploit.php.
●尝试对点、正斜杠和反斜杠使用URL编码(或双URL编码)。如果在验证文件扩展名时该值没有被解码,但后来在服务器端被解码,这也可以上传恶意文件:exploit%2Ephp
●在文件扩展名前添加分号或URL编码的空字节字符。如果验证程序是用PHP或Java等高级语言编写的,但服务器使用C/C++的低级函数处理文件,这可能会导致文件名结尾出现差异,例如:exploit.asp;.jpg或exploit.asp%00.jpg
●尝试使用多字节unicode字符,在unicode转换或规范化后可能会转换为空字节和点。如果文件名被解析为UTF-8字符串,则可以将xC0 x2E、xc4 xAE或xC0 xAE等序列转换为x2E,然后在用于路径之前转换为ASCII字符
其他的防御措施包括剥离或替换危险的扩展名以防止文件被执行,但如果不递归这种防御机制,我们可以定位禁止的字符串,以便删除它仍然留下有效的文件扩展名。
比如,如果从exploit.p.phphp中把红色字符串剥离后,剩下的是什么?
场景试验-通过混淆文件扩展名上传Web Shell:
https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-obfuscated-file-extension
场景说明:
这个试验场景包含易受攻击的图片上传功能,某些文件扩展名被列入黑名单,但可以使用经典的混淆技术绕过这种防御。
试验目的:
要完成这个试验,需要上传一个基本的PHP Web Shell并使用它来泄露文件/home/carlos/secret的内容,并使用试验场景提供的按钮来提交此密钥。可以使用wiener:peter来登录自己的账号。
攻击过程:
①用wiener账号登录后,尝试上传一个.php的脚本,脚本内容如下,但是发现被禁止了,只能上传JPG和PNG格式的文件
echo file_get_contents('/home/carlos/secret');
②把上传脚本的请求发送给Repeater,修改下上传文件名的后缀,上传成功
③随后把获取这个文件的请求发送给Repeater,将得到的密钥提交即可完成本试验
有缺陷的文件内容验证
与隐式信任请求中指定的Content-Type不同,更安全地服务器会尝试验证文件的内容是否与预期内容实际匹配。
在图像上传功能的情况下,服务器可能会尝试验证图像的某些内在属性,比如尺寸。
例如,如果尝试上传PHP脚本,则它根本没有任何维度,因此服务器可以推断它不可能是图像,并相应地拒绝上传。
同样的,某些文件类型的可能总是在其页眉或页脚中包含特定的字节序列。这些可以用作指纹或签名来确定内容是否与预期的类型匹配。
例如,JPEG文件总是以字节FF D8 FF开头。
这是一种更可靠的文件类型验证方法,但即使这样也不是万无一失的,使用一些特殊的攻击工具,可以轻松创建在元数据中包含恶意代码的多种JPEG文件。
场景试验-通过多语言Web Shell上传远程执行代码:
https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-polyglot-web-shell-upload
场景说明:
这个试验场景包含易受攻击的图片上传功能,尽管它会检查文件的内容以验证它是否确实为图像,但仍然可以上传和执行服务器端代码。
试验目的:
要完成这个试验,需要上传一个基本的PHP Web Shell并使用它来泄露文件/home/carlos/secret的内容,并使用试验场景提供的按钮来提交此密钥。可以使用wiener:peter来登录自己的账号。
攻击过程:
①用wiener账号登录后,尝试上传一个.php的脚本,脚本内容如下,但是发现被禁止了。尝试利用以前的攻击方式都不成功,说明针对文件特性做了限制
echo file_get_contents('/home/carlos/secret');
②找一张JPG或PNG的图片,利用"exiftool"这个图片工具来做张一句话木马图片,先用这个工具看下文件属性,可以看到是PNG类型的,这个文件上传没有限制
③接下来在图片中提交评论,先简单测试下,语句如下:
exiftool –Comment="test123" image.png
④在评论中插入木马语句,因为需要定位密钥的位置,所以我们在盗取文件内容语句的前后分别加上"START"和"END"用于方便定位
exiftool -Comment="echo 'START' . file_get_contents('/home/carlos/secret') . ' END'; " image.png
⑤修改文件后缀,把pgn改成php,再用指令查看下文件类型,还是PNG
⑥上传这个文件,发现可以绕过限制上传成功了,获取下这个文件,然后在响应中定位到密钥的位置,上传密钥即可完成本试验
试验小结:
绕过图片格式检查其实还是其他方式,关键要看过滤机制是通过哪些方面来判定是否是图片,有些过滤会以文件开头的编码作为特征进行判断。
SQL注入攻击-检索隐藏的数据
HTTP高级请求走私-响应队列中毒
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):文件上传漏洞-攻击示例(三)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论