XSS之htmlspecialchars

1.htmlspecialchars的用法

1.1说明
htmlspecialchars(
    string $string,
    int $flags = ENT_COMPAT | ENT_HTML401,
    string $encoding = ini_get("default_charset"),
    bool $double_encode = true
): string

1.string:
待转换的 string。

2. flag:
位掩码,由以下某个或多个标记组成,设置转义处理细节、无效单元序列、文档类型。 默认是 ENT_COMPAT | ENT_HTML401。
在这里插入图片描述
3. encoding:
本函数使用效果上,如果 string 对以下字符编码是有效的, ISO-8859-1、 ISO-8859-15、 UTF-8、 cp866、 cp1251、 cp1252、 KOI8-R 将具有相同的效果。 也就是说,在这些编码里, 受 htmlspecialchars() 影响的字符会占据相同的位置。

支持以下字符集:
在这里插入图片描述

注意:其他字符集没有认可。将会使用默认编码并抛出异常。

4. double_encode:

关闭 double_encode 时,PHP 不会转换现有的 HTML 实体, 默认是全部转换。

2.用法

总的来说,就是把字符串转换成一串编码,类似于JS编码转换和url编码转换
如下所示:

<?php
$str = '<>a sdd\'"';
echo htmlspecialchars($str, ENT_QUOTES) . PHP_EOL;
echo htmlentities($str);

上面这串代码会把字符串<>a sdd\'"转换成&lt;&gt;a sdd&#039;&quot; &lt;&gt;a sdd'&quot;;

2.htmlspecialchars和XSS漏洞的关联
<?php
$str = '<>a sdd\'"';
echo htmlspecialchars($str, ENT_QUOTES) . PHP_EOL;
echo htmlentities($str);

运行如上这串代码,你就会发现htmlspecialchars的用法:

  • 如下1:(这是编辑器的输出结果)
    在这里插入图片描述
  • 如下2: (这是浏览器的输出结果)

在这里插入图片描述

浏览器和编辑器的运行结果不一样,原因是这样的,为了避免XSS漏洞的注入,可以把要输出的字符串先进行相应的编码,这样就不会运行脚本语句,但是浏览器又会将相应的编码进行转换,使用我们看到的和原来输出的一模一样。

3.如何绕过htmlspecialchars进行注入了

俗话说的好,不了解攻击如何进行防御了,对吧,所以我们马上进入实战

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</script>
</head>
<body>
<?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>';
?>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

可以把如上代码运行进行XSS注入实验,如上实验是比较困难的一种,所以我们先进行如下比较简单的一种,再来学习上面的一种,代码如下:

<?php 
	$name = $_GET["name"];
	$name_new = htmlspecialchars($name);
?>
<form action="" method="get">
<input type='text' value='<?php echo $name_new?>' name="name">
<button>提交</button>
</form>


由于,输出在标签里面,所以不用担心><号的过滤问题,又htmlspecialchars($name)没有设置任何参数,所以是不过滤单引号的,所以使用如下语句:
' onmouseover='javascript:alert(1):前面的一个单引号让 value='形成闭合,然后再输出 onmouseover='javascript:alert(1)'我们构造语句一定要正确,否则不执行CSS

接下来讨论比较难的,如果我们只看htmlspecialchars($str),这个题我们一辈子都做不出来,因为,只要我们输入脚本,就会被转义,下面还有一个突破点:
$str,输入"><script>alert(1)</script>进行了

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

安全天天学

你的鼓励是对我最大的鼓励

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

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

打赏作者

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

抵扣说明:

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

余额充值