
代碼審計


長度要為len("return'7512158cb1d484b7a54f6c004b943687c4c66015';")=49
由源碼知道,$flag可以輸出,且輸出后就是需要的flag
關於eval()函數
eval() 函數把字符串按照 PHP 代碼來計算。
該字符串必須是合法的 PHP 代碼,且必須以分號結尾。
如果沒有在代碼字符串中調用 return 語句,則返回 NULL。如果代碼中存在解析錯誤,則 eval() 函數返回 false
使用短標簽可以構造出echo
<? ?>和<?= ?>是短標簽而<?php ?>是長標簽,其中<?=是代替<? echo的,<? ?>代替的是<?php ?>,
當你發現你的PHP不支持使用短標簽,請到PHP的安裝目錄下找到php.ini文件,使用Ctrl+F搜索short_open_tag ,
然后將等號后面的Off改成On,再重新啟動Apache服務,那么短標簽就會被識別了
因此構造<?=$flag;?>就可以輸出了,但是flag被過濾了
$a構造一個flag字符串,然后echo $$a,不過[]被過濾了
用大括號代替方括號
在PHP中,大括號“{}”可以起到如下作用:
- 將多個獨立語句合並為一個復合語句,例如 if ... else ...中經常如此使用
- 在變量間接引用中進行定界,避免歧義。例如 ${$my_var[8]}與${$my_var}[8]的區分
- 用於指示字符串變量中的單個字符(下標從0開始),例如
$my_str="1234"; $my_str{1}='5'; //現在 $my_str 內容為 '1534'
因此最后構造
?flag=$a='fla1';$a{3}='g';?><?=$$a;?>111111111111111111
第一個;?>是為了讓代碼開頭的<?php閉合,不然<?=$$a?>無法執行

