关于0x00截断GET提交与POST提交的区分

关于0x00截断GET提交与POST提交的区分

0x00截断的条件

  • php版本<5.3.4(在PHPstudy里可以更改php版本)
  • magic_quotes_gpc关闭
    方法:
    1.先在根目录里创建一个phpinfo.php文件,并在浏览器url打开http://localhost/phpinfo.php,内容为
  

2.在输出phpinfo()的页面ctrl + f, 查找 ini在这里插入图片描述
3.php.ini配置 magic_quotes_gpc = off

0x00截断的原理

白名单检测的话,我们可以采用00截断绕过。00截断利用的是php的一个漏洞。在 php<5.3.4 版本中,存储文件时处理文件名的函数认为0x00是终止符。于是在存储文件的时候,当函数读到 0x00(%00) 时,会认为文件已经结束,所以会把00后面的所有字符删除。(因为当上传一个yjh.jpg后,再更改路径’下图所示圈出部分为后期加入的’,最后得到的yjh.jpg上传的路径实际为…/upload/yjh4.php /6620210314091414.jpg,而php读取的方式是从后往前读取,遇到0x00时停止,故并未检测到yjh4.php)
关于0x00截断GET提交与POST提交的区分_第1张图片

GET提交

例1:CTFHub中的00截断
关于0x00截断GET提交与POST提交的区分_第2张图片例2:upload-labs的pass-12关于0x00截断GET提交与POST提交的区分_第3张图片

由图中黄色(红色)标记部分可以看出此时为GET提交,发现路径没有处理直接拼接上去的,所以可以利用00截断绕过。

  • GET提交做法
    1.先上传yjh.jpg,抓包
    2.在如图划线位置改为/upload/yjh4.php%00,然后再放包
    关于0x00截断GET提交与POST提交的区分_第4张图片3.上传成功,蚁剑连接(连接后面应为yjh4.php,而并非yjh4.jpg)

POST提交

使用POST传地址,post不会像get对%00进行自动解码,需要在Hex中修改,或者也可以使用url-decode进行编码之后进行上传文件,同样可以解析成功。
例:upload-labs的pass-13
由图中红色标记部分可以看出此时为POST提交,发现路径没有处理直接拼接上去的,所以可以利用00截断绕过。
关于0x00截断GET提交与POST提交的区分_第5张图片

  • post提交做法:
    1.先上传yjh.jpg,抓包;
    关于0x00截断GET提交与POST提交的区分_第6张图片

2

  • 在Hex中修改
    在荧光部分后面加上yjh.php+空格
    关于0x00截断GET提交与POST提交的区分_第7张图片

由于空格对应的十六进制是20 ,将20 改成00,再send
关于0x00截断GET提交与POST提交的区分_第8张图片

  • 使用url-decode进行编码
    先改为荧光所示部分
    关于0x00截断GET提交与POST提交的区分_第9张图片再使用burpsuite对%00进行解码
    关于0x00截断GET提交与POST提交的区分_第10张图片
    最后得到上传文件为
    关于0x00截断GET提交与POST提交的区分_第11张图片
    最终在保存时会去掉后面的变成:…/upload/yjh4.php
    3.最后蚁剑连接

总结

GET,POST 提交仅仅是对于%00的处理上有区别,使用POST传地址,post不会像get对%00进行自动解码,需要人为解码。

补充

下面为00截断在代码审计方面应用
关于0x00截断GET提交与POST提交的区分_第12张图片
图片来自这里
由阅读代码可以得知:ntcf的内容必须为数字,但又必须有#biubiubiu在里面,故想到00截断,由于后面发现浏览器会对#的编码问题,浏览器会把#编码为空,也就没有发送出#,因为#是url编码里的特殊字符,所以应写成url编码格式,查询可知#经url解码后为%23.

知识点:
strpos() 函数:查找字符串在另一字符串中第一次出现的位置。
strpos() 函数对大小写敏感。
相关函数:
stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)

你可能感兴趣的:(文件上传,代码审计)