Bagaimana untuk menyelesaikan kelemahan yang disebabkan oleh penyalahgunaan fungsi entiti html

WBOY
Lepaskan: 2023-05-12 14:13:42
ke hadapan
1372 orang telah melayarinya

Kod soalan adalah seperti berikut:

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

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 Escape

string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )
Salin selepas log masuk
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.

Nota:

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:

  • ENT_COMPAT (nilai lalai): hanya petikan berganda ditukar.

  • ENT_QUOTES: Kedua-dua jenis petikan ditukar.

  • ENT_NOQUOTES: Kedua-dua jenis petikan tidak ditukar.

Dilampirkan di sini jadual entiti aksara yang berguna dalam HTML

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

Selepas analisis di atas, mari kita kembali ke topik dan fikir Bagaimana untuk membina serangan

muatan. Mari kita selesaikan beberapa maklumat yang diketahui dahulu:

  • Di sini

    $query parameter boleh dikawal

  • dan

    htmlentities Fungsi boleh melepaskan petikan tunggal di sini

  • Titik pencetus kelemahan xss adalah dalam teg

    . <a>

Dalam

, 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
Salin selepas log masuk

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

Analisis contoh

Analisis contoh ini memilih

kerentanan suntikan sql dalam laman web perusahaan DM sistem bangunan v201710. Pertama sekali, kita boleh melihat beberapa maklumat yang berkaitan daripada cnvd, seperti berikut:

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

Kami boleh mendapatkan beberapa maklumat berguna daripada notis kerentanan log masuk, semasa membina Adalah dicadangkan bahawa lokasi port log masuk latar belakang adalah dalam fail

admindm-yourname/g.php Apabila saya membuka fail ini, saya mendapati ia mengubah hala ke admindm -yournamemod_common/login.php fail, jadi kerentanan itu dicetuskan.

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

Buka fail

admindm-yournamemod_common/login.php dan anda boleh melihat lokasi kerentanan sepintas lalu Beberapa kod yang berkaitan dipintas sebagai berikut:

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

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:

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

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

?>
Salin selepas log masuk
# 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 */;
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!