Kod soalan adalah seperti berikut:
Analisis Kerentanan:
Mengikut maksud soalan, apakah sedang diperiksa di sini mestilah Kerentanan xss , titik pencetus kerentanan hendaklah pada baris 13-14 dalam kod. Fungsi kedua-dua baris kod ini adalah untuk terus mengeluarkan teg html <a>
. Dalam baris 3-5 dalam kod, gelung foreach memproses parameter yang diluluskan oleh $_GET, tetapi terdapat masalah di sini. Mari lihat kod dalam baris keempat baris kod ini melakukan penukaran jenis pada $value dan memaksanya menjadi jenis int. Tetapi bahagian kod ini hanya memproses pembolehubah $value, bukan pembolehubah $key. Selepas pemprosesan kod baris 3-5 , ia dibahagikan mengikut simbol &, dan kemudian disambungkan ke gema > Dalam penyata, fungsi htmlentities diproses semula semasa output. Fungsi htmlentities terutamanya mengekod entiti HTML untuk beberapa simbol khas. Definisi khusus adalah seperti berikut:
htmlentiti - Tukar aksara kepada aksara HTML EscapeNota:Fungsi: Semasa menulis kod PHP, aksara entiti tidak boleh ditulis secara langsung dalam rentetan yang disediakan oleh PHP Fungsi htmlentities() yang menukar aksara khas HTML kepada aksara entiti.string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )Salin selepas log masuk
htmlentities() tidak menukar semua aksara khas kecuali ruang, dan petikan tunggal dan petikan berganda perlu dikawal secara berasingan (melalui dua parameter. ). Terdapat tiga nilai untuk parameter kedua, seperti berikut:
muatan. Mari kita selesaikan beberapa maklumat yang diketahui dahulu:
$query parameter boleh dikawal
htmlentities Fungsi boleh melepaskan petikan tunggal di sini
. <a>
, kita boleh melaksanakan kod js melalui acara <a>
javascript, contohnya: onclick Jenis acara ini, jadi terakhir Struktur poc adalah seperti berikut:
/?a'onclick%3dalert(1)%2f%2f=c
kerentanan suntikan sql dalam laman web perusahaan DM sistem bangunan v201710. Pertama sekali, kita boleh melihat beberapa maklumat yang berkaitan daripada cnvd, seperti berikut:
Kami boleh mendapatkan beberapa maklumat berguna daripada notis kerentanan log masuk, semasa membina Adalah dicadangkan bahawa lokasi port log masuk latar belakang adalah dalam failadmindm-yourname/g.php Apabila saya membuka fail ini, saya mendapati ia mengubah hala ke admindm -yournamemod_common/login.php fail, jadi kerentanan itu dicetuskan.
Buka failadmindm-yournamemod_common/login.php dan anda boleh melihat lokasi kerentanan sepintas lalu Beberapa kod yang berkaitan dipintas sebagai berikut:
Baris 15 Jelas sekali terdapat kelemahan suntikan SQL, yang dimasukkan terus ke dalam pernyataan pilih melalui penyambungan. Pembolehubah $user dalam baris 15 diserahkan melalui POST dan nilainya boleh dikawal. Walau bagaimanapun, kod baris 3 dalam gambar di atas memanggil fungsi htmlentitiesdm untuk memproses data POST Kami membuat susulan dengan htmlentitiesdm ini fungsi. Fungsi ini terletak dalam fail component/dm-config/global.common.php Kod kunci adalah seperti berikut:
.
这个函数是调用 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 */;
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan kelemahan yang disebabkan oleh penyalahgunaan fungsi entiti html. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!