演示案例:
➢ WEB攻防-XSS跨站-安全防护&CSP&Httponly&WAF等
➢ WEB攻防-XSS跨站-工具项目&XSStrike&Chypass_pro
一、CSP
内容安全策略是一种可信白名单机制,来限制网站中是否可以包含某来源内容。
该制度明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单,
它的实现和执行全部由浏览器完成,开发者只需提供配置。
禁止加载外域代码,防止复杂的攻击逻辑。
禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
合理使用上报可以及时发现XSS,利于尽快修复问题。
开没开CSP直接可以在数据包中看到

实验:
1、设置任何域JS加载



2、设置本地域JS加载
绕过利用条件:文件上传JS绕过


只有当前域的x.js执行了
3、设置本地域JS外加限制目录
绕过利用条件1:目录有302跳转绕过



生效的是本地的js代码,因为static下有一个302.php做了一个重定向操作,这个重定向操作能够目录遍历,所以执行了当前域的js
绕过利用条件2:文件上传JS(指定目录)


只有指定目录的js代码生效了
4、其他绕过技术
参考:https://xz.aliyun.com/news/11816
二、http_only
一个可以在设置Cookie时使用的标记;当一个Cookie被标记为HttpOnly时,JavaScript无法访问该Cookie,只能通过HTTP(或HTTPS)协议传输。
这一特性有助于防止跨站脚本攻击(XSS),因为攻击者无法通过JavaScript代码窃取存储在 HttpOnly Cookie中的敏感信息。
HttpOnly是**Cookie**的一个安全属性,由服务器通过Set-Cookie响应头设置,用于限制客户端脚本(如JavaScript)对Cookie的访问。他的核心目的是防御XSS攻击对敏感Cookie的窃取。
:::info
cookie名,cookie值,cookie失效时间,cookie有效路径,cookie有效域名,secure安全属性,httponly安全属性
setcookie(‘name’, ‘xiaodi’, time() + 3600, ‘/xss’, ‘’, false, true);
:::
判断启用httponly的方法,就是在浏览器存储cookie的地方,看httponly字段就行

实验:
开启和未开启HttpOnly时XSS窃取Cookie的加载情况

name开了httponly,pass没开

所以只弹窗pass
绕过:有但鸡肋
(1)CVE-2012-0053
(2)PHPINFO页面
(3) Flash/Java
blog.csdn.net/weixin_42478365/article/details/116597222
思路:一般可不采用获取Cookie利用,采用方式(钓鱼,浏览器攻击框架等)
三、WAF或代码Filter
黑盒XSS手工分析:
-页面中显示的数据找可控的(有些隐藏的)
-利用可控地方发送JS代码去看执行加载情况
-成功执行即XSS,不能成功就看语句输出的地方显示(过滤)
-根据显示分析为什么不能执行(实体化,符号括起来,关键字被删除等)
1、人工分析
演示:xss-lab(关卡)
https://xz.aliyun.com/news/11816
https://github.com/Re13orn/xss-lab
blog.csdn.net/2301_80031208/article/details/139159525
level1:

直接中在name参数后输入恶意js语句就行
1 | <script>alert(1)</acript> |
level2:

发现并没有弹窗,说明js没被正常执行,我们审查元素看一下

这里就很明显了,<>被实体化了,所以执行不,我们换个地方看看呢,发现搜索框也有js语句

发现这个js语句没被实体化,只是被放在了input标签里的value值中,所以思路就是闭合前面的属性和标签,让js语句能够正常执行
1 | "><script>alert('xss')</script> |
就通关了
level3:

首先思路和level2一样,审查元素看一下,这里搜索框“也被实体化了,所以闭合标签这种方法就不能用了,只能用事件了。
https://xz.aliyun.com/news/3699这里有标签介绍
‘ onfocus=alert(1) ‘就通过了
level4:
这里和level3基本一样,都是用事件来完成,只不过用的是双引号来闭合其他属性” onfocus=alert(1) “
htmlspecialchars()函数:把特殊字符转为html实体,用来防御xss。但是默认情况下只转双引号,不转单引号
在html属性中Javascript:alert(1)和alert(1)是一样的,javascript:是伪协议就是告诉浏览器后面内容当做js执行,事件属性默认本身就是执行js,所以没区别。但是在a标签中href中必须加javascript:要不然就当做网址了。
level5:

还是用onfocus标签发现on被过滤成o_n了,那就换一个事件呗,用a标签先把前面闭合面用a标签,当然其他事件也是可以的。

1 | “><a href=javascritp:alert(1)>xxx</a> |
level6:
这里使用大小写绕过,那么我们作为防护方来说,那怎么避免大小写绕过呢,一个一个过滤那也太麻烦了,方案一:将用户输入转为小写,在做关键词黑名单匹配,php来说用strtolower()函数,htmlspecialchars($data,ENT_QUOTES(必开)),方案二:针对大小写绕过的正则,/focus/i
level7:
1 | 输入"><script>alert(1)</script> |

1 | 输入'><script>alert(1)</script> |

发现script被过滤了,那尝试大小写呗,但是不太行,输入内容被strtolower函数转换成小写了,那就尝试双写绕过

1 | "><sscriptcript>alert('xss')</sscriptcript>就绕过了 |
level8:
这里用Unicode,为什么呢?你输入Unicode编码后的东西后端看到的是乱码,后端看不到javascript所以就放行,浏览器解析html时会自动解码。

用Unicode绕
javascript:alert(1)
level9:

代码审计中就能看出来,友情连接必须有http://其余和level8一模一样
我原本想法是把javascript:alert(1)编码了,然后在开头加http://但是不行,这样的话就会被认为是一个网址不是js代码了,我们可以在javascript:alert(1)编码最后加//http://用//注释掉
level10:
隐藏属性触发闭合。就是表单中有的标签type是hidden,起始有属性值为你输得js,但是你看不到,那你就type改为text想办法看到呗
还是onfocus事件,这是一开始的样子

这是成功后的样子

11-20
https://blog.csdn.net/l2872253606/article/details/125638898
2、工具项目
https://github.com/s0md3v/XSStrike
https://github.com/wxwhhh/Chypass_pro(推荐使用)

安装好后配置api key我这里用的是千问,因为有免费额度😄
用的时候就正常抓包,把包转发到这里,然后在需要xss的地方写一个
演示: