目錄
實例分析
漏洞验证
漏洞修复
结语
首頁 運維 安全 誤用html entities函數引發的漏洞怎麼解決

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

May 12, 2023 pm 02:13 PM
html entities

題目程式碼如下:

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

See all articles