上传漏洞科普[2]-js验证
2014-03-11 00:20
239 查看
关于文件上传漏洞,想必玩web安全的同学们都有接触,之前本站也发布过一篇文章介绍文件上传漏洞的各种绕过方法,但是只是有文档却没有演示代码,最近给公司一客户培训,就照文档中的绕过写出了相应的代码,方便我等小菜研究,此次的文章我会连续发几天都是关于如何绕过的,全都是科普文,很简单的,希望小伙伴们喜欢。
为什么文件上传表单是主要的安全威胁
viewsource
如何判断文件上传是基于客户端JS验证?
方法也比较多,比如直接查看网站源文件、使用抓包工具查看客户端是否向服务器提交了数据包,如果没有则是js验证、随便上传一个文件,看返回结果。
如上图所示,JS验证的会在你提交了上传文件以后,直接弹出一个提示,并终止文件向服务器提交。绕过方法如下:
A、我们直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码即可。
B、直接更改文件上传JS代码中允许上传的文件扩展名你想要上传的文件扩展名。
C、使用本地提交表单即可,如下图,作相应的更改。
D、使用burpsuite或者是fiddle等代理工具提交,本地文件先更改为jpg,上传时拦截,再把文件扩展名更改为asp即可。
以上4种方法,大家可以自由使用,都可以绕过本地JS验证。
关于文件上传漏洞的文章
js验证绕过演示代码
01 | <?php |
02 | /** |
03 | *Createdby独自等待 |
04 | *Date:14-1-22 |
05 | *Time:下午7:19 |
06 | *Name:upload1.php |
07 | *独自等待博客: |
08 | */ |
09 | //文件上传漏洞演示脚本之js验证 |
10 | $uploaddir
'uploads/' ; |
11 | if (isset( $_POST [ 'submit' ])){ |
12 | if ( file_exists ( $uploaddir )){ |
13 | if (move_uploaded_file( $_FILES [ 'upfile' ][ 'tmp_name' ], $uploaddir . '/' . $_FILES [ 'upfile' ][ 'name' ])) |
14 | echo '文件上传成功,保存于:' . $uploaddir . $_FILES [ 'upfile' ][ 'name' ]. "n" ; |
15 | } |
16 | } else { |
17 | exit ( $uploaddir . '文件夹不存在,请手工创建!' ); |
18 | } |
19 | //print_r($_FILES); |
20 | } |
21 | ?> |
22 | <!DOCTYPEhtmlPUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" |
23 | " > |
24 | <htmlxmlns= " > |
25 | <head> |
26 | <metahttp-equiv= "Content-Type" content= "text/html;charset=gbk" /> |
27 | <metahttp-equiv= "content-language" content= "zh-CN" /> |
28 | <title>文件上传漏洞演示脚本--JS验证实例</title> |
29 | <scripttype= "text/javascript" > |
30 | function checkFile(){ |
31 | var file=document.getElementsByName( 'upfile' )[0].value; |
32 | if (file==null||file== "" ){ |
33 | alert( "你还没有选择任何文件,不能上传!" ); |
34 | return false; |
35 | } |
36 | //定义允许上传的文件类型 |
37 | var allow_ext= ".jpg|.jpeg|.png|.gif|.bmp|" ; |
38 | //提取上传文件的类型 |
39 | var ext_name=file.substring(file.lastIndexOf( "." )); |
40 | //alert(ext_name); |
41 | //alert(ext_name+"|"); |
42 | //判断上传文件类型是否允许上传 |
43 | if (allow_ext.indexOf(ext_name+ "|" )==-1){ |
44 | var errMsg= "该文件不允许上传,请上传" +allow_ext+ "类型的文件,当前文件类型为:" +ext_name; |
45 | alert(errMsg); |
46 | return false; |
47 | } |
48 | } |
49 | </script> |
50 | <body> |
51 | <h3>文件上传漏洞演示脚本--JS验证实例</h3> |
52 |
53 | <formaction= "" method= "post" enctype= "multipart/form-data" name= "upload" onsubmit= "returncheckFile()" > |
54 | <inputtype= "hidden" name= "MAX_FILE_SIZE" value= "204800" /> |
55 | 请选择要上传的文件:<inputtype= "file" name= "upfile" /> |
56 | <inputtype= "submit" name= "submit" value= "上传" /> |
57 | </form> |
58 | </body> |
59 | </html> |
js验证绕过方法
JS验证是最好绕过,有句话说基于客户端的验证都是不安全的,这里我们有多种绕过方法。如何判断文件上传是基于客户端JS验证?
方法也比较多,比如直接查看网站源文件、使用抓包工具查看客户端是否向服务器提交了数据包,如果没有则是js验证、随便上传一个文件,看返回结果。
如上图所示,JS验证的会在你提交了上传文件以后,直接弹出一个提示,并终止文件向服务器提交。绕过方法如下:
A、我们直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码即可。
B、直接更改文件上传JS代码中允许上传的文件扩展名你想要上传的文件扩展名。
C、使用本地提交表单即可,如下图,作相应的更改。
D、使用burpsuite或者是fiddle等代理工具提交,本地文件先更改为jpg,上传时拦截,再把文件扩展名更改为asp即可。
以上4种方法,大家可以自由使用,都可以绕过本地JS验证。
相关文章推荐
- 如何用javascript获取文本框,下拉框,单选框的对应值或者将值赋给它们?
- ie浏览器使用js导出网页到excel并打印
- js 针对html DOM元素操作等经验累积
- JS图片无缝、平滑滚动代码
- js解析json读取List中的实体对象示例
- Javascript加载速度慢的解决方案
- JavaScript中奇葩的假值示例应用
- javascript parseUrl函数(来自国外的获取网址url参数)
- JSP的三大指令 七大动作 九大对象
- javascript 注意点收集一
- js中判断两个变量是否相等的问题
- JSP 返回上一页的几种方法 【转自睡不醒的猫的博客】
- js 解析json 读取List中的实体对象
- 2.js基础
- js模版引擎handlebars.js实用教程——each嵌套
- js模版引擎handlebars.js实用教程——循环中使用索引
- JSON教程之简介
- YUI Compressor 在线压缩 JavaScript/CSS
- 【js学习笔记-096】----拖放事件
- 字体显示大中小