您好,登錄后才能下訂單哦!
這篇文章主要介紹了誤用html entities函數(shù)引發(fā)的漏洞怎么解決的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇誤用html entities函數(shù)引發(fā)的漏洞怎么解決文章都會有所收獲,下面我們一起來看看吧。
題目代碼如下:
漏洞解析 :
根據(jù)題目意思,這里考察的應(yīng)該是個 xss漏洞 , 漏洞觸發(fā)點應(yīng)該在代碼中的 第13-14行 。這兩行代碼的作用是直接輸出一個html的 <a>
標(biāo)簽。代碼中的 第3-5行 ,foreach循環(huán) 對 $_GET 傳入的參數(shù)進(jìn)行了處理,但是這里有個問題。我們看下 第四行 的代碼,這行代碼針對 $value 進(jìn)行類型轉(zhuǎn)換,強(qiáng)制變成int類型。但是這部分代碼只處理了 $value 變量,沒針對 $key 變量進(jìn)行處理。經(jīng)過了 第3-5行 的代碼處理之后,根據(jù) & 這個符號進(jìn)行分割,然后拼接到 第13行 的 echo 語句中,在輸出的時候又進(jìn)行了一次 htmlentities 函數(shù)處理。 htmlentities 函數(shù)主要是會對一些特殊符號進(jìn)行HTML實體編碼。具體定義如下:
htmlentities — 將字符轉(zhuǎn)換為 HTML 轉(zhuǎn)義字符
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )作用:在寫PHP代碼時,不能在字符串中直接寫實體字符,PHP提供了一個將HTML特殊字符轉(zhuǎn)換成實體字符的函數(shù) htmlentities()。
注:htmlentities() 并不能轉(zhuǎn)換所有的特殊字符,是轉(zhuǎn)換除了空格之外的特殊字符,且單引號和雙引號需要單獨控制(通過第二個參數(shù))。第2個參數(shù)取值有3種,分別如下:
ENT_COMPAT(默認(rèn)值):只轉(zhuǎn)換雙引號。
ENT_QUOTES:兩種引號都轉(zhuǎn)換。
ENT_NOQUOTES:兩種引號都不轉(zhuǎn)換。
這里附上一個 HTML 中有用的字符實體表
經(jīng)過上面的分析,我們再回到題目,想想如何構(gòu)造一下攻擊 payload 。我們先梳理一些已知信息:
這里的 $query 參數(shù)可控
且 htmlentities 函數(shù)在這里可逃逸單引號
xss的漏洞觸發(fā)點在 <a>
標(biāo)簽。
在 <a>
中,我們可以通過 javascript 事件來執(zhí)行js代碼,例如: onclick 這類事件,因此最后的poc構(gòu)造如下:
/?a'onclick%3dalert(1)%2f%2f=c
本次實例分析選擇 DM企業(yè)建站系統(tǒng) v201710 中的 sql注入漏洞 來進(jìn)行分析。首先,我們可以從cnvd上面看到一些相關(guān)信息,如下:
從漏洞通告中可以發(fā)現(xiàn)一些有用的信息,漏洞位置在登陸處,搭建的時候提示后臺登陸口位置在 admindm-yourname/g.php 文件中,打開這個文件,發(fā)現(xiàn)重定向到 admindm-yournamemod_common/login.php 文件中,所以漏洞觸發(fā)點應(yīng)該就在這個文件中。
打開 admindm-yournamemod_common/login.php 這個文件,一眼就看到漏洞位置,截取部分相關(guān)代碼如下:
第15行 很明顯存在sql注入漏洞,通過拼接的方式直接插入到select語句中。 第15行 中的 $user 變量是通過 POST 方式提交上來,其值可控。但是上圖的 第3行 代碼調(diào)用 htmlentitiesdm 函數(shù),對 POST 數(shù)據(jù)進(jìn)行了處理,我們跟進(jìn)這個 htmlentitiesdm 函數(shù)。該函數(shù)位置在 component/dm-config/global.common.php 文件中,截取關(guān)鍵代碼如下:
這個函數(shù)是調(diào)用 htmlentities 函數(shù)針對輸入的數(shù)據(jù)進(jìn)行處理。前面我們已經(jīng)介紹過了這個函數(shù)的用法,這里這個函數(shù)的可選參數(shù)是 ENT_NOQUOTES ,也就是說兩種引號都不轉(zhuǎn)換。下面我們來看個小例子:
這里我猜測開發(fā)者應(yīng)該是考慮到了xss的問題,但是由于 htmlentities 這個函數(shù)選擇的參數(shù)出現(xiàn)了偏差,導(dǎo)致這里我們可以引入單引號造成注入的問題。
我們看看最新版是怎么修復(fù),使用 beyond compare 對比兩個版本代碼的差別。
新版修復(fù)的時候?qū)⒖蛇x參數(shù)修改為 ENT_QUOTES ,這個參數(shù)的作用就是過濾單引號加雙引號,我們來看看下面這個例子,就很容易明白了這個參數(shù)的作用了。
這里因為沒有回顯,所以是盲注,下面是驗證截圖:
針對 htmlentities 這個函數(shù),我們建議大家在使用的時候,盡量加上可選參數(shù),并且選擇 ENT_QUOTES 參數(shù)。
我們看看對比的效果
看完了上述分析,不知道大家是否對 htmlentities 函數(shù)在使用過程中可能產(chǎn)生的問題,有了更加深入的理解,文中用到的代碼可以從 這里 下載,當(dāng)然文中若有不當(dāng)之處,還望各位斧正。如果你對我們的項目感興趣,歡迎發(fā)送郵件到 hongrisec@gmail.com 聯(lián)系我們。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 */;
關(guān)于“誤用html entities函數(shù)引發(fā)的漏洞怎么解決”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“誤用html entities函數(shù)引發(fā)的漏洞怎么解決”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。