1. 程式人生 > 遊戲 >PS5銷量和玩家遊戲總時間相比PS4同期大幅上漲

PS5銷量和玩家遊戲總時間相比PS4同期大幅上漲

點開題目,發現只是一個計算框

檢視一下原始碼

發現了一串程式碼

.ajax是指通過http請求載入遠端資料

輸入的算式會被傳進calc.php檔案中

且提示網頁存在waf(就是防火牆)

訪問cala.php試試

有一串php程式碼

 1 <?php
 2 error_reporting(0);
 3 if(!isset($_GET['num'])){
 4     show_source(__FILE__);
 5 }else{
 6         $str = $_GET['num'];
 7         $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
8 foreach ($blacklist as $blackitem) { 9 if (preg_match('/' . $blackitem . '/m', $str)) { 10 die("what are you want to do?"); 11 } 12 } 13 eval('echo '.$str.';'); 14 } 15 ?>

其中foreach語法結構提供了遍歷陣列的簡單方式。foreach僅能夠應用於陣列和物件,如果嘗試應用於其他資料型別的變數,或者未初始化的變數將發出錯誤資訊。

有兩種語法

foreach (iterable_expression as $value)
    statement
foreach (iterable_expression as $key => $value)
    statement    

這裡順便記一下正則表示式匹配的幾個引數

/i (忽略大小寫)
/g (全文查找出現的所有匹配字元)
/m (多行查詢)
/gi(全文查詢、忽略大小寫)
/ig(全文查詢、忽略大小寫)

給num傳數字行

給num傳字母則不行

應該是waf的原因

然後就不會了。。

查了一下,可以利用php的解析規則來繞過

就是當php進行解析的時候,如果變數前有空格,就會刪去空格再進行解析

而前面的黑名單中就沒有考慮到這個狀況

我們就可以在num的前面加個空格來繞過

因為這是我們的變數名就是“ num”而不是“num”了

試試看能不能行

成功繞過了

接下來就是執行命令了

忘記前面過濾掉“/"了

可以使用chr(47)來繞過

chr()就是返回當前整數代表的ascii字元,而chr(47)就是/

成功了

發現了flagg資料夾,猜測flag就在這裡

訪問看看

這個可以用file_get_contents() 函式來讀取

構造payload:? num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));

成功得到flag