搜尋
首頁運維安全誤用html entities函數引發的漏洞怎麼解決

題目程式碼如下:

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

漏洞解析

根據題目意思,這裡考察的應該是個xss漏洞 ,漏洞觸發點應該在程式碼中的第13-14行 。這兩行程式碼的作用是直接輸出一個html的 <a></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> 標籤。

<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 "";
}

?>
# 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中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具