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 !!!";
} ?>

2023年2月23日遇到的一个php代码审计的题目,这个题目的考察知识点非常多,写个wp记录一下。

if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}

如果id=0或者没有设置id的值,则跳转id=1,程序退出

$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}

三个参数 id a b ,其中a参数的值不能有'.',如果有,则输出'no no no',并返回。

$data = @file_get_contents($a,'r');

file_get_contents从$a里读取数据,然后将数据给变量$data存储。

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 !!!";
}

这个判断非常有意思,有很多矛盾的地方。首先data的值必须是"bugku is a nice plateform!",id必须为0(第一段代码就表示过id!=0),b的长度必须大于5,在正则匹配时,“111”和b的第一个字符拼接必须匹配到”1114“,但是b的第一个字符又不能是4。整个过程都非常矛盾,但是这正是考察php的知识点。

首先,data的值必须是"bugku is a nice plateform!",这个怎么办到?我们知道file_get_contents的参数是文件名,本质上是打开一个文件流,从流里读出文件内容。但我们并不知道哪个文件里有这个字符串信息,也没有上传接口,无法自己上传一个文件上去。这时,需要观察到本质,file_get_contents本质上是打开一个文件流,流!!!,重点是流。我们可以用php伪协议来完成。

php://input  // 读取post输入流

此时$a=php://input,然后用post传输"bugku is a nice plateform!",当file_get_contents($a)触发时,就是从Post的输入流里获取字符串“bugku is a nice plateform!”。

接着,id==0怎么绕过,毕竟一开始就判断过,id肯定不能是0,要是0,就退出程序了。但仔细看看,==在php中是弱类型比较,0bcde==0这个是成立的。为什么呢?因为数字之间比较时,非数字不参与比较。因此id=0a就可以绕过。

strlen($b) >5 没什么可说的,个数大于5就好。

eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4),按照普遍的思路来说

eregi("111".substr($b,0,1),"1114")   

eregi()匹配函数,匹配到则是True

"111".substr($b,0,1)  ->  拼接 “111”和  $b的第一个字符  (.是拼接字符串的意思)

比如$b=4321    那么  "111".substr($b,0,1) 就是1114

但是,绕过就是不走寻常路。令b=*12345。*号是通配符,匹配所有。因此,直接绕过!!!

整体构造如下:

随机推荐

  1. centos 通过yum安装docker-ce报错

    通过yum安装docker-ce报错,是因为本机安装过多次造成的,如下所示,需要解决掉冲突依赖,从新安装 1 从 https://mirrors.aliyun.com/docker-ce/linux/ ...

  2. 使用JAX构建强化学习agent并借助TensorFlowLite将其部署到Android应用中

    在之前发布文章<一个新 TensorFlow Lite 示例应用:棋盘游戏>中,展示了如何使用 TensorFlow 和 TensorFlow Agents 来训练强化学习 (RL) ag ...

  3. python print 一个进度条

    import time scale=100 print("执行开始".center(scale+28,'-')) start = time.perf_counter() for i ...

  4. webpack之loader与plugin

    loader与plugin的区别 loader的作用是将代码进行转换,比如less转成css,一个loader就是一个函数,接收的参数是上一个loader的返回值,loader进行一系列处理后 返回新 ...

  5. Pinia使用技巧

    vue2使用的vuex,是一个状态管理器,现在vue3出了最新的pinia,今年偿试一下. 首先是安装,这里要注意一下,有一个持久化插件,如果不用的话,页面一刷新,状态会消失. npm install ...

  6. 如何让excel不转换科学技术法

    使用场景: 业务部门从系统导出数据给开发人员,打开后数字全部变为科学计数法 参考文章:https://www.zhihu.com/question/20096750

  7. 2020 ccpc秦皇岛 赛后总结!!!!

    amazing!!!! 金牌!!!!! 总结一下这次的发挥,以及如何冲到了金牌. 1 有队友单开了银牌题,50分钟过了K题,当时只有5个人过K.他敲的过程中另个队友想出来另外一题的思路,等过了K,我直 ...

  8. 如何解决 Iterative 半监督训练 在 ASR 训练中难以落地的问题丨RTC Dev Meetup

    前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自微软亚洲研究院.声网.数美科技的技术专家,围绕该话 ...

  9. fpm模式下读取到is_cli为何为true

    目录 问题出现和简单排查 排查 经过思考和猜测,严重怀疑是fpm读取到了cli下的opcache 原起 粗浅探索 测试代码 opcache配置 共享内存缓存与文件缓存 php-fpm下读取到is_cl ...

  10. 一文带你搞懂java中的变量的定义是什么意思

    前言 在之前的文章中,壹哥给大家讲解了Java的第一个案例HelloWorld,并详细给大家介绍了Java的标识符,而且现在我们也已经知道该使用什么样的工具进行Java开发.那么接下来,壹哥会集中精力 ...