CISCN2019-总决赛-Day1-Web4-Laravel1
摘要
[CISCN2019 总决赛 Day1 Web4]Laravel1 php审计
摘要
[CISCN2019 总决赛 Day1 Web4]Laravel1 php审计
摘要
[网鼎杯 2020 青龙组] filejava webinf
摘要
通过受害机请求恶意FTP服务,攻击内网中脆弱的FPM服务
摘要
SSRF 攻击内网脆弱的PHP-FPM组件
摘要
PHP-FPM 服务暴漏导致的命令执行
摘要
反序列化、redis、php特性
摘要
sql堆叠注入、读取文件、写文件
摘要
文件上传、phar反序列化
摘要
python、flask、事件触发
摘要
Tinkphp、文件上传、爆破
网页上打开就只有一个大滑稽,网页名是Document,所以是文件包含?提交file参数,一直是:you can’t see it。
题目标签是代码审计,我也没看到代码啊……
查看源代码看到source.php内心毫无波澜,后来查找才知道要访问它……(菜\1)*
好,访问source.php我终于看到代码了:
1 | <?php |
到目前为止还没有看到过这么长的代码审计(菜\2)*
先看与file有关的代码:
1 | if (! empty($_REQUEST['file']) |
file要求是字符串且不为空,用emmm中的checkFile调用。file中的值传递给了page。checkFile中四个if语句,每个都有return。
1 | $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; |
先设置了一个白名单数组,准许访问source.php和hint.php,hint.php中存放了flag的位置。第一个if语句要求page存在且为字符串,不符合则return false,退出程序。
in_array()函数在page中查找是否有与whitelist中键值对应的字符串。有则return true,退出程序。
1 | $_page = mb_substr( |
mb_strpos为page拼接了一个?,并返回其**第一次出现的位置**。mb_substr从开头显示字符至?所在的位置,处理后page再次进行比对。
那不是只能读source.php了?……$_page啊,那没事了……(菜\3)*
1 | $_page = urldecode($page); |
先对page进行了url编码,再进行读取和对比的操作……
注意:PHP中$_GET、$_POST、$_REQUEST这类函数在提取参数值时会URL解码一次
这位师傅上面写第三个if不能利用,但逻辑理通之后我感觉也是可以利用的。
?一次编码为%3F,二次编码为%253F,那么第三个if的利用需要if的一次编码。
payload:?file=source.php%3F../../../../../../ffffllllaaaagggg(服务器找不到source.php%3F,就视为一个文件夹)
成功出flag
自然,需要二次编码的’?‘。
payload:?file=source.php%253F../../../../../../ffffllllaaaagggg
总算做了点实在事……
1 | <?php |