首頁  >  文章  >  運維  >  誤用html entities函數引發的漏洞怎麼解決

誤用html entities函數引發的漏洞怎麼解決

WBOY
WBOY轉載
2023-05-12 14:13:421363瀏覽

題目程式碼如下:

误用html entities函数引发的漏洞怎么解决

漏洞解析

根據題目意思,這裡考察的應該是個xss漏洞 ,漏洞觸發點應該在程式碼中的第13-14行 。這兩行程式碼的作用是直接輸出一個html的 <a> 標籤。程式碼中的 第3-5行foreach循環$_GET 傳入的參數進行了處理,但這裡有個問題。我們看下 第四行 的程式碼,這行程式碼針對 $value 進行型別轉換,強制變成int型別。但這部分程式碼只處理了 $value 變量,沒針對 $key 變數進行處理。經過了第3-5行 的程式碼處理之後,依照& 這個符號進行分割,然後拼接到第13行echo 語句中,在輸出的時候又進行了一次htmlentities 函數處理。 htmlentities 函數主要是會對一些特殊符號進行HTML實體編碼。具體定義如下:

htmlentities — 將字元轉換為HTML 轉義字元

string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )

作用:在寫PHP程式碼時,無法在字串中直接寫實體字符,PHP提供了一個將HTML特殊字元轉換成實體字元的函數htmlentities()。

註:htmlentities() 並不能轉換所有的特殊字符,是轉換除了空格之外的特殊字符,且單引號和雙引號需要單獨控制(透過第二個參數)。第2個參數取值有3種,分別如下:

  • ENT_COMPAT(預設值):只轉換雙引號。

  • ENT_QUOTES:兩個引號都會轉換。

  • ENT_NOQUOTES:兩種引號都不會轉換。

這裡附上一個HTML 中有用的字元實體表

误用html entities函数引发的漏洞怎么解决

#經過上面的分析,我們再回到題目,想想如何建構一下攻擊payload 。我們先整理一些已知資訊:

  • 這裡的$query 參數可控制

  • htmlentities 函數在這裡可逃逸單引號

  • xss的漏洞觸發點在<a> 標籤。

<a> 中,我們可以透過javascript 事件來執行js程式碼,例如: onclick#這類事件,因此最後的poc建構如下:

/?a'onclick%3dalert(1)%2f%2f=c

误用html entities函数引发的漏洞怎么解决

實例分析

本次實例分析選擇DM企業建置站系統v201710 中的 sql注入漏洞 來進行分析。首先,我們可以從cnvd上面看到一些相關信息,如下:

误用html entities函数引发的漏洞怎么解决

從漏洞通告中可以發現一些有用的信息,漏洞位置在登陸處,搭建的時候提示後台登陸口位置在admindm-yourname/g.php 文件中,打開這個文件,發現重定向到admindm-yournamemod_common/login.php 文件中,所以漏洞觸發點應該就在這個文件中。

误用html entities函数引发的漏洞怎么解决

打開admindm-yournamemod_common/login.php 這個文件,一眼就看到漏洞位置,截取部分相關程式碼如下:

误用html entities函数引发的漏洞怎么解决

#第15行 很明顯地存在sql注入漏洞,透過拼接的方式直接插入到select語句。 第15行 中的 $user 變數是透過 POST 方式提交上來,其值可控。但是上圖的 第3行 程式碼呼叫 htmlentitiesdm 函數,對 POST 資料進行了處理,我們跟進這個 htmlentitiesdm 函數。此函數位置在 component/dm-config/global.common.php 檔案中,截取關鍵程式碼如下:

误用html entities函数引发的漏洞怎么解决

这个函数是调用 htmlentities 函数针对输入的数据进行处理。前面我们已经介绍过了这个函数的用法,这里这个函数的可选参数是 ENT_NOQUOTES ,也就是说两种引号都不转换。下面我们来看个小例子:

误用html entities函数引发的漏洞怎么解决

这里我猜测开发者应该是考虑到了xss的问题,但是由于 htmlentities 这个函数选择的参数出现了偏差,导致这里我们可以引入单引号造成注入的问题。

我们看看最新版是怎么修复,使用 beyond compare 对比两个版本代码的差别。

误用html entities函数引发的漏洞怎么解决

新版修复的时候将可选参数修改为 ENT_QUOTES ,这个参数的作用就是过滤单引号加双引号,我们来看看下面这个例子,就很容易明白了这个参数的作用了。

误用html entities函数引发的漏洞怎么解决

漏洞验证

这里因为没有回显,所以是盲注,下面是验证截图:

误用html entities函数引发的漏洞怎么解决

漏洞修复

针对 htmlentities 这个函数,我们建议大家在使用的时候,尽量加上可选参数,并且选择 ENT_QUOTES 参数。

误用html entities函数引发的漏洞怎么解决

我们看看对比的效果

误用html entities函数引发的漏洞怎么解决

结语

看完了上述分析,不知道大家是否对 htmlentities 函数在使用过程中可能产生的问题,有了更加深入的理解,文中用到的代码可以从 这里 下载,当然文中若有不当之处,还望各位斧正。如果你对我们的项目感兴趣,欢迎发送邮件到 hongrisec@gmail.com 联系我们。Day12 的分析文章就到这里,我们最后留了一道CTF题目给大家练手,题目如下:

<?php
require &#39;db.inc.php&#39;;

if(isset($_REQUEST[&#39;username&#39;])){
    if(preg_match("/(?:\w*)\W*?[a-z].*(R|ELECT|OIN|NTO|HERE|NION)/i", $_REQUEST[&#39;username&#39;])){
        die("Attack detected!!!");
    }
}

if(isset($_REQUEST[&#39;password&#39;])){
    if(preg_match("/(?:\w*)\W*?[a-z].*(R|ELECT|OIN|NTO|HERE|NION)/i", $_REQUEST[&#39;password&#39;])){
        die("Attack detected!!!");
    }
}

function clean($str){
    if(get_magic_quotes_gpc()){
        $str=stripslashes($str);
    }
    return htmlentities($str, ENT_QUOTES);
}

$username = @clean((string)$_GET[&#39;username&#39;]);
$password = @clean((string)$_GET[&#39;password&#39;]);


$query=&#39;SELECT * FROM ctf.users WHERE name=\&#39;&#39;.$username.&#39;\&#39; AND pass=\&#39;&#39;.$password.&#39;\&#39;;&#39;;

#echo $query;

$result=mysql_query($query);
while($row = mysql_fetch_array($result))
{
    echo "<tr>";
    echo "<td>" . $row['name'] . "</td>";
    echo "</tr>";
}

?>
# Host: localhost  (Version: 5.5.53)
# Date: 2018-08-05 12:55:29
# Generator: MySQL-Front 5.3  (Build 4.234)

/*!40101 SET NAMES utf8 */;

#
# Structure for table "users"
#

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `pass` varchar(255) DEFAULT NULL,
  `flag` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

#
# Data for table "users"
#

/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES (1,'admin','qwer!@#zxca','hrctf{sql_Inject1on_Is_1nterEst1ng}');
/*!40000 ALTER TABLE `users` ENABLE KEYS */;

以上是誤用html entities函數引發的漏洞怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除