变态和变态相遇,有一半的可能会情投意合,一般的可能会彼此恶心。这个变态把我恶心坏了。
概述
个人对XSS攻击的原理认知:
原理:对可以控制传参的位置,比如url链接中,输入框中,首先闭合输出参数位置前后网页标签,在闭合的中间加上JavaScript代码或者其他的html标签,使得网页能够执行你添加的参数功能。
危害:凡是js能做的,大部分xss漏洞都能利用,常见的比如获取当前cookie,获取浏览器保存的账号密码 、获取屏幕截图,获取页面的数据,改变页面的逻辑,向服务器发送数据请求等。
情景:在挖洞的情景下,只要保证能弹个窗,或者执行js代码即可。但是其中会涉及到很多前端相关的知识,比如如何在不同标签下触发弹窗,怎么绕过拦截等等。
分类
xss分三种,分别为反射型,存储型,DOM型。但是按照攻击代码来源可以分成两种:
- 反射型:通过URL参数直接注入
- 存储型:保存到网址数据库,在其他用户访问该数据的时候会被读取并执行,常在留言板,下单栏,文章频率,输入框等。
首先看第一种,通过源码来分析他的原理,首先写一个简单的flask后台,功能很简单,只负责返回输出用户输入的参数,代码如下:
from flask import Flask,request
app = Flask(__name__)
@app.route('/')
def index():
data = request.args.get('id')
return data
if __name__ == '__main__':
app.run()
使用火狐浏览器,打开网址:
http://127.0.0.1:5000/?id=langzi666
页面返回内容为:
因为传入的参数是可以控制的,并且没有任何的过滤机制,直接控制id的变量即可,访问:
http://127.0.0.1:5000/?id=<script>alert('浪子好帅啊~~要晕了')</script>
页面返回内容为:
但是这张插入在url中代码很长很可疑,可以做短网址处理。
第二种存储型,即网页提供一个输入框,你在其中填写js代码后,后台保存到数据库,当其他人或者管理员查看你输入的内容的时候,就会出发js代码。
4个可能存在XSS的位置
在下面这些点中可以存在xss注入点:
- HTML节点内容:网页的内容包含用户输入的信息
- HTML属性:网页的节点的属性是由用户输入的信息组成,跃出节点属性的范围
- JS代码:js代码中由后台注入的变量,或者包含用户输入的信息
- 富文本:一大段的html
HTML节点内容
<div>我的头发呢?</div>
比如这个的节点,中间输出用户输入的内容,那么能够控制输出的内容。变成这样:
<div>我都头发呢<script>alert(在我这里!)</script></div>
因为中间的变量是可以控制的,所里这里可能存在XSS攻击。
HTML属性
比如有一张图片,图片来自用户的输入(之前上传的图片地址,外部图片地址,等等),正常情况下应该是这样的结果:
<img src="http://www.langzi.fun/upload/my_girl.jpg"/>
但是因为节点变得可控,就有可能变成这样的结果:
<img src="1asd1a" onerror="alert(1)"/>
# src应该是图片的地址,onerror的意思是如果找不到图片或者加载失败,就执行的功能
如果图片存在,比如:
<img src="http://www.langzi.fun/upload/my_girl.jpg" onerror="alert(1)"/>
是不会触发弹窗的,那最上面的flask例子就能证明,分别访问下面两个网址:
http://127.0.0.1:5000/?id=<img src="http://www.langzi.fun/upload/my_girl.jpg" onerror="alert(1)"/>
http://127.0.0.1:5000/?id=<img src="阿斯顿撒法呃1asdy_girl.jpg" onerror="alert(1)"/>
前者不触发,后者触发。有些网站是通过如下方式获取图片的,比如:
http://www.langzi.fun/image/1
这样会调出第一张图,通过下面方式闭合img标签,填写错误不存在的图片即可完成xss
http://www.langzi.fun/image/1dasd122safqas" onerror="alert(1)
JS代码
后端传递过来的代码应该是这样:
<script>var data = 'hello'</script>
网址中是这样的
http://www.langzi.fun/?data=hello
因为参数可控,所以只需要和上面一样,进行闭合然后加上js代码即可
http://www.langzi.fun/?data=hello';alert(1)'
富文本
网址的编辑器都是富文本编辑器,富文本指在编辑的需求下,是需要允许部分HTML标签在渲染后有效的,但是又有部分诸如script这样的标签不应该有效,而且仅仅滤去script还不够,还有更多情况像img这样必不可少、看似安全的标签也会让人有机可乘。
转义
html中的转义:
显示结果:实体名称:实体编号
< : < : <
> : $gt; : >
" : "e; : "
' : %apos; : '
( :(
) : )
xss防御会把这些html中用来闭合的位置进行转义,这些转义后的符号在html的内容中并不会出现异常效果和原来的一样。但是有些位置即使没有引号闭合,如果中间有空格也会造成xss。
如果后端代码会把单引号替换或者屏蔽,可以用上面的实体名称或者实体编号代替,可以简单的绕过拦截。
即访问上面flask的网址也会出现弹窗:
127.0.0.1:5000/?id=<img src=hello onerror='alert(1)'/>
127.0.0.1:5000/?id=<img src='hello'onerror='alert(1)'/>
常用绕过waf
- 转义,即上面的标签转义,但是必须要用在标签里面
- 改变大小写
- hex,url编码
- 使用其他标签引用,比如onerror,onchange等
- 使用js自带的函数编码
- 使用 ` 代替括号
使用svg标签插入,可以绕过注释
<svg onload=";alert('插入svg标签成功~')">
这个网上有许多许多的资料,我对xss还并不是很熟,所以就不班门弄斧了。
权限维持
即如果你入侵成功后台后,修改登陆成功文件,利用js代码获取每次登陆成功后管理员的cookie,发送到你的服务器。
比如登陆后台地址为:
http://www.langzi.fun/admin.php
登陆成功后会跳转到:
http://www.langzi.fun/admin_manage.php
这个时候修改admin_manage.php代码的文件,就能持续获取管理员的cookie。
反入侵webshell箱子
一些目录文件会做后门,做后门的方式即获取该目录当前路径和密码,然后发送到箱子的服务器上面。
这个时候如果你能成功抓到数据库,将发送的数据进行篡改,改成一段获取cookie的js代码,这样就能获取到webshell箱子服务器后台的cookie,通过找到该webshell后台,就能实现反向入侵。
不过这是太理想化的情况,实际情况会复杂很多。