題目程式碼如下:
漏洞解析 :
根據題目意思,這裡考察的應該是個xss漏洞 ,漏洞觸發點應該在程式碼中的第13-14行 。這兩行程式碼的作用是直接輸出一個html的 <a></a>
標籤。程式碼中的 第3-5行 ,foreach循環 對 $_GET 傳入的參數進行了處理,但這裡有個問題。我們看下 第四行 的程式碼,這行程式碼針對 $value 進行型別轉換,強制變成int型別。但這部分程式碼只處理了 $value 變量,沒針對 $key 變數進行處理。經過了第3-5行 的程式碼處理之後,依照& 這個符號進行分割,然後拼接到第13行 的echo 語句中,在輸出的時候又進行了一次htmlentities 函數處理。 htmlentities 函數主要是會對一些特殊符號進行HTML實體編碼。具體定義如下:
htmlentities — 將字元轉換為HTML 轉義字元
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )作用:在寫PHP程式碼時,無法在字串中直接寫實體字符,PHP提供了一個將HTML特殊字元轉換成實體字元的函數htmlentities()。
註:htmlentities() 並不能轉換所有的特殊字符,是轉換除了空格之外的特殊字符,且單引號和雙引號需要單獨控制(透過第二個參數)。第2個參數取值有3種,分別如下:
ENT_COMPAT(預設值):只轉換雙引號。
ENT_QUOTES:兩個引號都會轉換。
ENT_NOQUOTES:兩種引號都不會轉換。
這裡附上一個HTML 中有用的字元實體表
#經過上面的分析,我們再回到題目,想想如何建構一下攻擊payload 。我們先整理一些已知資訊:
這裡的$query 參數可控制
且htmlentities 函數在這裡可逃逸單引號
xss的漏洞觸發點在
<a></a>
標籤。
在<a></a>
中,我們可以透過javascript 事件來執行js程式碼,例如: onclick#這類事件,因此最後的poc建構如下:
/?a'onclick%3dalert(1)%2f%2f=c
實例分析
本次實例分析選擇DM企業建置站系統v201710 中的 sql注入漏洞 來進行分析。首先,我們可以從cnvd上面看到一些相關信息,如下:
從漏洞通告中可以發現一些有用的信息,漏洞位置在登陸處,搭建的時候提示後台登陸口位置在admindm-yourname/g.php 文件中,打開這個文件,發現重定向到admindm-yournamemod_common/login.php 文件中,所以漏洞觸發點應該就在這個文件中。
打開admindm-yournamemod_common/login.php 這個文件,一眼就看到漏洞位置,截取部分相關程式碼如下:
#第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 ""; } ?>
# 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 entities函數引發的漏洞怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6
視覺化網頁開發工具