So beheben Sie die Sicherheitslücke, die durch den Missbrauch der Funktion von HTML-Entitäten verursacht wird

WBOY
Freigeben: 2023-05-12 14:13:42
nach vorne
1372 Leute haben es durchsucht

Der Fragecode lautet wie folgt:

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

Schwachstellenanalyse:

Entsprechend der Bedeutung der Frage sollte es sich bei dem, was hier untersucht wird, um eine xss-Schwachstelle handeln, und der Auslösepunkt der Schwachstelle sollte in liegen Zeilen 13-14. Die Funktion dieser beiden Codezeilen besteht darin, ein HTML-Tag <a> direkt auszugeben. In den <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 ]]] )
Nach dem Login kopieren

作用:在写PHP代码时,不能在字符串中直接写实体字符,PHP提供了一个将HTML特殊字符转换成实体字符的函数 htmlentities()。

注:htmlentities() 并不能转换所有的特殊字符,是转换除了空格之外的特殊字符,且单引号和双引号需要单独控制(通过第二个参数)。第2个参数取值有3种,分别如下:

  • ENT_COMPAT(默认值):只转换双引号。

  • ENT_QUOTES:两种引号都转换。

  • ENT_NOQUOTES:两种引号都不转换。

这里附上一个 HTML 中有用的字符实体表

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

经过上面的分析,我们再回到题目,想想如何构造一下攻击 payload 。我们先梳理一些已知信息:

  • 这里的 $query 参数可控

  • htmlentities 函数在这里可逃逸单引号

  • xss的漏洞触发点在 <a> 标签。

<a>Zeilen 3–5 im Code verarbeitet die foreach-Schleife die von $_GET

übergebenen Parameter, aber hier liegt ein Problem vor. Werfen wir einen Blick auf die

vierte Zeile误用html entities函数引发的漏洞怎么解决 des Codes. Diese Codezeile führt eine Typkonvertierung für

$value

durch und erzwingt, dass dieser vom Typ int ist. Aber dieser Teil des Codes verarbeitet nur die Variable

$value

, nicht die Variable $key. Nach der Codeverarbeitung in

Zeilen 3-5

wird er gemäß dem Symbol 误用html entities函数引发的漏洞怎么解决&

unterteilt und dann in

Zeile 13 in die echo-Anweisung gespleißt, und die Funktion htmlentities

wird erneut ausgeführt Deal mit ausgeben.

htmlentities误用html entities函数引发的漏洞怎么解决 Die Funktion kodiert hauptsächlich HTML-Entitäten für einige spezielle Symbole. Die spezifische Definition lautet wie folgt:

htmlentities – Zeichen in HTML-Escape-Zeichen umwandeln

/?a'onclick%3dalert(1)%2f%2f=c
Nach dem Login kopieren
Funktion: Beim Schreiben von PHP-Code können Entitätszeichen nicht direkt in die Zeichenfolge geschrieben werden. PHP bietet eine Methode zum Konvertieren von HTML-Sonderzeichen Die Funktion htmlentities() für Entity-Zeichen.

Hinweis: 误用html entities函数引发的漏洞怎么解决htmlentities()

konvertiert nicht alle Sonderzeichen außer Leerzeichen, und einfache Anführungszeichen und doppelte Anführungszeichen müssen separat gesteuert werden (über den zweiten Parameter). Für den zweiten Parameter gibt es drei Werte wie folgt:

  • ENT_COMPAT (Standardwert): Es werden nur doppelte Anführungszeichen konvertiert.
  • ENT_QUOTES: Konvertieren Sie beide Anführungszeichen.
  • ENT_NOQUOTES: Beide Arten von Anführungszeichen werden nicht konvertiert.
Hier ist eine Tabelle mit nützlichen Zeichenentitäten in HTML angehängtSo beheben Sie die Sicherheitslücke, die durch den Missbrauch der Funktion von HTML-Entitäten verursacht wirdNach der obigen Analyse kehren wir zum Thema zurück und überlegen, wie die Angriffs-Nutzlast aufgebaut werden soll. Sortieren wir zunächst einige bekannte Informationen:
  • Die $query-Parameter hier sind steuerbar
  • und die

    htmlentities误用html entities函数引发的漏洞怎么解决-Funktion ist es hier Escapeable einfache Anführungszeichen

  • 🎜Der Auslöser der Sicherheitslücke von xss liegt im <a>-Tag. 🎜
🎜In <a> können wir JS-Code über 🎜Javascript🎜-Ereignisse ausführen, wie zum Beispiel: 🎜onclick🎜 diese Art von Ereignis, also die endgültige POC-Konstruktion Wie folgt: 🎜
<?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>";
}

?>
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜🎜🎜Fallanalyse🎜🎜Diese Fallanalyse wählt die 🎜SQL-Injection-Schwachstelle🎜 im DM Enterprise Website Building System v201710 zur Analyse aus. Zunächst können wir einige relevante Informationen von cnvd sehen, wie folgt: 🎜🎜🎜🎜🎜Wir können einige nützliche Informationen aus dem Schwachstellenhinweis finden. Beim Erstellen wird der Hintergrund-Anmeldeport angezeigt befindet sich in der Datei 🎜admindm-yournamemod_common/login.php🎜. Öffnen Sie diese Datei und stellen Sie fest, dass sie zur Datei 🎜admindm-yournamemod_common/login.php🎜 umgeleitet wird. Der Auslösepunkt für die Sicherheitslücke sollte sich also in dieser Datei befinden. 🎜🎜🎜🎜🎜Öffnen Sie 🎜admindm-yournamemod_common/login.php🎜 In dieser Datei können Sie den Ort der Schwachstelle auf einen Blick erkennen und einen Teil des relevanten Codes wie folgt abfangen: 🎜🎜🎜🎜🎜🎜Zeile 15🎜 Es Es ist offensichtlich, dass eine SQL-Injection-Sicherheitslücke vorliegt, und die Spleißmethode wird direkt in die SELECT-Anweisung eingefügt. Die Variable 🎜$user🎜 in 🎜Zeile 15🎜 wird über 🎜POST🎜 übermittelt und ihr Wert ist kontrollierbar. Aber der 🎜Zeile 3🎜-Code im obigen Bild ruft die 🎜htmlentitiesdm🎜-Funktion auf, um die 🎜POST🎜-Daten zu verarbeiten. Wir verfolgen diese 🎜htmlentitiesdm🎜-Funktion. Die Funktion befindet sich in der Datei 🎜component/dm-config/global.common.php🎜. Der Schlüsselcode wird wie folgt abgefangen: 🎜🎜🎜🎜

这个函数是调用 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>";
}

?>
Nach dem Login kopieren
Nach dem Login kopieren
# 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 */;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo beheben Sie die Sicherheitslücke, die durch den Missbrauch der Funktion von HTML-Entitäten verursacht wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!