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 处理代码。 |
<?php $a=$_GET[‘a‘]; echo htmlspecialchars($a);
当1.php?a=1%27%22%27时输出1‘"‘
实例:
在BEECMS V4.0_R_20150708中admin/login.php代码如下:
elseif($action==‘ck_login‘){ global $submit,$user,$password,$_sys,$code; $submit=$_POST[‘submit‘]; $user=fl_html(fl_value($_POST[‘user‘])); $password=fl_html(fl_value($_POST[‘password‘])); $code=$_POST[‘code‘]; if(!isset($submit)){ msg(‘请从登陆页面进入‘); } if(empty($user)||empty($password)){ msg("密码或用户名不能为空"); } if(!empty($_sys[‘safe_open‘])){ foreach($_sys[‘safe_open‘] as $k=>$v){ if($v==‘3‘){ if($code!=$s_code){msg("验证码不正确");} } } } check_login($user,$password); $user=fl_html(fl_value($_POST[‘user‘])); $password=fl_html(fl_value($_POST[‘password‘]));
由post获得 并经过fl_value和fl_html处理。
在includes/fun.php下
function fl_value($str){ if(empty($str)){return;} return preg_replace(‘/select|insert | update | and | in | on | left | joins | delete |%|=|/*|*|../|./| union | from | where | group | into |load_file |outfile/i‘,‘‘,$str); } define(‘INC_BEES‘,‘B‘.‘EE‘.‘SCMS‘); function fl_html($str){ return htmlspecialchars($str); } Fl_value过滤了关键字 Fl_html采用htmlspecialchars 只过滤了双引号 function check_login($user,$password){ $rel=$GLOBALS[‘mysql‘]->fetch_asc("select id,admin_name,admin_password,admin_purview,is_disable from ".DB_PRE."admin where admin_name=‘".$user."‘ limit 0,1");
导致引入单引号进行注入
且在正则内过滤了union和on 采用unionon即可绕过 其他关键字双写即可绕过
查看原文:http://www.am0s.com/functions/181.html
时间: 2024-10-14 20:13:46