前记:
在这里面我们使用一句话木马时使用php里的一个函数phpinfo(),该函数能显示出网页具体的php版本和有关的信息。
pass-01(js前端验证)
方法1:禁用js/删除js验证
1.禁用js
按f12,在"调试器"右端的设置中,禁用js,上传成功后右键图片,在新页面中打开图片即可
2.删除js
把网页源码中的return checkFile删除后上传打开即可。(和删除代码是一样的)
方法2:bp抓包改文件后缀
上传一个允许上传类型的文件,bp抓包以后,修改后缀回.php即可
方法3:删除代码
将选中部分的源码删除掉,再上传即可,如果找不到路径,可在f12的"网络"模块中找到
pass-02(MIME验证)
方法1:修改文件类型
上传一个php文件,bp抓包后修改Content-Type为image/jpeg(常用)、image/png、image/gif,另外两个是源码中承认的
方法2:上传合法文件和改后缀
上传一个合法的文件,例如jpg,bp抓包后再把文件的后缀改回来即可(可能需要多次放包,直至出现上传成功的框)
pass-03(黑名单验证,特殊文件类型)
查看源码后发现禁止上传.asp|.aspx|.php|.jsp,修改文件后缀为php1,php2,php3,php4.php5,phtmI, pht上传即可
注意:phpstudy_pro在此上传成功后不能正确显示,如果要正确显示,需要回溯2018版本,选择php版本不带nts的,如果是其他的可以尝试修改httpd.conf配置文件,Pro版本不知道改了能不能,可以试一下
pass-04(.htaccess)
这个和ctfhub上的那个一样,在源码中许多后缀都被禁用了,我们这里使用.htaccess是因为在我们上传了一个.htaccess文件后再上传一个某类型的文件,后面上传的文件就可以变成php解析过的,详情请搜索"分布式配置文件"或者".htaccess"。所以我们再上传了.htaccess后就再上传一个.jpg再访问就行了
.htaccess文件内容有以下几种(常见)
AddHandler php5-script .png //使用 php5-script 处理器来解析所匹配到的文件
AddType application/x-httpd-php .png //将特定扩展名文件(这里是.png)映射为php文件类型
SetHandler application/x-httpd-php //将该目录及子目录的所有文件均映射为php文件类型
pass-05(黑名单验证,.user.ini)
.user.ini是php的一种配置文件,相当于一个用户自定义的php.ini,它可以在(你在语句中定义的那个)php文件执行之前将其包含,然后获取shell,细节去搜索,展开讲有点多。
上传目录存在php文件(readme.php),再先上传.user.ini后,修改php.ini配置文件,上传后面的图片码,最后访问这个(readme.php)或者图片码文件的路径即可
auto_prepend_file=文件名
auto_append_file=文件名
修改如下
pass-06(大小写绕过黑名单)
查看源码,发现大小写绕过这种方式没有被禁止,我们就可以利用,上传文件后缀为Php这类
pass-07(收尾去空)
查看源码和上面的相比,收尾去空这一项没有了,我们可以利用bp抓包后在后缀后添加空格,就可以上传成功。
pass-08(字符绕过)
查看源码,与前面的相比,没有了删除文件名后的点那项,我们在bp抓包以后可以再文件后缀后加一个.这样的字符就可以绕过了
pass-09(::$DATA绕过黑名单)
还是看源代码,与之前的相比,没有了去除字符串那项,用::$DATA绕过
pass-10(点空格点绕过黑名单)
查看源码:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来,因此我们在文件后缀后加". ."后上传即可。
pass-11(双鞋绕过)
str_ireplace()函数:此函数无视大小写, 如果文件名含有黑名单里面的字符串就替换为空,而且只替换一次,它从左往右读,所以替换为空后还是php,可以双写为pphphp,phphpp
pass-12(%00截断-get型)
源码中有一个很重要的点,上面的 $img_path = _GET\['save_path'\]."/".rand(10, 99).date("YmdHis").".".file_ext;这行代码规定了组成上传路径的方法,这里就是我们要操作的地方。
注意:因为这个是自己搭的网站,而且是比较老的了,所以要修改一些配置
在php.ini中修改magic_quotes_gpc=On为magic_quotes_gpc=Off
还有php的版本需要修改或者说版本号要<5.3.29,在phpstudy2018中点击切换版本,将其改为php-5.2.17+Apache;注意:前文说过我们不选后面带nts的版本,我们访问上传页面时会出错。
上传php文件后,在开始save-path那行,把上传的方式改为get,然后在upload后加上文件名和%00,下面的filename=的后缀改为.jpg,再上传,用蚁剑连接即可
pass-13(%00截断-post型)
和第12题一样,上传php文件后,在开始save-path那行,把上传的方式改为post,然后在upload后加上文件名和%00,将filename=后面的后缀改为.jpg,再上传,用蚁剑连接即可
小结
1.重回php解析
pass-04,05这两个关卡都是用php的配置文件将我们修改过后缀的php一句话木马重新变为php解析
2.函数
pass-06:strtolower() 函数把字符串转换为小写
pass_07:trim()去除空格
pass-08:deldot()过滤文件名末尾的点,
当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
pass-09: ::DATA之后的数据会被当成文件流处理,不会检测后缀名,且保持"::DATA"之前的文件名 他的目的就是不检查后缀名。
pass-11:str_ireplace()函数寻找文件名中存在的黑名单字符串,将它替换成空(即将它删掉)
3.window文件名规则
pass-07/08/09都利用了window的文件名规则,文件名后的空格和点会被删除,我们在文件名上直接修改是行不通的,因此,我们必须抓包来修改
4.%00截断
这是一个大类,00截断是操作系统的漏洞,因为windows系统是用c语言或汇编语言写的,他们都是以\0即0x00结尾的,这样就可以截断字符串,因此,我们也可以用来绕过web的软waf白名单限制。
5.为什么
为什么我们要用phpinfo和文件上传,我们其实是通过上传文件时web的漏洞上传木马来进入内部,从而获得我们想要的信息。包括一系列的绕过,其实我们的最终目的就是成功的文件上传,然后进去内部。phpinfo可以显示php版本和配置信息,更方便我们入侵,也会有web的路径,这些都是很有帮助的。