成人精品一区二区三区中文字幕-成人精品一区二区三区-成人精品一级毛片-成人精品亚洲-日本在线视频一区二区-日本在线视频免费

導(dǎo)航首頁(yè) ? 技術(shù)教程 ? 由php中字符offset特征造成的繞過(guò)漏洞詳解
全站頭部文字 我要出現(xiàn)在這里
由php中字符offset特征造成的繞過(guò)漏洞詳解 726 2023-12-08   

php中的字符offset特性

php中的字符串存在一個(gè)非常有趣的特性,php中的字符串也可以像數(shù)組一樣進(jìn)行取值。

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

最后的結(jié)果就是h。

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

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

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

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

輸出結(jié)果就是e.因?yàn)?pass會(huì)被隱性類型轉(zhuǎn)換為1,$mystr[1]的輸出結(jié)果就是第二個(gè)字母e.

字符特性造成的漏洞

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

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

這樣的驗(yàn)證邏輯如果利用上述的特性就很容易地就可以被繞過(guò)。$admin沒(méi)有被初始定義為數(shù)組類型,那么當(dāng)我們用字符串提交時(shí)phpsyp.php?admin=1abc時(shí),php會(huì)取字符串1xxx的第一位,成功繞過(guò)if的條件判斷。

上面那段代碼是一個(gè)代碼片段,接下來(lái)的這段代碼是一段完整的邏輯代碼,來(lái)自于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.';
}

這道題目網(wǎng)上也僅僅只是給了一個(gè)最終的答案,其中的原理都沒(méi)有說(shuō)或者沒(méi)有說(shuō)得很詳細(xì)。其實(shí)原理就是上面講到的php的字符特性。

題目要求很簡(jiǎn)單就是修改admin的密碼,admin的id為1。我們需要思考以下幾個(gè)問(wèn)題:

如何在更新的時(shí)候?qū)d修改為1 $userInfo['pass'] = $newPass;這行代碼有什么作用,為什么會(huì)在if判斷語(yǔ)句中存在這種的代碼

想通了這兩個(gè)問(wèn)題,那么最終的解決方法也有了。將id為8的用戶的密碼修改為8,然后傳入一個(gè)userInfo的字符串‘8',突破查詢防護(hù),最后利用$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' ,這樣數(shù)據(jù)庫(kù)查詢驗(yàn)證就可以通過(guò)。之后的if驗(yàn)證也可以通過(guò),通過(guò)這行代碼$userInfo['pass'] = $newPass;,由于$newpass的值為1,那么上述代碼變?yōu)榱?userInfo['pass'] = 1; ,$userInfo由于一個(gè)字符串類型,最后得到的是$userInfo='1' ,最后就可以更新id為1的用戶的密碼了。

修復(fù)方式

這種漏洞的修復(fù)方式也很簡(jiǎn)單,事先定義好數(shù)據(jù)類型同時(shí)在使用時(shí)最好檢查一下所使用的數(shù)據(jù)類型是否和預(yù)期的一致。否則就會(huì)出現(xiàn)上述的繞過(guò)的問(wèn)題。同時(shí)要控制好輸入,對(duì)輸入的數(shù)據(jù)要進(jìn)行檢查不要隨意地使用。

參考

https://github.com/80vul/webzine/blob/master/webzine_0x06/PSTZine_0x06_0x03.txt

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)綠夏網(wǎng)的支持。



主站蜘蛛池模板: 一夜惊喜 电影| 实用咒语大全| 362329| 湿身美女| 急招55岁左右男司机| 坂本梨沙| 电视剧暗夜与黎明剧情介绍| chinesehd国语话对白| 最佳女婿 电影| 宝宝满月酒微信邀请函| 乔什布洛林| 都市频道节目表今天| a friend in need中文翻译| 爆操在线观看| 最佳李纯信| 安徽公共频道| 香谱72图解高清大图及解释| 色戒》| 蜡笔小新日语| 东方卫视节目表| 疑云密布 电影| 最火图片| 田村亮| 成年奶妈| 藏地奇兵| 无内裤秘书| 宋学士濂文言文翻译| 天堂av| 小绵羊男星是谁| 香帅传奇郑少秋版国语全集在线观看高清 | 双重欲望| 周华健朋友一生一起走的歌词| 老男人gay同性gay做受| 搜狐视频官网| 超级方程式| 美女热吻| 恰纳卡莱之战完整版在线观看| 茶啊二中王强| 欧美一级大胆视频| 同志父子第二部叫什么| 我虽软弱了赞美诗歌|

?。。≌鹃L(zhǎng)長(zhǎng)期在線接?。?!

網(wǎng)站、小程序:定制開(kāi)發(fā)/二次開(kāi)發(fā)/仿制開(kāi)發(fā)等

各種疑難雜癥解決/定制接口/定制采集等

站長(zhǎng)微信:lxwl520520

站長(zhǎng)QQ:1737366103