SfTian Upload-Labs WP # Upload-labs WriteUp > 这里需要用到PHP的 ```eval``` 函数,即 `````` 其中,shell是用于 蚁剑|中国菜刀 来连接Web RCE的连接密码 > 由于在Github直接下载release没有替换仓库里新插入的Pass-05所以我是按照release来做的,最后发现少了一个,就把他命名成Pass-21了 ### Pass-01 这个题可以上传图片,那么就直接F12打开查看源代码,发现是JavaScript做检验。 ![1.png](https://img2.imgtp.com/2024/02/01/CQ4SqXkm.png) 这段函数的类型是 ```bool``` 类型,阅读代码后可知如果符合文件上传类型的话那就会返回 ```true``` 否则返回 ```false``` 这个方式可以用Burpsuit在上传的时候通过修改上传的filename来绕过 ![1.png](https://img2.imgtp.com/2024/02/01/WmIQFxFv.png) 把箭头指的 ```png``` 改成 ```php``` 即可上传 ![2.png](https://img2.imgtp.com/2024/02/01/RMAhweIW.png) 通过F12可以看到上传的路径是 ```http://127.0.0.1/upload/1.php``` 那么就通过蚁剑连接即可 ![2.png](https://img2.imgtp.com/2024/02/01/wZhZkCbv.png) ### Pass-02 这个题用的是PHP代码进行检验的不过会对MIME(用来表示文档、文件或字节流的性质和格式的类型)进行检验,那么可以按照Pass-01的方法上传,然后修改文件名和MIME即可 ![2.png](https://img2.imgtp.com/2024/02/01/w7Mu8gf6.png) ![1.png](https://img2.imgtp.com/2024/02/01/7dHfT77E.png) ### Pass-03 查了一下,知道可以用.php5 .php3 .phtml这些来绕过.php的检查,其中.pthml可以告诉web服务器需要生成一个动态页面,而.php5 .php3就是通过修改了Apache的httpd文件使得这些后缀都可以被理解成.php文件来进行处理,这里直接用.php3后缀来绕过了(我这里默认开启了.php3 .phtml的解析) ![1.png](https://img2.imgtp.com/2024/02/01/B9S8Q3ow.png) ![2.png](https://img2.imgtp.com/2024/02/01/RHBVpHk4.png) ### Pass-04 这题是03的进化,不让用.php5 .php3这种类型的了,但是我们可以用 ```.htaccess``` 这个是针对目录来改变配置的方法,如果目录中有该文件就可以像NGINX的rewrite的那种伪静态一样直接修改规则,那么我们就需要手写一个 .htaccess 内容如下 ```AddType application/x-httpd-php .png``` 先将其上传到对应的地方然后把eval马改成png后缀再进行上传就可以了(因为这里的规则就是把所有的内容都当成php来执行) ![2.png](https://img2.imgtp.com/2024/02/01/8EavPSiy.png) ### Pass-05 04的优化,不让用 ```.htaccess``` 了,那么我们在看代码之后发现有下面内容 ```php $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //首尾去空 ``` 既然可以去掉 '.' 和 首尾去空,那么我们就可以通过burp上传的时候在后面加上 '. .'来绕过 ![2.png](https://img2.imgtp.com/2024/02/01/4v2RfIPG.png) ![1.png](https://img2.imgtp.com/2024/02/01/pKfsEbn6.png) ### Pass-06 这里不可以用大小写绕过 ```$file_ext = strtolower($file_ext); //转换为小写``` 但是我们发现没有首尾去空了,那么我们直接在burp里面把.php后面加个 空格(' ') 即可 ![1.png](https://img2.imgtp.com/2024/02/01/8LAXQwmi.png) ![1.png](https://img2.imgtp.com/2024/02/01/iJL2cheN.png) ### Pass-07 这题没 ```deldot``` 那就直接后面加 '. .' 就可以了 ![1.png](https://img2.imgtp.com/2024/02/01/OQBJFTNF.png) ### Pass-08 这题没去除$DATA的那行代码 > 在Windows中如果文件名+"::\$DATA"会把::\$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::\$DATA之前的文件名,他的目的就是不检查后缀名 ![1.png](https://img2.imgtp.com/2024/02/01/dk1DF9Mq.png) ### Pass-09 这题只删除了最后面的小数点'.',那么我们依旧可以用'. .'来绕过 ![1.png](https://img2.imgtp.com/2024/02/01/FkC38lRl.png) ### Pass-10 有``` $file_name = str_ireplace($deny_ext,"", $file_name);``` 函数,代表的是会从中找到黑名单的后缀然后把后缀给删掉,最后会把 ```demo.php``` 删减成 ```demo.``` 那么就需要进行双写绕过 ![1.png](https://img2.imgtp.com/2024/02/01/1KcWelUo.png) ![2.png](https://img2.imgtp.com/2024/02/01/tn5Nc7Pb.png) ### Pass-11 > 知乎:strrpos(string,find,start) 函数查找字符串在另一字符串中最后一次出 现的位置(区分大小写)。 > substr(string,start,length) 函数返回字符串的一部分*(从start开始 ,长度为 length) 省流:上传路径可控,那么相对于昨天做的反序列化里面有一个NULL的不可见内容,这里也可以用%00来截断,这样的话他就不会被识别了 通过修改upload的savepath来做到绕过,这里用的是GET方法修改比较简单,我们这样就可以把php的识别通过偷天换月的方法给扔到服务器方 ![2.png](https://img2.imgtp.com/2024/02/01/Hsc0sFdm.png) ![1.png](https://img2.imgtp.com/2024/02/01/SeXLq1fo.png) ### Pass-12 > POST不会对数据自动解码 > 依旧可控,但是upload_path因为用的是POST的方法移动位置了,我们需要做的就是修改upload_path的目录为下图 > ![2.png](https://img2.imgtp.com/2024/02/01/Q3LAETXV.png) > 然后通过HEX十六进制在70选中后插入一个00 > ![1.png](https://img2.imgtp.com/2024/02/01/yMFy09XR.png) ### Pass-13 读取前2个字节判断上传文件的类型,判断通过后,重新给文件赋予新的后缀名,题目同时给了一个 ```include.php``` 的代码,通过阅读我们可以知道,使用 ```url/include.php?file=upload/1.jpg``` GET传参之后include.php便会读取图片马的内容,然后就可以执行木马了 题目额外要求用JPG、PNG、GIF这三个图片都可以正常上传读取才能过关,那么我们就需要拿到JPG、PNG、GIF的 [文件头](https://blog.csdn.net/xiangshangbashaonian/article/details/80156865) > PNG文件头: 89 50 4E 47 0D 0A 1A 0A > JPG文件头: FF D8 FF > GIF (gif)文件头:47494638 我们可以用winhex来搞,如下图 ![1.png](https://img2.imgtp.com/2024/02/01/1NnKtLQz.png) 依次上传 ![2.png](https://img2.imgtp.com/2024/02/01/VNtKoSHn.png) ![1.png](https://img2.imgtp.com/2024/02/01/DRLMjl19.png) ### Pass-14 这个和上题思路一样,是读取文件尾 > JPG文件尾:FF D9 > PNG文件尾:AE 42 60 82 > GIF文件尾:00 3B ![1.png](https://img2.imgtp.com/2024/02/01/AZwb2LxD.png) ![1.png](https://img2.imgtp.com/2024/02/01/y30aipiN.png) ### Pass-15 本题用exif_imagetype来鉴别是否为图片,因为前两题我都直接用图片后缀命名了,所以可以直接上传 ![1.png](https://img2.imgtp.com/2024/02/01/vyICrBTj.png) ### Pass-16(未完成) 本题会对图片进行二次渲染来判断图片是否被修改,所以我们需要三个后缀分别是```.jpg .png .gif```正常的图片 - 先解决GIF 这里我们先正常上传一个GIF然后再burp后面加上eval马 ![1.png](https://img2.imgtp.com/2024/02/01/90uX4FHa.png) 然后把上传之后的图片保存下来,对比发现在0x00 A处原图值是F7,经过渲染的图片A处值为E7,还有好多地方不一样,但中间有一段还是相同的,那么我们就用服务器返回给我们的图片重新上传的时候就要注意把一句话木马没有改变的内容的区间内然后重新上传即可 ![1.png](https://img2.imgtp.com/2024/02/01/HsX3XFpH.png)发现gif的马是没有被重新渲染的 ### Pass-17 > 条件竞争漏洞:由于服务器端在处理不同的请求时是并发进行的,因此如果并发处理不当或相关操作顺序设计的不合理时,将会导致此类问题的发生 省流:服务器会先把任意类型文件放在服务器上然后再判断合法性,非法则删除 审计代码之后发现代码是通过把文件上传到服务器然后重命名再通过unlink删除文件,那么就需要利用条件竞争漏洞 因为文件会存在一瞬间,所以可以先写一个生成小马的语句```');?>```然后将其上传到服务器,通过burp拦截发送到intruder,再去访问生成小马的php文件```http://127.0.0.1/upload/1.php```通过burp拦截发送到intruder,二者的payload都用null,然后先开启访问的再开启上传的,这样过一会就会在目录中生成一个shell.php的文件,通过蚁剑连接即可 ![1.png](https://img2.imgtp.com/2024/02/02/ofunLrxo.png) > 但是代码有缺陷:他只判断传的是不是图片,如果是就可以正常放过去,我们可以利用这一点bypass,把传入的文件后缀改成.png格式然后在burp中直接修改成.php文件即可,然后访问上传之后的文件即可生成小马(或者直接上传eval文件) ### Pass-18 这个题对文件后缀进行白名单判断、进行后缀检验、大小检验,但是我们可以通过apache的解析漏洞绕过,因为apache的解析是文件后缀从右往左开始解析的,如果你的后缀是.php.7z那么7z因为无法解析而当成php来解析,这个时候就可以依照上题步骤来进行解决,最后会生成一个写有eval马的php文件 ### Pass-19 对文件后缀做判断然后检查文件大小、文件是否存在,是需要条件竞争漏洞的,用条件竞争来让服务器来不及rename,也可以使用后缀绕过加'.'绕过,这里我用的是加'.'绕过 ![1.png](https://img2.imgtp.com/2024/02/01/4cjn03kR.png) ![2.png](https://img2.imgtp.com/2024/02/01/QtspaMO4.png) ### Pass-20 本题会检查MIME,上传必须是图片,其中有```is_array```来判断文件是否是数组来防止加'.'绕过,基本上文件名通过数组来判断,安全性会更高绕过难度也会上升,主要漏洞在 ```$file_name = reset($file) . '.' . $file[count($file) - 1];``` 如果count($file)个数小于下标的话会导致访问的下标会返回null ```php $file[0]=1.php $file[1]=php $file[2]=null $file[8]=jpg end($file)=jpg ``` 所以保存名称的后缀必须是.php,在burp中将MIME类型修改成白名单内任意一个然后将name="save_name"修改成name="save_name[0]"来绕过is_array判断,再复制一个将save_name[]的下标写成大于1的任何数来绕过上述的count($file)语句,如下图 ![2.png](https://img2.imgtp.com/2024/02/01/JAtCcjs0.png) ### Pass-21(Github仓库Pass-05) 上传目录下存在readme.php,可以利用 ```.user.ini``` 文件 使得运行 readme.php 时 包含上传的图片,相当于readme.php也有webshell.php 那么就需要编写一个.user.ini,内容```auto_prepend_file=1.png``` 上传到服务器,这里需要注意的是web服务器的类型应该为NGINX 然后把eval马写入到1.png上传,最后通过url/upload/readme.php连接即可 ![1.png](https://img2.imgtp.com/2024/02/01/Ki0KwKLl.png) 取消回复 发表新评论 提交评论