寻找测试网站的文件上传的模块,常见:头像上传,修改上传,文件编辑器中文件上传,图片上传、媒体上传等,通过抓包上传恶意的文件进行测试,上传后缀名 asp php aspx 等的动态语言脚本,查看上传时的返回信息,判断是否能直接上传,如果不能直接上传,再进行测试上传突破,例如上传文件的时候只允许图片格式的后缀,但是修改文件时,却没有限制后缀名,图片文件可以修改成动态语言格式如php,则可能访问这个文件的 URL 直接 getshell,可以控制网站;
# 首先我们创建一个木马程序,让它作为文件进行上传,达到我们目的
Pass-01(绕过前端js检测)
# 本题先查看网页源码,把检测js的内容删掉,然后直接上传1.php
# 访问图片的页面,通关
Pass-02(绕过contnet-type)
# 有些上传模块,会对 http 的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务端是通过 content-type 判断类型,content-type 在客户端可被修改。则此文件上传也有可能被绕过的风险;
# 所以这道题需要我们抓包,然后查看contnet-type的类型
# 发现后缀名要求是jpeg格式,所以我们插入的格式为1.jpg,然后我们在客户端抓包后再改成1.php
# 修改好后放包,访问文件路径,成功
Pass-03(绕过黑名单上传)
# 上传模块,有时候会写成黑名单限制,在上传文件的时获取后缀名,再把后缀名与程序中黑名单进行检测, 如果后缀名在黑名单的列表内,文件将禁止文件上传;
# 本题我们发现提示不允许上传asp,aspx.php,jsp后缀名的文件
# 因此我们就需要把它的格式替换成其他格式的后缀,也能在其中执行的php后缀名
上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3、php5;
Pass-04(htaccess 重写解析绕过上传)
# 上传模块,黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccess .htaccess 文件的作用是可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP 地址的用户、只允许特定 IP 地址的用户、禁止目录列表,以及使用其他文件作为 index 文件等一些功能;在 htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文件。要 htaccess 的规则生效 则需要在 apache 开启 rewrite 重写模块,因为 apache 是多数都开启这个模块,所以规则一般都生效;
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
# 它将所有的.jpg文件解析为.php 然后访问1.jpg即可获取
Pass-05(大小写绕过上传)
# 获取文件后缀名进行判断,如果后缀在这个字典里就禁止上传。
$deny_ext =array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".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",".ini");
# 因此我们要用没有被过滤掉的文件名字
# 发现1.php可以,所以给它用大小写来绕过,最后得出结果
Pass-06(利用 windows 系统特征空格绕过上传)
# 由于在windpws系统中可以通过空格和点来表示空白
# 所以我们用空格来做此题,最后发现执行成功
Pass-07(利用 windows 系统特征点绕过上传)
# 同Pass-06题一样,不过这道题是使用点来进行绕过
# 所以我们只需要抓包在输入的地方多加点就可以了
Pass-08(::$DATA绕过上传)
- Windows本地文件系统中的文件流(File Streams):
- 当从 Windows shell 命令行指定创建文件时,流的完整名称为 "filename:stream name:stream type",如示例中所示: "myfile.txt:stream1:$DATA"# 上面都是一些黑名单被绕过的,如果黑名单上传检测后,没有限定后缀名,绕过的方法很多,与黑名单相对的就是白名单,使用白名单验证会相对比较安全,因为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险;
# 如果后缀名没有对::$DATA 进行判断,利用 windows 系统 NTFS 特征可以绕过上传 ;
# burpsuite 抓包,修改后缀名为 .php::$DATA ;
Pass-09(点空格点绕过上传)
# 本题是需要我们用点空格点来进行绕过
# 直接抓包后在后面输入. . 即可
Pass-10(双写后缀绕过上传)
# 在上传模块,有的代码会把黑名单的后缀名替换成空,例如 a.php 会把 php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传;
如下图就可以发现
# 所以我们就可以用双绕过来解答此题
只需要在输入的1.php后来个双绕过,直接拿下
Pass-11(目录可控%00 截断绕过上传(GET))
# 上面都是一些黑名单被绕过的,如果黑名单上传检测后,没有限定后缀名,绕过的方法很多,与黑名单相对的就是白名单,使用白名单验证会相对比较安全,因为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险;
- 当 gpc 关闭的情况下,可以用%00 对目录或者文件名进行截断;
- php 版本小于 5.3.4 ;
# 我们通过抓包来截断后面的内容
效果是1.php%00.1.jpg 变成 1.php
Pass-12(目录可控%00 截断绕过上传(POST))
# 此题和Pass-11是一样的 ,只不过一个是get,一个是post
# 我们抓包后在1.php后面用%00来截断,完成此题
Pass-13(文件头检测绕过)
# 有的文件上传,上传时候会检测头文件,不同的文件,头文件也不尽相同。常见的文件上传图片头检测它检测图片是两个字节的长度,如果不是图片的格式,会禁止上传 ;
# 制作图片一句话,使用 copy 1.jpg/b+123.php/a shell.jpg 将 php 文件附加在 jpg 图片上,直接上传即可;/b代表以二进制编码打开文件,/a代表以ASCII码编码打开文件
Pass-14(文件头检测绕过)
# 本题和Pass-15做法一样,按步骤完成即可
Pass-15(文件头检测绕过)
# pass-15和前面两道题也一样,同样的步骤不再重复
Pass-16(图片二次渲染检测绕过)
# 首先判断图片是否允许上传 jpg,jpg 图片在二次渲染后,与原图片差别不会太大。 所以二次渲染攻击最好用 gif 图片图片马;
# 将原图片上传,下载渲染后的图片进行对比,找相同处,覆盖字符串,填写一句话后门,或者恶意指令;
Pass-17(条件竞争漏洞绕过)
# 在文件上传时,如果逻辑不对,会造成很大危害,例如文件上传时,用 move_uploaded_file 把上传的临时文件移动到指定目录,接着再用 rename 文件,设置图片格式,如果在 rename 之前move_uploaded_file 这个步骤 如果这个文件可被客户端访问,这样我们也可以获取一个 webshell;
其实重是重点在于,在多线程情况下,就有可能出现还没处理完,我们就访问了原文件,这样就会导致被绕过防护。
# 首先我们改一个木马,让它的效果明显一点
/cmd.php
<?php @fputs(fopen('123.php',w),'<?php phpinfo();?>');?>
然后和前面的步骤一样,让他生成一个图片马,上传文件,用burp抓包,设置无限发送空的payloads,线程调高一点;
# # python脚本访问我们上传文件
import requests
while True:
html = requests.get('http://192.168.0.216/upload/11.php')
if html.status_code == 200:
print("OK")
break
Pass-18(条件竞争漏洞绕过二)
# 从源码来看的话,对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,因为move在rename之前,move操作进行了一次文件保存,然后rename进行了一次更改文件名,由于条件竞争,程序会出现来不及rename的问题,从而上传成功。
本题和上一个题差不多,不过是增加了Apache的解析识别漏洞 (后缀冗余)
# 我们需要搞一个运行请求的python的脚本
#requests_2.py
import requests
from threading import Thread
url = "http://192.168.0.216/upload/cmd.php.7z"
url_2 = "http://192.168.0.216/upload/123.php"
def request():
global html
global html_2
html = requests.get(url)
print(html.status_code)
html_2 = requests.get(url_2)
while True:
t = Thread(target=request())
t.start()
if html_2.status_code == 200:
print("123.php已生成!")
break
# 因此我们可以利用Apache的漏洞,将webshell改为1.php.7z
//.7z在Apache的白名单中无法识别,所以利用,我们直接和上一题一样快速发包,实现条件竞争
Pass-19(文件名可控绕过上传)
文件上传时,文件名可被客户端修改控制,会导致漏洞产生;本题也需要将php版本小于5.3.4才行
# 上传文件,文件马采用%00 截断,抓包解码,
Pass-20(数组绕过上传)
# 有的文件上传,如果支持数组上传或者数组命名。如果逻辑写的有问题会造成安全隐患,导致不可预期的上传。这种上传攻击,它是属于攻击者白盒审计后发现的漏洞居多 ;
# 我们通过抓包然后操作以下步骤
修改content-type
2.修改POST参数为数组类型,索引[0]为`upload-20.php`,索引[2]为`jpg|png|gif`。
3.只要第二个索引`不为1`,$file[count($file) - 1]就等价于$file[2-1],值为空。
# 我们需要为upload-20.php复制一个数组,然后完成文件上传,发现图片马也成功了
好小子,离成功又近一步!!!