最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

由php中字符offset特征造成的繞過漏洞詳解

 更新時(shí)間:2017年07月07日 14:16:45   作者:乘物游心  
這篇文章主要給大家介紹了關(guān)于由php中字符offset特征造成的繞過漏洞的相關(guān)資料,文中不僅詳細(xì)介紹了該漏洞的形成,更重要的是介紹了修復(fù)方式,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。

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)單,和很多其他的語言一樣,字符串在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)證邏輯如果利用上述的特性就很容易地就可以被繞過。$admin沒有被初始定義為數(shù)組類型,那么當(dāng)我們用字符串提交時(shí)phpsyp.php?admin=1abc時(shí),php會(huì)取字符串1xxx的第一位,成功繞過if的條件判斷。

上面那段代碼是一個(gè)代碼片段,接下來的這段代碼是一段完整的邏輯代碼,來自于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è)最終的答案,其中的原理都沒有說或者沒有說得很詳細(xì)。其實(shí)原理就是上面講到的php的字符特性。

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

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

想通了這兩個(gè)問題,那么最終的解決方法也有了。將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ù)庫查詢驗(yàn)證就可以通過。之后的if驗(yàn)證也可以通過,通過這行代碼$userInfo['pass'] = $newPass;,由于$newpass的值為1,那么上述代碼變?yōu)榱?code>$userInfo['pass'] = 1; ,$userInfo由于一個(gè)字符串類型,最后得到的是$userInfo='1' ,最后就可以更新id為1的用戶的密碼了。

修復(fù)方式

這種漏洞的修復(fù)方式也很簡(jiǎn)單,事先定義好數(shù)據(jù)類型同時(shí)在使用時(shí)最好檢查一下所使用的數(shù)據(jù)類型是否和預(yù)期的一致。否則就會(huì)出現(xià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í)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • PHP中的替代語法簡(jiǎn)介

    PHP中的替代語法簡(jiǎn)介

    這篇文章主要介紹了PHP中的替代語法簡(jiǎn)介,是PHP程序設(shè)計(jì)中并不常見卻有重要作用的一個(gè)用法,需要的朋友可以參考下
    2014-08-08
  • php獲取YouTube視頻信息的方法

    php獲取YouTube視頻信息的方法

    這篇文章主要介紹了php獲取YouTube視頻信息的方法,實(shí)例分析了YouTube視頻格式的原理與解析的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • php mysql like 實(shí)現(xiàn)多關(guān)鍵詞搜索的方法

    php mysql like 實(shí)現(xiàn)多關(guān)鍵詞搜索的方法

    下面小編就為大家?guī)硪黄猵hp mysql like 實(shí)現(xiàn)多關(guān)鍵詞搜索的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • windows服務(wù)器iis+php獲得錯(cuò)誤信息的配置方法

    windows服務(wù)器iis+php獲得錯(cuò)誤信息的配置方法

    最近技術(shù)在服務(wù)器上執(zhí)行代碼時(shí)總是顯示空白信息,因?yàn)楸镜販y(cè)試正常的,但服務(wù)器上就有問題了,默認(rèn)都是不顯示php代碼的錯(cuò)誤信息的,可以通過如下設(shè)置就可以了
    2025-02-02
  • Discuz!下Memcache緩存實(shí)現(xiàn)方法

    Discuz!下Memcache緩存實(shí)現(xiàn)方法

    在PHP+MySQL架構(gòu)的站點(diǎn)中,本文重點(diǎn)從MySQL的角度去分析如何使Discuz!論壇(或者類似的PHP+MySQL架構(gòu)的程序)應(yīng)對(duì)大訪問量。同時(shí)給出一些使用Memcache去減輕MySQL壓力的建議
    2010-05-05
  • 教大家制作簡(jiǎn)單的php日歷

    教大家制作簡(jiǎn)單的php日歷

    教大家制作簡(jiǎn)單的php日歷,一個(gè)專屬于自己的php日歷,喜歡的朋友不要錯(cuò)過,動(dòng)手制作自己的日歷。
    2015-11-11
  • php5.6不能擴(kuò)展redis.so的解決方法

    php5.6不能擴(kuò)展redis.so的解決方法

    這篇文章主要為大家介紹了php5.6不能擴(kuò)展redis.so的解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • PHP之sprintf函數(shù)用法詳解

    PHP之sprintf函數(shù)用法詳解

    這篇文章主要介紹了PHP中sprintf函數(shù)用法,以實(shí)例形式詳細(xì)分析了sprintf函數(shù)格式化輸出的常見用法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • PHP獲取表單textarea數(shù)據(jù)中的換行問題

    PHP獲取表單textarea數(shù)據(jù)中的換行問題

    閑來無事,在網(wǎng)上看到一篇關(guān)于php表單轉(zhuǎn)換textarea換行符的文章,看完后,根據(jù)以往經(jīng)驗(yàn),感覺上這篇文章中的一些信息并不準(zhǔn)確...于是便自己親自對(duì)php獲取表單數(shù)據(jù)中的換行符問題進(jìn)行研究
    2010-09-09
  • PHP下對(duì)字符串的遞增運(yùn)算代碼

    PHP下對(duì)字符串的遞增運(yùn)算代碼

    注意PHP對(duì)字符串的遞增運(yùn)算,需要的朋友可以參考下。
    2010-08-08

最新評(píng)論

吴忠市| 清苑县| 盐城市| 兴仁县| 高密市| 仲巴县| 鄂托克前旗| 类乌齐县| 南郑县| 土默特左旗| 北辰区| 三原县| 礼泉县| 醴陵市| 遵化市| 犍为县| 修水县| 班戈县| 夹江县| 泽州县| 平乐县| 定远县| 泸水县| 黑山县| 南京市| 冕宁县| 康乐县| 鹰潭市| 平顶山市| 龙泉市| 瑞金市| 嘉鱼县| 武川县| 夏邑县| 乌兰县| 舟山市| 孝昌县| 许昌县| 梧州市| 吉安县| 前郭尔|