导航
导航
文章目录
  1. 前言
    1. 实例一

正则调试案例

前言

我们在进行正则调试的时候,首先是需要读懂正则表达式的意思,其次是进行绕过或者fuzz,后续的才能能好的绕过。
正则调试工具
https://regexper.com 生成图进行解读正则表达式
调试前的基础
PHP 我们一般用的比较多的正则判断函数preg_match()、preg_replace()、preg_filter()等函数。这里我们就介绍preg_match()函数

1
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

搜索 subject 与 pattern 给定的正则表达式的一个匹配

  1. 参数说明
  • $pattern: 要搜索的模式,字符串形式。
  • $subject: 输入字符串。
  • $matches: 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本,如果是第一个子模式匹配到的数据也是显示在$matches[0]中;$matches[1] 将包含第一个捕获子组匹配到的文本,以此类推, print_r($matches) 显示匹配的内容。
  • $flags:flags 可以被设置为以下标记值:
    • PREG_OFFSET_CAPTURE: 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。
  • offset: 通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)

实例一

直接上代码
index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
* Created by seck.
* Date: 2017/10/27
* Time: 20:39
*/
//index.php
error_reporting(0);
include 'config.php';
if(isset($_GET['phpinfo'])){
php_info();
}
if(isset($_GET['eval'])){
$filter = '/_|(.*)(\'|\"|\`|\()(.*)(\'|\"|\`|\))|(.php|\=|\$)/i';
if(preg_match($filter, $_GET['eval'],$matches)){
print_r($matches);
var_dump($_GET['eval']);
exit('nope');
}
var_dump($_GET['eval']);
//403 forbidden : system filter
eval($_GET['eval']);
}
highlight_file(__FILE__);

config.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
/**
* Created by seck.
* Date: 2017/10/27
* Time: 20:39
*/
//config.php
error_reporting(0);
function php_info(){
exit('PHP Version 7.0.18-0ubuntu0.16.10.1');
}
$filter = "/\||\/|\.\.|config|fwrite|fputs|shutdown|halt|".
"reboot|init|rm|mv|cp|remove|rename|copy|grep|nc|unlink|find|".
"apt|yum|passwd|chmod|chown|ln|kill|lilo|ssh|telnet/i";
$implode = implode($_REQUEST);
if(preg_match($filter, $implode)){
exit('403 forbidden');
}

首先过config的判断比较简单 直接使用system();
index.php 的正则才是关键

1
$filter = '/_|(.*)(\'|\"|\`|\()(.*)(\'|\"|\`|\))|(.php|\=|\$)/i';

首先分析正则是 从大分三大块 全部是6段,可以使用?eval=.php测试显示

1
_     |    (.*)(\'|\"|\`|\()(.*)(\'|\"|\`|\))    |     (.php|\=|\$)

到这里我们应该知道第二大段的有3个子模式,所以在匹配时需要同时满足这三个子模式才能匹配,如果我们能同时满足这个三个子模式也就绕过了。
比如
$filter = '/_|(a)(bb)(c)|(.php|\=|\$)/i';
测试?eval=abbc 才能匹配
最后我们想构造形如?eval=system(‘cat flag.php’); 进行读取flag文件
这里我们可以使用%0a绕过 贪婪模式(是可以匹配上也可以没有匹配上)另两个模式就必须要匹配上四种中的一种 第二个大段的正则也就绕过了,但是第三个大模式.php没有绕过
这里我们使用linux 的cat+ 命令查看所有的文件内容即可bp抓一下数据包
最后的payload:?eval=system(%0a”%0acat+“%0a)
我们分析一下怎么绕过第二段模式的 system(%0a 是绕过(.) 接着双引号满足第二个
接着是(.*)我们可有可无 最后必须要满足
但是运行在windows的环境下,却不能执行成功,也不知道为什么,知道表哥求py一下。

支持一下
扫一扫,支持作者

Powered by HyperComments