06月30, 2019

CTF-web 笔记 18

过气的 preg_replace /e

e模式仅在 PHP 5.6 之前可用。

用于正则匹配并替换匹配部分的字符串,用法:

preg_replace($pattern, $replacement, $subject)

当正则表达式使用e模式(即/e)且成功匹配时,$replacement会作为代码执行。

当参数可控时即可利用,比如:

preg_replace("/hello/e", 'eval($_POST[cmd])', 'hello')

该功能在之后的版本中由函数preg_replace_callback()替代,例如:

<?php
    function hello($matches)
    {
        echo 'hello';
    }
    $sub = "hello";
    preg_replace_callback("/hello/", 'hello', $sub);
?>

Perl ARGV

参考:https://tsublogs.wordpress.com/2016/09/18/606/

题目是 Perl 实现的,有一个页面可以上传任意文件,并且会把文件内容回显,比如:

1.png

当然,关注点并不在这个没卵用的 self-xss 上。

先看看 Perl 读取文件的几个例子。

读取本地文件:

open(DATA, "<file.txt");
while(<DATA>){
   print "$_";
}

读取 HTTP 请求中的文件数据:

use CGI;
my $cgi= CGI->new;
my $file= $cgi->param('file');
while(<$file>){
   print "$_";
}

当使用<>操作符时,它会返回文件句柄中每一行的列表。故while(<$file>)便起到了逐行读取的效果。

操作符<>无法对字符串起作用,除非该字符串是“ARGV”。

当字符串为“ARGV”时,<>会临时调用open()函数,输出的就是参数中对应的文件名的内容,例如:

2.png

需要注意的是 Perl 的open()函数是支持管道操作的,详见这篇文章

比如:

open(data, "mode");

其中mode有两种模式:

| cmd:表示data的输出作为cmd的输入。

cmd |:表示cmd的输出作为data的输入。

cmd是系统命令,故我们可以做到 RCE,还能回显执行结果。

找 flag:

3.png

这里#的作用是为了防止管道符被读入 cmd,故注释掉了。

读 flag:

4.png

本文链接:https://blog.cindemor.com/post/ctf-web-18.html

-- EOF --