一篇文章带你从XSS入门到进阶(附Fuzzing+BypassWAF+Payloads)
一篇文章带你从XSS入门到进阶山丘安全攻防实验室
大家好,我是山丘安全攻防实验室作家陈殷,今天将带大家深入浅出理解XSS攻击。
XSS简介XSS分类XSS实战XSS FuzzingXSS WAF Bypass思路XSS工具XSS修复xss简介OWASP TOP 10OWASP(开放式Web应用程序安全项目)的工具、文档、论坛和全球各地分会都是开放的,对所有致力于改进应用程序安全的人士开放,其最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结了Web应用程序最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。
Cross Site Scripting跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以在代码审计中xss漏洞关键就是寻找参数未过滤的输出函数。
XSS分类反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。DOM型XSS由于危害较小,我们将其归为反射型XSS。
存储型XSS:<持久化>代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
XSS实战说明:本文需要一定的JavaScript基础和PHP基础
工具:
PHPStudy
sublime
chrome
初探XSS原理:我在本地环境中搭建了xss.php,访问网址为:http://127.0.0.1/engineer/xss.php
反射型XSS代码是这样写的:访问链接后发现报错,原因是我们没有对第二行的age进行变量赋值
对其赋值:http://127.0.0.1/engineer/xss.php?age=12
查看源代码:
接下来我们对赋值的12尝试注入一个js语句
代码语言:javascript复制http://127.0.0.1/engineer/xss.php?age=%3Cscript%3Ealert(%27hill%20sec%20xss%20lab%27)%3C/script%3E查看源代码
可以看到成功注入了一个script代码并执行了alert输出提示内容
存储性XSS代码:存储型XSS的攻击流程:
打开web---->输入一个恶意代码---->恶意代码存放到数据库---->读取页面---->读取数据库---->返回web---->执行恶意代码
这个页面的功能是使用POST提交数据,生成然后再读取文本模拟数据库,提交数据之后页面会将数据写入store.txt,再打开页面时会读取store.txt中内容并输出在网页上,实现XSS Stored Attack.
第一次正常执行:
插入一个恶意JavaScript语句:
提交之后发现web触发了js代码
查看源代码
因此总结可得:
对程序的某个可控变量进行恶意JavaScript代码注入,若能被浏览器执行该程序即存在XSS漏洞
XSS小游戏过关笔记:下载地址请关注“山丘安全攻防实验室”回复:xssgame 或自行百度下载
篇幅限制,我们挑前五关来测试,后续通关指南可关注公众号推文
首页点击进入第一关:猜测name参数可控,进行paylaod执行:
123;
成功通关
第二关这里我们执行上关的payload试试,但是并未成功执行
查看源代码,XSS语句被赋值给value并且在input标签里,所以我们需要闭合value和input标签就可以正常弹窗了
exp:
代码语言:javascript复制 1">成功执行
第三关htmlspecialchars()函数是使用来把一些预定义的字符转换为HTML实体,返回转换后的新字符串,原字符串不变。如果 string 包含无效的编码,则返回一个空的字符串,除非设置了 ENT_IGNORE 或者 ENT_SUBSTITUTE 标志
被转换的预定义的字符有:
使用语法:
$str = htmlspecialchars(string,flags,character-set,double_encode);
string:规定要转换的字符串;
flags :可选参数,规定如何处理引号、无效的编码以及使用哪种文档类型;
确实转义了尖括号,这里可以用单引号闭合value但是没办法闭合input标签,我们添加一个改变事件即可
代码语言:javascript复制 ' onchange=alert`1` //添加一个改变事件
第四关第四关的代码和第三关的代码大同小异,把源码里面单引号变成了双引号,同样事件弹窗即可
把payload改一下就oki
第五关第五关难度提升,过滤了script和onclick标签,但是没过滤a标签
paylaod: