打开题目
$_SESSION是访客与整个网站交互过程中一直存在的公有变量
然后看extract()函数的功能:
extract($_POST)就是将post的内容作为这个函数的参数。
extract() 函数从数组中将变量导入到当前的符号表(本题的作用是将_SESSION的两个函数变为post传参)
function的value是由$_GET['f']传进来的
当以get方法传入img_path的情况下,$_SESSION['img']为传入的img_path进行base64加密和sha1加密
然后就是变量覆盖。如果post传参为_SESSION[flag]=123,那么$_SESSION["user"]和$_SESSION["function"]的值都会被覆盖。
至于为什么post要传_SESSION[flag]=123而不是$_SESSION[flag]=123,是因为_SESSION是变量名,如果传$_SESSION,那么就会失效。
在这里题目给了我们提示
eval('phpinfo();'); //maybe you can find something in here!
先?f=phpinfo
得到了flag文件的名字
直接改userinfo[‘img’]
payload
_SESSION[user]=flagflagflagflagflagphp&_SESSION[function]=";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1:"1";s:1:"2";}
flag和php是敏感字符,在使用的时候被过滤掉了,但序列化记录的字符串长度没有过滤掉,所以在序列化的时候
s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1:"2";}被当作了原来的value
在 echo file_get_contents(base64_decode($userinfo['img']));实现了读取flag的,目的
实现了逃逸
将/d0g3_fllllllag进行base64编码后上传,可获得 flag
得到flag