這篇文章主要為大家分析了如何深入理解$_REQUESTS數組的相關知識點,內容詳細易懂,操作細節合理,具有一定參考價值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學習“如何深入理解$_REQUESTS數組”的知識吧。
十載的柳州網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都營銷網站建設的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整柳州建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯從事“柳州網站設計”,“柳州網站推廣”以來,每個客戶項目都認真落實執行。
題目叫做詩,代碼如下:

漏洞解析:
這道題目包含了兩個漏洞,利用這兩個漏洞,我們可以往FTP連接資源中注入惡意數據,執行FTP命令。首先看到 第7行代碼,可以發現程序使用 cleanInput方法過濾 GET、 POST、 COOKIE數據,將他們強制轉成整型數據。然而在 第8行處,卻傳入了一個從 REQUEST方式獲取的 mode變量。我們都知道超全局數組 $_REQUEST中的數據,是 $_GET、 $_POST、 $_COOKIE的合集,而且數據是復制過去的,并不是引用。我們先來看一個例子,來驗證這一觀點:

可以發現 REQUEST數據絲毫不受過濾函數的影響。回到本例題,例題中的程序過濾函數只對 GET、 POST、 COOKIE數據進行操作,最后拿來用的卻是 REQUEST數據,這顯然會存在安全隱患。想了解更多 $_REQUEST信息,大家自己上官網學習。第二個漏洞的話,在代碼 第21行,這里用了 ==弱比較。關于這個問題,我們在前面的文章中講的也很細致了,大家可以參考:[紅日安全]PHP-Audit-Labs題解之Day1-4 (Day4)。
至于本次案例的攻擊payload,可以使用: ?mode=1%0a%0dDELETE%20test.file,這個即可達到刪除FTP服務器文件的效果。
本次實例分析,我們分析的是 WordPress的 All In One WP Security & Firewall 插件。該插件在 4.1.4 - 4.1.9版本中存在反射型XSS漏洞,漏洞原因和本次案例中的漏洞成因一致,官方也在 4.2.0版本中修復了該漏洞。本次,我們將以 4.1.4版本插件作為案例講解。

將下載下來的插件zip包,通過后臺插件管理上傳壓縮包安裝即可。本次發生問題的文件在于 wp-content\plugins\all-in-one-wp-security-and-firewall\admin\wp-security-dashboard-menu.php,為了方便大家理解,我將問題代碼抽取出來,簡化如下:

我們可以很清晰的看到,問題就出在 第25行的 render_tab3方法中,這里直接將 REQUEST方式獲取的 tab變量拼接并輸出。而實際上,在 第20行已經獲取了經過過濾處理的 $tab變量。我們來看一下 get_current_tab方法:

過濾函數的調用鏈如下圖 第1行,接著 $tab變量就會經過 wp_check_invalid_utf8方法的檢測。

下面我們來看看攻擊 payload(向 http://website/wp-admin/admin.php?page=aiowpsec&tab=tab3 POST數據 tab="><script>alert(1)</script> ):

可以看到成功引發XSS攻擊。我們最后再根據 payload對代碼的調用過程進行分析。首先,我們的 payload會傳入 wp-admin/admin.php文件中,最后進入 第14行的 do_action('toplevel_page_aiowpsec');代碼。

在 wp-includes/plugin.php文件中,程序又調用了 WP_Hook類的 do_action方法,該方法調用了自身的 apply_filters方法。

然后 apply_filters方法調用了 wp-content\plugins\all-in-one-wp-security-and-firewall\admin\wp-security-admin-init.php文件的 handle_dashboard_menu_rendering方法,并實例化了一個 AIOWPSecurity_Dashboard_Menu對象。

接下來就是開頭文章分析的部分,也就是下面這張圖片:

整個漏洞的攻擊鏈就如下圖所示:

這里還有一個小知識點要提醒大家的是,案例中 $_REQUEST["tab"]最后取到的是 $_POST["tab"]的值,而不是 $_GET["tab"]變量的值。這其實和 php.ini中的 request_order對應的值有關。例如在我的環境中, request_order配置如下:

這里的 "GP"表示的是 GET和 POST,且順序從左往右。例如我們同時以 GET和 POST方式傳輸 tab變量,那么最終用 $_REQUEST['tab']獲取到的就是 $_POST['tab']的值。更詳細的介紹可以看如下PHP手冊的定義:
request_order string This directive describes the order in which PHP registers GET, POST and Cookie variables into the _REQUEST array. Registration is done from left to right, newer values override older values. If this directive is not set, variables_order is used for $_REQUEST contents. Note that the default distribution php.ini files does not contain the 'C' for cookies, due to security concerns.
對于這個漏洞的修復方案,我們只要使用過濾后的 $tab變量即可,且變量最好經過HTML實體編碼后再輸出,例如使用 htmlentities函數等。
看完了上述分析,不知道大家是否對 $_REQUEST數組有了更加深入的理解,文中用到的 CMS可以從這里( All In One WP Security & Firewall)下載,當然文中若有不當之處,還望各位斧正。如果你對我們的項目感興趣,歡迎發送郵件到 hongrisec@gmail.com聯系我們。Day16的分析文章就到這里,我們最后留了一道CTF題目給大家練手,題目如下:
// index.php
<?php
function check_inner_ip($url)
{
$match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
if (!$match_result){
die('url fomat error1');
}
try{
$url_parse=parse_url($url);
}
catch(Exception $e){
die('url fomat error2');
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip);
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16 || ip2long('0.0.0.0')>>24 == $int_ip>>24;
}
function safe_request_url($url)
{
if (check_inner_ip($url)){
echo $url.' is inner ip';
}
else{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
$result_info = curl_getinfo($ch);
if ($result_info['redirect_url']){
safe_request_url($result_info['redirect_url']);
}
curl_close($ch);
var_dump($output);
}
}
$url = $_POST['url'];
if(!empty($url)){
safe_request_url($url);
}
else{
highlight_file(__file__);
}
//flag in flag.php
?>// flag.php
<?php
if (! function_exists('real_ip') ) {
function real_ip()
{
$ip = $_SERVER['REMOTE_ADDR'];
if (is_null($ip) && isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
foreach ($matches[0] AS $xip) {
if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
$ip = $xip;
break;
}
}
} elseif (is_null($ip) && isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (is_null($ip) && isset($_SERVER['HTTP_CF_CONNECTING_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif (is_null($ip) && isset($_SERVER['HTTP_X_REAL_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_IP'])) {
$ip = $_SERVER['HTTP_X_REAL_IP'];
}
return $ip;
}
}
$rip = real_ip();
if($rip === "127.0.0.1")
die("HRCTF{SSRF_can_give_you_flag}");
else
die("You IP is {$rip} not 127.0.0.1");
?>關于“如何深入理解$_REQUESTS數組”就介紹到這了,更多相關內容可以搜索創新互聯以前的文章,希望能夠幫助大家答疑解惑,請多多支持創新互聯網站!
網頁名稱:如何深入理解$_REQUESTS數組
文章URL:http://www.yijiale78.com/article10/ihoggo.html
成都網站建設公司_創新互聯,為您提供外貿網站建設、網站設計、企業建站、外貿建站、App開發、自適應網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯