您当前位置: 首页 » 敏感函数 » htmlspecialchars()

htmlspecialchars()

2017年2月3日 | 发表评论(0) 查看评论

htmlspecialchars()只是将’&’,”'(单引号),'”‘(双引号),'<‘(小于号),’>’(大于号)转义为html实体字符。而很多开发者习惯用htmlspecialchars()来过滤,而htmlspecialchars()的过滤是不全面的,所以会导致漏掉一些特殊字符,从而绕过过滤或者扰乱原有逻辑结构

一、htmlspecialchars()默认只编码双引号,所以普通的htmlspecialchars($str)无法过滤单引号,导致注入。

参数 描述
string 必需。规定要转换的字符串。
flags 可选。规定如何处理引号、无效的编码以及使用哪种文档类型。

可用的引号类型:

· ENT_COMPAT – 默认。仅编码双引号。

· ENT_QUOTES – 编码双引号和单引号。

· ENT_NOQUOTES – 不编码任何引号。

无效的编码:

· ENT_IGNORE – 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。

· ENT_SUBSTITUTE – 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 的字符,而不是返回一个空的字符串。

· ENT_DISALLOWED – 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 。

规定使用的文档类型的附加 flags:

· ENT_HTML401 – 默认。作为 HTML 4.01 处理代码。

· ENT_HTML5 – 作为 HTML 5 处理代码。

· ENT_XML1 – 作为 XML 1 处理代码。

· ENT_XHTML – 作为 XHTML 处理代码。

当1.php?a=1%27%22%27时输出1′”‘

实例:

在BEECMS V4.0_R_20150708中admin/login.php代码如下:

由post获得 并经过fl_value和fl_html处理。

在includes/fun.php下

导致引入单引号进行注入

且在正则内过滤了union和on 采用unionon即可绕过 其他关键字双写即可绕过

 

二、不过滤反斜线,可以通过转义实现逃逸单引号

htmlspecialchars()是不对反斜线()进行转义的,所以如果在sql语句中遇到变量只使用htmlspecialchars()过滤的时候,可以引入一个来注释其中一个单引号,达到扰乱原逻辑结构的目的

实例:Semcms v2.1

文件位置:/Admin/Include/function.php

可以看到cookie只简单的用htmlspecialchars()函数过滤了。我们让$cookieuser=,转义掉右边的单引号,使得$cookieuser左边单引号和$cookieuserqx左边的单引号成对,$cookieuserqx成功逃逸出单引号的包围。

最终执行的sql语句应该是这样的:

$sql=”select * from sc_user where user_ps=” and user_qx=’or 1=1 #'”;

即实现了任意用户登录

添加cookie

Cookie: scuser=; scuserqx=or 1=1 #

分类:

敏感函数

| 标签: