XSS学习之xss20

前言

这是比较简单的xss练习小游戏,非常适合入门。一直以来,对xss的内容总感觉有一些屏障,应该是因为动手实践太少。所以,趁此机会,好好学习一番,打好基础,以后再继续深入。

关于xss

1.概念:XSS攻击全称跨站脚本攻击(Cross-Site Scripting,XSS)是一种经常出现在 WEB 应用程序中的计算机安全漏洞。其是由于 WEB 应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取 Cookies 资料窃取、会话劫持、钓鱼欺骗等各种攻击。

2.分类:

  • 反射型 XSS:攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
  • 持久型 XSS:也叫存储型跨站脚本,此类 XSS 不需要用户单击特定 URL 就能执行跨站脚本,攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
  • DOM XSS:DOM-Based XSS 是基于 DOM 文档对象模型的一种漏洞,受客户端浏览器的脚本代码所影响。

3.利用:

  • Cookies 窃取 :获取客户端的 Cookies 信息
  • 会话劫持 :接管现存的动态会话的过程
  • 钓鱼 :包括重定向钓鱼、HTML 注入式钓鱼、iframe 钓鱼、Flash 钓鱼等
  • 网页挂马:一般都是通过篡改网页的方式来实现的,如在 XSS 中使用 <iframe>标签。
  • DOS 与 DDOS:注入恶意 JavaScript 代码,可能会引起一些拒绝服务攻击。
  • XSS 蠕虫 :通过精心构造的 XSS 代码,可以实现非法转账、篡改信息、删除文章、自我复制等诸多功能。

开始实践

level1

URL中有一个name参数,既然是练习xss,直接使用<script>alert(1)</script>试试,即 http://localhost/xss/level1.php?name=<script>alert(1)</script> 成功。

查看关键代码:

<h1 align=center>欢迎来到level1</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>

直接输出,没有任何过滤,所以可执行。再看看提交信息:

本来为用户名的内容被执行。


level2

1.使用<script>alert(1)</script>试试,未成功,发现:

<>都被转义了,查看源码:

<h1 align=center>欢迎来到level2</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>

使用了htmlspecialchars($str)函数,这个函数的作用是把一些预定义的字符转换为 HTML 实体。
预定义字符包括:

  • & (和号)成为 &amp;
  • " (双引号)成为 &quot;
  • ' (单引号)成为 '
  • < (小于)成为 &lt;
  • > (大于)成为 &gt;

注:要把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数。

2.htmlspecialchars($str)函数的语法为:htmlspecialchars(string,flags,character-set,double_encode) 主要看前面两个参数:
string:必需,规定要转换的字符串。
flags:可选,规定如何处理引号、无效的编码以及使用哪种文档类型。这个参数主要看可用的引号类型:

  • ENT_COMPAT - 默认。仅编码双引号。
  • ENT_QUOTES - 编码双引号和单引号。
  • ENT_NOQUOTES - 不编码任何引号。

关于其他内容,可查看:PHP htmlspecialchars() 函数

3.知道了htmlspecialchars($str)函数的作用,那该如何绕过并执行呢。其实这题还用不到它。可以看到,只在输出处进行了转义,在输入处可利用。可将input标签提前闭合。构造:"><script>alert(1)</script><" 成功。解析为:


level3

1.提交上一关的payload,发现:

看来这次是两处都进行了HTML实体转换。看看源码,的确如此,值得注意的为单引号闭合。

<h1 align=center>欢迎来到level3</h1>
<?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>";

2.不过,还有有很多JS事件可以利用。这里列举几个:
οnmοuseenter=alert() //当鼠标移动到就会触发
οnclick=alert() //鼠标点击时就会触发
οnchange=alert() //在域的内容改变时发生
οninput=alert() //在用户输入时触发
οnmοuseοver=alert()//鼠标移动到就会触发

注意:只有在htmlspecialchars($str)函数未指定第二个参数flag时,即ENT_COMPAT 时,可用于闭合单引号情况的输入。如:此次输入的value就是单引号闭合

3.使用1'onclick='window.alert()试试,成功


####level4
1.先提交上题的1'onclick='window.alert(1)试试,发现闭合为双引号:

2.改用双引号,1"onclick="window.alert(1)成功。

发现这个题也是没有在输入处进行HTML实体转换。可以看看源码:

<h1 align=center>欢迎来到level4</h1>
<?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>';
?>

这里多了对<>的过滤$str2=str_replace(">","",$str); $str3=str_replace("<","",$str2); 但我们所构造的也已经绕过了。


####level5
1.提交上题的payload,发现:

这种过滤比较麻烦,不好绕过。先试试大小写:1"Onclick="window.alert(1) 没用,提示同样的错误。

2.说明带有on的事件都不可以使用了,测试发现<script也不可用(前面的script变了,但后面的没变,说明不是针对script,而是<script)。

继续观察发现,在输入处并没有对<>进行转义。所以,这里使用另一种方法:javascript:alert(1) 构造:"><a href="javascript:alert('1')">try</a>" 结果如下:

点击插入的超链接,成功。查看解析为:

3.现在看看源码:

<h1 align=center>欢迎来到level5</h1>
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烜奕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值