BugKu Web渗透之 never_give_up
启动场景,打开网页,如下图所示。
步骤一:尝试测试请求参数。
尝试更改请求中的id参数值,也有添加 or 1=1,or 1=2,and 1=1,and1=2,发现都没变化,都是显示never never never give up。
看bp中返回的数据。发现一段注释的html文件名。
步骤二:访问注释中的文件。
输入:117.72.52.127:11325/1p.html
直接跳入到bugku的论坛页面了。(看得我一脸懵逼)
想想还是返回bp看看。结果发现一段注释的代码。
步骤三:解码发现的注释代码。
1.url解码
通过在线url解码,发现他是链接到了bugku的页面(怪不得跳转到了bugku)。下面还有一段注释代码,拷贝出来。
2.base64解码
注释的代码看起来像是base64加密的,尝试用在线base64解码,解码出来一堆%的字符串。
3.url解码
将解码出来含有%的尝试url解码。
终于获取到了一部分php代码。
";if(!$_GET['id'])
{header('Location: hello.php?id=1');exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{echo 'no no no no no no no';return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{$flag = "flag{***********}"
}
else
{print "never never never give up !!!";
}?>
步骤四:分析php代码
代码中写着如果有输出flag,必须满足if括号中的条件。简单分析下,为以下几点:
1.读取参数a文件的内容,内容中需要有"bugku is a nice plateform!"。
2.参数id需要为0。
3.参数b的长度需要大于5。
4.正则匹配"111".substr($b,0,1),"1114"。
5.substr($b,0,1)不能为4。
首先,第一条参数a容为"bugku is a nice plateform!"。
我想到下列方法:
方法一:开重定向写入文件(不可行)
但是这段代码是php代码,而重定向应该是在shell中运行的,所以此方法不行。
方法二:利用PHP伪协议(可行)
a=data://text/plain,bugku%20is%20a%20nice%20plateform!
方法三:远程文件包含(不可行)
a=http://your-server.com/file.txt,其中your-server.com为可公开访问的服务器。不行,因为含有“.”,会进入到no no no中。
方法四:利用PHP的过滤器(不可行)
a=php://filter/convert.base64-encode/resource=data://text/plain;base64,YnVna3UgaXMgYSBuaWNlIHBsYXRlZm9ybSE=
不行,因为含有“.”,会进入到no no no中。
之后,第二条参数id需要等于0。
那么id直接为0就可以了。(后面发现其实不行,没那么简单)
最后,第三,四,五条,结合在一起。参数b的长度需要大于5,能正则匹配"111".substr($b,0,1),"1114",且substr($b,0,1)不能为4。
能满足正则,第一位却不能是4的。eregi
的模糊匹配特性:如果 $b
的第一个字符是非数字字符(如.
),可能就满足。
于是b可以赋值为.4*****,后面星号随便填。
步骤五:根据代码去拼接请求参数
这样,我们拼接的请求参数为:
?id=0&a=data://text/plain,bugku is a nice plateform!&b=.4fffd
我以为可以了,结果页面还是现实never give up。
仔细查看网页请求参数,发现id又赋值为1了,参数a和b也不见了。
返回上面代码一看,乖乖,这是进了第一段的代码呀。
if(!$_GET['id'])
{header('Location: hello.php?id=1');exit();
}
的确,当id=0时,他的值是false。
我们需要找到:id的值是true,但是等于0的。==是弱类型比较,比较时会进行类型转换。
查找了下资料,发现id为00、字母(如abc)、数组(如[33],不能是空数组)等都是可以弱类型比较为0的,并且为true的。
最终,输入:http://117.72.52.127:16094/hello.php?id=[33]&a=data://text/plain,bugku%20is%20a%20nice%20plateform!&b=.4fjefk
成功获取flag!