質問コードは次のとおりです:
脆弱性分析:
質問の意味によると、これは何ですか?ここで調査されているのは 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 つの値があります:
上記の分析が終わったら、トピックに戻りましょう。攻撃の構築方法
ペイロードを考えてみましょう。まず既知の情報を整理しましょう:
パラメータは制御可能な
この関数はここで一重引用符をエスケープできます。
タグ内にあります。
では、javascript
イベントを通じて js コードを実行できます。たとえば、次のようになります。このタイプのイベントの場合、最終的な POC 構造は次のとおりです。 /?a'onclick%3dalert(1)%2f%2f=c
この分析例は、DM エンタープライズ Web サイト構築システムで
を選択します。 v201710 SQL インジェクションの脆弱性脆弱性通知からいくつかの有用な情報を見つけることができます。ログイン ポイント。ビルド時に、バックグラウンド ログイン ポートの場所が
admindm-yourname/g.php ファイルにあることを確認するメッセージが表示されます。このファイルを開くと、
admindm にリダイレクトされることがわかります。 -yournamemod_common/login.phpファイルなので、脆弱性がトリガーされます。このファイル内にある必要があります。
admindm-yournamemod_common/login.php このファイルを開くと、脆弱性の場所が一目でわかり、関連するコードをいくつかインターセプトできます。
Line 15 SQL インジェクションの脆弱性が存在することは明らかであり、スプライシングによって select ステートメントに直接挿入されます。
15 行目の$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 サイトの他の関連記事を参照してください。