一、上传参数名解析:明确哪些东西能修改
打开upload-labs的靶场的第二关。
![](https://img-blog.csdnimg.cn/img_convert/4cb282f0f97f46039864629e0073a4d0.png)
上传文件抓取数据包。
![](https://img-blog.csdnimg.cn/img_convert/8b2fd27c906b49a9ad3ce1f871fe23e4.png)
![](https://img-blog.csdnimg.cn/img_convert/58ce65cd128a437fa7771327b760a3bf.png)
简介:
![](https://img-blog.csdnimg.cn/img_convert/d2ba7e017646404ba939c4b802b57e21.png)
![](https://img-blog.csdnimg.cn/img_convert/5be5983a174a461b98f1dae427ab3943.png)
![](https://img-blog.csdnimg.cn/img_convert/a43eb26dfb684d84afbaefdd29695328.png)
![](https://img-blog.csdnimg.cn/img_convert/d9ee65decea84538a20decc9c1a5bc33.png)
![](https://img-blog.csdnimg.cn/img_convert/8a73201b50684360a27a88a4d3af6d45.png)
总结:
Content-Disposition:一般可更改
name:表单参数值,不能更改
filename:文件名,可以更改(比较重要,一位里面包含文件类型后缀)
Content-Type:文件MIME,视情况更改
二、文件上传实验
将抓取到的数据包里文件名的后缀改为php后点击上传,发现其被安全狗拦截了,并没有成功上传。
![](https://img-blog.csdnimg.cn/img_convert/27872e0460dd49e19705cff8315077a5.png)
在安全狗里可以看到其存在如下保护,对文后缀名存在限制。
![](https://img-blog.csdnimg.cn/img_convert/96899c013bf54435b58fdb021fd4cbd8.png)
![](https://img-blog.csdnimg.cn/img_convert/387f8b75550343f6b0c8f667e1d68333.png)
![](https://img-blog.csdnimg.cn/img_convert/9274958cf8b14ddcb1e24dfd254e6215.png)
对此情况的绕过方法有两种。
让其检测不道php。
换一种脚本类型,让其能够执行出php。
这里尝试加了个空格。
![](https://img-blog.csdnimg.cn/img_convert/c29a9d2aae8743a79e41407d9441bb35.png)
发现可以成功上传上去,但是其无法执行,依然是一个图片。
![](https://img-blog.csdnimg.cn/img_convert/ed9d351fa54e4fb7a711079d020478a6.png)
![](https://img-blog.csdnimg.cn/img_convert/86fb44d67d07492c94d0dc6f5cee99da.png)
后面尝试根据文件名的明明规则,在文件名末尾加点或者空格,结构均被拦截了。
![](https://img-blog.csdnimg.cn/img_convert/01c7ea631cdd4b10a1240c2a61ce41e7.png)
三、数据溢出绕过-防匹配(xxx.. .)
如果数据量特别多,程序就可能匹配到哪里就截止了,或者程序崩了,就可能成功上传上去。
因为其检测的是filename,所以采用数据溢出绕过时就其值修改的特别长。
![](https://img-blog.csdnimg.cn/img_convert/b00530609fd441a284b7c5f3d08e83b5.png)
可以看到最开始时候安全狗依然还在拦截,但是当文件名达到一定长度后,发现放包之后久久没有抓到返回的数据包。
![](https://img-blog.csdnimg.cn/img_convert/c5d21f71de0d431d9a2f001c5050f7c3.png)
此时查看服务器,发现弹出了下面的页面,Apache的服务直接崩掉了,但是此时文件依然没有上穿上去。
![](https://img-blog.csdnimg.cn/img_convert/a0a7deb00edc4a21b96e44f11a62d75e.png)
重启服务。
想到因为其是从前到后慢慢检测,所以考虑将垃圾数据添加到前面,但是发现还是被拦截了。
![](https://img-blog.csdnimg.cn/img_convert/aa2efb92c87a4301831d12195e96be46.png)
那就尝试继续添加,并在下图所示位置添加一个分号,在不断的尝试下,某一时刻发现返回页面并没有被拦截。
![](https://img-blog.csdnimg.cn/img_convert/688c7f8606674a9fa73f06480d0ca41a.png)
查看文件夹,发现成功上传了。
![](https://img-blog.csdnimg.cn/img_convert/a570a09e96ee426d8906bc930ee0eaf3.png)
尝试换一个地方插入垃圾数据。
![](https://img-blog.csdnimg.cn/img_convert/76d035ddc1334866bfd5d801e9f58b15.png)
发现依然成功上传了。
![](https://img-blog.csdnimg.cn/img_convert/c0367c8ddf624c6bae685f549cb9c234.png)
四、符号变异绕过-防匹配('" ;)
抓取数据包后查看下图所示部分,
发现有的参数和参数值之间是等号连接,有的是冒号连接,但是每一组参数最后都是分号结尾;
有的参数值加了双引号,有的参数值没加双引号,由此可以想到加了双引号的就是可以随便修改的,而没加双引号的可能就是有着固定的一些参数值。
由编成的知识可以知道其中的双引号也可能可以由单引号来代替。
由编成的知识可以知道一个语句结束的末尾需要添加分号,而参数filename的后面没有分号,由此可知这一整条语句可能到filename就截止了,由此可以猜想如果filename后面加一个分号以后,其后面就可能还可以添加其它内容。
![](https://img-blog.csdnimg.cn/img_convert/c683880691b94539b012feb757acefcc.png)
尝试在其后面添加分号以后添加其它内容,发现还是被拦截了。
![](https://img-blog.csdnimg.cn/img_convert/c5f6a7c7526d4be4b759112b5e92cbe9.png)
将filename参数值两侧的双引号改为单引号,发现还是被拦截了。
![](https://img-blog.csdnimg.cn/img_convert/978af777cc844a58905ff0acac844537.png)
尝试将filename参数值后面的引号去掉后上传,发现上传成功了。
因为安全狗的匹配机制是匹配双引号里的内容,但是这里的双引号有前没有后,它就一直在找后面的那个双引号,但是没有找到,所以可能没有匹配到。
![](https://img-blog.csdnimg.cn/img_convert/f884400effdc48f798efb825ca01828a.png)
![](https://img-blog.csdnimg.cn/img_convert/012d66852091467ba1668be6b75d1c10.png)
将filename的值改为有前没有后的单引号进行上传,发现上传也成功了。
![](https://img-blog.csdnimg.cn/img_convert/cbf35c621ee44075be6ba5c1bba9e97e.png)
![](https://img-blog.csdnimg.cn/img_convert/2939c21c426f4f4ba64a4ec8c0393d68.png)
将filename的值两侧的引号全部去掉,发现上传也成功了。
![](https://img-blog.csdnimg.cn/img_convert/415a9d7dbd724cca977bc554235a4e92.png)
![](https://img-blog.csdnimg.cn/img_convert/aacbdaa162504618885acdf4d804d00b.png)
至此更加证明了我们的猜想,安全狗只匹配单引号或者双引号里的内容。
但是!当我们将前面的双引号去掉,保存后面的双引号时,发现依然是被安全狗给拦截了。
![](https://img-blog.csdnimg.cn/img_convert/29a7f037396c4535b09d64c078fcf9f8.png)
此时对安全狗的猜想变成了,其会将最后一个单引号或者双引号的值取出来,然后对其前面的值进行检测。
因此我们进行以下实验,将后缀名.php放到引号的外面,发现真的成功上传了,并且上传的文件可以当作php执行。
![](https://img-blog.csdnimg.cn/img_convert/0fce5583e58b48ca8f59775846dd2fc7.png)
![](https://img-blog.csdnimg.cn/img_convert/706ce17f2e5543bfb30ccf821e7e8483.png)
如果在引号外面添加完整文件名,尝试上传,发现上传依然成功了。
![](https://img-blog.csdnimg.cn/img_convert/d1933baef2444f8bb152097c664a7356.png)
![](https://img-blog.csdnimg.cn/img_convert/22c610ce36d64e6b96f156dba6bb6066.png)
五、数据截断绕过-防匹配(; / 换行)
尝试将filename的值改为下图内容,发现成功绕过了。
原因可能是因为安全狗检测到了分号,一位语句结束了,后面的就不在进行匹配了。
![](https://img-blog.csdnimg.cn/img_convert/2fcf6bf48b33422ea381ddc9a129cb34.png)
![](https://img-blog.csdnimg.cn/img_convert/ba88a1257e3043538e52d9907fd2f0e2.png)
将filename的值进行换行操作,发现依然上传成功了。
原因是混行在编程语言里是\n,其可能对安全狗造成了干扰。
![](https://img-blog.csdnimg.cn/img_convert/26096f4de67240b494b9d0ef246fabe7.png)
![](https://img-blog.csdnimg.cn/img_convert/dc5907b2f62b40959bbac40ca8e5cbd4.png)
在引号后面添加一个“/”后上传,发现成功上传了。
![](https://img-blog.csdnimg.cn/img_convert/046a2b0c913e494f905ec6ee7bb0caa2.png)
![](https://img-blog.csdnimg.cn/img_convert/15a8bf9bdeb14f46bf1dbf56dd0b463b.png)
六、重复数据绕过-防匹配(参数多次)
在后面添加一个分号之后添加一个“Y.jpg”,来验证其是以哪个名字为准。
![](https://img-blog.csdnimg.cn/img_convert/78a4329367e3486c9287220594e98bd4.png)
放包后查看发现其文件名是“Y.jpg”,因此推测其是以后面的文件名为准。
那么我们想到能否像前面的垃圾数据一样在其前面多添加一些垃圾数据后上传。
发现此方法可行。
![](https://img-blog.csdnimg.cn/img_convert/657df34e3b1a434492f1287af9fdedf8.png)
![](https://img-blog.csdnimg.cn/img_convert/5e51555dc73d460c98c5ad14fb05bb54.png)
将前面的内容像如图所示一样插入到filename参数值里进行上传,发现上传成功了。
![](https://img-blog.csdnimg.cn/img_convert/32cd7d8c030141d7a8e8a465c93a13d4.png)
![](https://img-blog.csdnimg.cn/img_convert/68326d5108b9413a975d044655c7e0fd.png)