ホームページ  >  記事  >  運用・保守  >  htmlエンティティ機能の悪用による脆弱性の解決方法

htmlエンティティ機能の悪用による脆弱性の解決方法

WBOY
WBOY転載
2023-05-12 14:13:421329ブラウズ

質問コードは次のとおりです:

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

脆弱性分析:

質問の意味によると、これは何ですか?ここで調査されているのは xss 脆弱性 である必要があり、脆弱性のトリガー ポイントはコードの 行 13 ~ 14 である必要があります。これら 2 行のコードの機能は、HTML <a> タグを直接出力することです。コードの 3 ~ 5 行目 foreach ループ $_GET で渡されたパラメータを処理しますが、ここに問題があります。 の 4 行目のコードを見てみましょう。このコード行は、$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 コードを記述する場合、エンティティ文字を文字列に直接記述することはできません。 HTML 特殊文字をエンティティ文字に変換する関数 htmlentities()。

注:
htmlentities()

は、すべての特殊文字を変換することはできません。スペースを除く特殊文字が変換され、一重引用符と二重引用符は個別に制御する必要があります (2 つの引用符を介して)パラメーター)。 2 番目のパラメータには次の 3 つの値があります:

    ENT_COMPAT (デフォルト値): 二重引用符のみが変換されます。
  • ENT_QUOTES: 両方のタイプの引用符が変換されます。
  • ENT_NOQUOTES: どちらのタイプの引用符も変換されません。
  • HTML で役立つ文字エンティティの表をここに添付します。

误用html entities函数引发的漏洞怎么解决上記の分析が終わったら、トピックに戻りましょう。攻撃の構築方法

ペイロード

を考えてみましょう。まず既知の情報を整理しましょう:

    ここでの
  • $query

    パラメータは制御可能な

  • および
  • htmlエンティティです

    この関数はここで一重引用符をエスケープできます。

  • xss の脆弱性トリガー ポイントは
  • <a>

    タグ内にあります。

<a>

では、javascript イベントを通じて js コードを実行できます。たとえば、次のようになります。このタイプのイベントの場合、最終的な POC 構造は次のとおりです。

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

インスタンス分析

误用html entities函数引发的漏洞怎么解决この分析例は、DM エンタープライズ Web サイト構築システムで

を選択します。 v201710 SQL インジェクションの脆弱性

分析用。まず第一に、次のように cnvd からいくつかの関連情報を確認できます:

脆弱性通知からいくつかの有用な情報を見つけることができます。ログイン ポイント。ビルド時に、バックグラウンド ログイン ポートの場所が

admindm-yourname/g.php误用html entities函数引发的漏洞怎么解决 ファイルにあることを確認するメッセージが表示されます。このファイルを開くと、

admindm にリダイレクトされることがわかります。 -yournamemod_common/login.php

ファイルなので、脆弱性がトリガーされます。このファイル内にある必要があります。

admindm-yournamemod_common/login.php误用html entities函数引发的漏洞怎么解决 このファイルを開くと、脆弱性の場所が一目でわかり、関連するコードをいくつかインターセプトできます。

Line 15误用html entities函数引发的漏洞怎么解决 SQL インジェクションの脆弱性が存在することは明らかであり、スプライシングによって select ステートメントに直接挿入されます。

15 行目の

$user 変数は POST を通じて送信され、その値は制御可能です。ただし、上の図の 行 3 コードは、htmlentitiesdm 関数を呼び出して、POST データを処理します。この htmlentitiesdm 関数をフォローアップします。 。この関数は component/dm-config/global.common.php ファイルにあり、キー コードは次のようにインターセプトされます:

这个函数是调用 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エンティティ機能の悪用による脆弱性の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。