php extract 变量覆盖,extract变量覆盖
Bugkuctf題庫中的一道代碼審計題,通過巧妙利用file_get_contents函數特性來繞過extract變量覆蓋
源代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?php
$flag='../readme.txt';
extract($_GET);
if(isset($shiyan)){
@$content=trim(file_get_contents($flag));
if($shiyan == $content){
echo 'flag{xxx}';
}
else{
echo 'oh,no';
}
}
?>
首先先弄明白幾個函數:
extract:該函數將數組的鍵名作為變量名,鍵名對應的鍵值作為對應的變量值,返回值為設置成功的變量個數
也就是說這里的extract($_GET)將我們GET的參數名作為變量名,參數值作為變量值
例子如下:
1
2
3
4
5
6
7
8
9
10
11
12<?php
if(isset($_GET['shiyan']) $$ isset($_GET['flag'])){
$a=extract($_GET);
echo '$a:'.$a;
echo '
';
echo '$shiyan:'.$shiyan;
echo '
';
echo '$flag:'.$flag;
}
?>
輸出結果:
成功設置了兩個變量,$shiyan和$flag,所以$a=2
file_get_contents:將文件內容作為字符串輸出
例子如下:
1
2
3
4
5
6
7<?php
$flag='../readme.txt';
$content=file_get_contents($flag);
echo $content;
?>
輸出結果
這里注意file_get_contents函數里的參數是$flag,也就是說我們GET進來的參數flag值會將之前的flag值覆蓋掉,從而造成變量覆蓋,而我們輸入的flag值如果不為文件名,函數執行錯誤,$content會被賦值為空
例子如下:
1
2
3
4
5
6
7
8
9
10<?php
$flag='../readme.txt';
if(isset($_GET['flag'])){
extract($_GET);
@$content=file_get_contents($flag);
echo $content.'1';
}
?>
輸出結果:
要得到最終要的flag,就必須要讓變量content值等于變量shiyan的值
所以我們可以讓shiyan值也為空,這樣flag值任意輸入,只要不為文件名,就一定相等
另外,即使shiyan值為空,isset($shiyan)也是返回true的
1
2
3
4
5
6
7
8<?php
$shiyan="";
if(isset($shiyan)){
echo "11";
}
?>
輸出結果:
總結
以上是生活随笔為你收集整理的php extract 变量覆盖,extract变量覆盖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php计算时间差js,JavaScrip
- 下一篇: php 筛选数组,php数组如何按照字段