Pass-18(条件竞争)
unlink() 函数是删除文件
代码审计,文件先上传到服务器再判断是否合法,合法则留下,不合法则删除
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,
因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。
跟c语言一样的语法,
fputs函数作用:向指定的文件写入一个字符串。
fopen:打开一个文件,
“w”(写入方式打开,清除文件内容,如果文件不存在则尝试重新创建.)
构造php内容:<?php fputs(fopen('test.php','w'),'<?php @eval($_POST["cmd"]);?>'); ?>
这里注意:上传的文件名不能和新文件php名字一样,新文件成功生成了,旧文件不断上传,会把它覆盖掉,同样会被删除。
还需要双引号”cmd”,尝试单引号一直失败,单引号上传次数也很少,也不知道是为什么?
后面发现php单引号和双引号是有区别的,简单地说,单引号内的就直接看成字符串,双引号内的可以被解释。
我们通过在线编辑器来试探一下,
会出现语法错误,因为双引号会解释内容,内容为一句话木马,会导致文件写入出现问题
这里还要复习一下一句话木马,@符号的意思是不报错,eval函数表示把括号内的语句字符串当作代码执行,所以在写入文件时
只能单纯的把一句话木马当作字符串处理;我们再把cmd换成单引号,语法也是错误的,cmd被分离出来了。
这里错误就是意外出现字符串cmd,因为我们用来单引号,cmd就被认为字符串执行,我们可以把单引号去掉或加上双引号,发现两者都可以连接。
小结:为了区别这个折腾了很久,爆破了七十次,其实还是要找根本,发现php单引号双引号有区别。
关于这个区别可以看看这篇文章:https://blog.csdn.net/hyy147/article/details/90053272
下面是操作过程:
首先抓好两个包再进行爆破,抓包后,转换到intruder,先把要爆破的参数都去掉,因为这里我们是通过不断发包访问页面,而不是爆破值。
再到payload修改,这里我标注了几个地方都要特别注意。
就是设置没有payload,无限期地继续。
上面是不断上传php文件,同时我们还需要去打开它,访问它,所以新建一个访问页面
抓包下来,修改同上面的一样,无需clear参数
最后修改一下线程为20,开始爆破。
一下子就上传上去了,如果一直失败,要好好看看php内容有没有写错了。
Pass-19
分析源码,先判断了文件的后缀名,这里就不能直接上传php,考虑上传图片马。
然后是检查文件大小,检查文件是否存在,移动文件,重命名文件。
上传图片马,再用之前创建好的文件包含漏洞,
提示我们本来就有一个文件包含,我们需要要它给的,
成功解析,
这里应该也是考图片马上传条件竞争,但是我的图片马上传没有问题,再解析一下即可,还有这里文件上传的路径也改变了。
Pass-20
这里我随便上传一个php都成功了,不知道出什么问题了,大概说一下网上师傅的做法。
方法一(0x00截断):抓包会显示a.php**.jpg在**这加0x00截断,表示十六进制的00,访问的就是php文件了,jpg被截断了。
方法二:在php后缀加/.绕过,因为move_uploaded_file底层会调用函数tsrm_realpath,导致递归删除文件名最后的/.成功可以绕过后缀名的检测。
方法三:大小写绕过。
Pass-21(MIME,数组,/.)
审计源码,先检查MIME
MIME:MIME消息可以包含文本、图像、音频、视频以及其他应用程序专用的数据。
再检查文件名,这里同样有的move_uploaded_file函数可以加/.绕过。
explode函数(separator,string,limit)把字符串打散成数组。
如果file变量不是数组,会将file变量先小写,再通过函数explode变成数组(以点为分隔符)如何取它的后缀名,并重新定义一个运行上穿的后缀名数组。
可以看到filename是文件本来的名称,而save_name是传递的参数,我们来构造参数名数组,设置两个元素的数组
经过函数处理,后缀就变成file[1],我们构造的有file[0],file[2],file[2]变为file[1]返回为空。