有天在群里说起上传的%00截断的一些问题,就想起之前自己在这个问题踩过坑,想起了自己曾经的flag说要写文章,一直没写,现在来填坑了。
的示例代码在 php版本小于5.3.4 的情况下回输出 helloworld 。从php的内核执行过程来看,PHP通过php_execute_来执行PHP的脚本,这里选取部分有关代码,具体可以看这里():
在第10行我们看到,他调用zend_execute_s来针对脚本进行解析,而这个函数是在Zend/zend.c里面,截取部分相关代码如下:
从PHP内核开来实际上是分为两块部分,一个是compile编译过程,另一个是execute执行过程。
只要比较发现文件名的strlen长度和语法分析出来的长度不一样,就说明内部存在截断的字符,因此输出了打开文件失败的信息。
在1中,url中的%00(形如%xx),web server会把它当作十六进制处理,然后将该十六进制数据hex(00)“翻译”成统一的ascii码值“NUL(null)”,实现了截断。
在2中,burpsuite用burp自带的十六进制编辑工具将”shell.php .jpg”(中间有空格)中的空格由20改成00,如果burp中有二进制编辑工具。
在php中,所有的字符都是二进制的串,PHP本身并不认识任何编码,只是根据编码来显示内容。PHP中的chr()函数从指定的ASCII值返回字符。ASCII值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置0,而十六进制值被定义为带前置0x。
而在php5.4之前,iconv()函数在转换编码的时候,遇到不的字符串的时候会将其截断。
关于我们刚刚说的iconv()截断的问题,其实sitestar pro就是个典型例子,我们看个例子:
跟进一下这个PIC_ALLOW_EXT参数,发现其在数据库中写死了,只允许gifjpgpngbmp这类文件。即如果文件名最后不是gifjpgpngbmp,则提示文件类型错误。
这部分代码应该是进行文件保存的功能,这个有个核心函数_savelinkimg,跟进这个函数。秦勇老婆王芳
本文由海南柴油发电机组 www.hnjqc.cn整理发布
网友评论 ()条 查看