htmlエンティティ機能の悪用による脆弱性の解決方法
質問コードは次のとおりです:
脆弱性分析:
質問の意味によると、これは何ですか?ここで調査されているのは xss 脆弱性 である必要があり、脆弱性のトリガー ポイントはコードの 行 13 ~ 14 である必要があります。これら 2 行のコードの機能は、HTML <a>
タグを直接出力することです。コードの 3 ~ 5 行目 、foreach ループ は $_GET で渡されたパラメータを処理しますが、ここに問題があります。 の 4 行目のコードを見てみましょう。このコード行は、$value に対して型変換を実行し、強制的に int 型にします。ただし、コードのこの部分は $value 変数のみを処理し、$key 変数は処理しません。 3行目~5行目のコード処理後、&という記号に従って分割し、13行目のecho##につなぎ合わせます。このステートメントでは、出力中に htmlentities 関数が再度処理されます。 htmlentities この関数は主に、いくつかの特殊なシンボルの HTML エンティティをエンコードします。具体的な定義は次のとおりです:
htmlentities()string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )ログイン後にコピー機能: PHP コードを記述する場合、エンティティ文字を文字列に直接記述することはできません。 HTML 特殊文字をエンティティ文字に変換する関数 htmlentities()。
注:
は、すべての特殊文字を変換することはできません。スペースを除く特殊文字が変換され、一重引用符と二重引用符は個別に制御する必要があります (2 つの引用符を介して)パラメーター)。 2 番目のパラメータには次の 3 つの値があります:
- ENT_COMPAT (デフォルト値): 二重引用符のみが変換されます。
- ENT_QUOTES: 両方のタイプの引用符が変換されます。
- ENT_NOQUOTES: どちらのタイプの引用符も変換されません。
- HTML で役立つ文字エンティティの表をここに添付します。
上記の分析が終わったら、トピックに戻りましょう。攻撃の構築方法
を考えてみましょう。まず既知の情報を整理しましょう:
- ここでの
- $query
パラメータは制御可能な
および - htmlエンティティです
この関数はここで一重引用符をエスケープできます。
xss の脆弱性トリガー ポイントは - <a>
タグ内にあります。
では、javascript
イベントを通じて js コードを実行できます。たとえば、次のようになります。このタイプのイベントの場合、最終的な POC 構造は次のとおりです。 /?a'onclick%3dalert(1)%2f%2f=c
この分析例は、DM エンタープライズ Web サイト構築システムで
分析用。まず第一に、次のように cnvd からいくつかの関連情報を確認できます:
脆弱性通知からいくつかの有用な情報を見つけることができます。ログイン ポイント。ビルド時に、バックグラウンド ログイン ポートの場所が
admindm-yourname/g.php ファイルにあることを確認するメッセージが表示されます。このファイルを開くと、
ファイルなので、脆弱性がトリガーされます。このファイル内にある必要があります。
admindm-yournamemod_common/login.php このファイルを開くと、脆弱性の場所が一目でわかり、関連するコードをいくつかインターセプトできます。
Line 15 SQL インジェクションの脆弱性が存在することは明らかであり、スプライシングによって select ステートメントに直接挿入されます。
$user 変数は POST を通じて送信され、その値は制御可能です。ただし、上の図の 行 3 コードは、htmlentitiesdm 関数を呼び出して、POST データを処理します。この htmlentitiesdm 関数をフォローアップします。 。この関数は component/dm-config/global.common.php ファイルにあり、キー コードは次のようにインターセプトされます: 这个函数是调用 htmlentities 函数针对输入的数据进行处理。前面我们已经介绍过了这个函数的用法,这里这个函数的可选参数是 ENT_NOQUOTES ,也就是说两种引号都不转换。下面我们来看个小例子: 这里我猜测开发者应该是考虑到了xss的问题,但是由于 htmlentities 这个函数选择的参数出现了偏差,导致这里我们可以引入单引号造成注入的问题。 我们看看最新版是怎么修复,使用 beyond compare 对比两个版本代码的差别。 新版修复的时候将可选参数修改为 ENT_QUOTES ,这个参数的作用就是过滤单引号加双引号,我们来看看下面这个例子,就很容易明白了这个参数的作用了。 这里因为没有回显,所以是盲注,下面是验证截图: 针对 htmlentities 这个函数,我们建议大家在使用的时候,尽量加上可选参数,并且选择 ENT_QUOTES 参数。 我们看看对比的效果 看完了上述分析,不知道大家是否对 htmlentities 函数在使用过程中可能产生的问题,有了更加深入的理解,文中用到的代码可以从 这里 下载,当然文中若有不当之处,还望各位斧正。如果你对我们的项目感兴趣,欢迎发送邮件到 hongrisec@gmail.com 联系我们。Day12 的分析文章就到这里,我们最后留了一道CTF题目给大家练手,题目如下:漏洞验证
漏洞修复
结语
<?php
require 'db.inc.php';
if(isset($_REQUEST['username'])){
if(preg_match("/(?:\w*)\W*?[a-z].*(R|ELECT|OIN|NTO|HERE|NION)/i", $_REQUEST['username'])){
die("Attack detected!!!");
}
}
if(isset($_REQUEST['password'])){
if(preg_match("/(?:\w*)\W*?[a-z].*(R|ELECT|OIN|NTO|HERE|NION)/i", $_REQUEST['password'])){
die("Attack detected!!!");
}
}
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES);
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='SELECT * FROM ctf.users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
#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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。
