Número de enumeración de columnas en PHP / MySQL

1

Actualmente estoy estudiando SQLi de un libro que no mencionaré para evitar problemas de derechos de autor. El libro contiene muchos ejemplos de cadenas / código de MSSQL, MySQL, Oracle, etc.

Actualmente estoy asombrado respecto a cuál sería la sintaxis equivalente en PHP / MySQL para este ejemplo, dado solo en .asp (suponiendo una base de datos de MSSQL). Esta es una cadena de inyección como se usa en la barra de direcciones del navegador, usando ORDER BY para enumerar el número de columnas en una tabla, iterando a través de ORDER BY 1 , ORDER BY 2 etc. hasta producir un error:

hxxp://someserver.com/products.asp?id=12+order+by+1

Entonces, ¿la sintaxis equivalente en PHP / MySQL sería algo como:

hxxp://someserver.com/products.php?id=12 order by 1

Estoy pensando que el espacio en blanco está bien aquí? O quizás:

hxxp://someserver.com/products.php?id=12%20order%20by%201

He escrito una aplicación para XAMPP para probar, pero no puedo producir un error, por lo que estoy comprobando que estoy usando la sintaxis correcta.

Para ser claros, para la presente publicación, solo estoy preguntando acerca de la sintaxis.

Editar: Pensé que tenía muy claro que solo estaba preguntando sobre espacios en blanco en una URL ... Sí produjo el error que estaba buscando.

Encontré una instancia en la que un espacio vs %20 no produce los mismos resultados, como el último carácter en una URL.

Esto (note el espacio único después de los dos guiones):

/victim/products.php?val=100' ORDER BY 4 -- 

produce esto:

  

Error en el acceso a la base de datos: tiene un error en su sintaxis SQL; revise el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de '' 'en la línea 1.

Mientras esto:

/victim/products.php?val=100' ORDER BY 4 --%20

produce:

  

Error en el acceso a la base de datos: columna desconocida '4' en 'cláusula de orden'.

Interesante ...

Sé que la misma compilación de XAMPP no tiene problemas con un espacio después de 2 guiones al final de una inyección cuando está en un campo de inicio de sesión usando el método POST ...

    
pregunta russ6100 05.07.2016 - 01:58
fuente

2 respuestas

1

Entonces tienes tres formas diferentes de expresar un espacio: , + y %20 . Cuando ingresa una URL, su navegador primero la recortará y luego la URL la codificará. Puede ver esto en acción echando un vistazo a la pestaña de red en las herramientas para desarrolladores en Chrome. Allí puede ver la URL que realmente se está enviando, a diferencia de la que ingresa en la barra de URL.

De esto podemos concluir que un espacio y %20 son equivalentes, excepto al final donde el espacio se ignorará mientras que el %20 no. En cuanto a + , todos los decodificadores de URL compatibles (incluido el urldecode() de PHP) lo convertirán en un espacio, por lo que también se puede tratar como equivalente (nuevamente, excepto si está en el extremo).

Entonces, ¿por qué es importante el espacio al final? Lea la documentación de MySQL :

  

Desde una secuencia hasta el final de la línea. En MySQL, el estilo de comentario - (doble guión) requiere que al segundo guión le siga al menos un espacio en blanco o un carácter de control (como un espacio, una pestaña, una nueva línea, etc.). Esta sintaxis difiere ligeramente de la sintaxis estándar de comentarios de SQL, como se explica en la Sección 1.8.2.4, "'-' como el inicio de un comentario".

Sin un espacio en blanco después de -- no obtienes un comentario. De ahí el error.

    
respondido por el Anders 01.02.2017 - 09:34
fuente
0

Esto debería ser un comentario, pero es un poco largo.

Parece que piensas que las URL para servidores PHP son de alguna manera diferentes de ASP. Aparte de la extensión en el script (que de todos modos es solo una convención y no un requisito de cableado fijo, incluso en MSWindows) no hay diferencia en la forma en que se codifica la URL. Hasta que no entiendas el protocolo, no tendrás mucho éxito en subvertirlo.

  

He escrito una solicitud para XAMPP para probar

¿Entonces estás intentando depurar un programa y hackearlo al mismo tiempo? No estás haciendo la vida muy fácil para ti. Por otro lado, desea que depuremos el programa sin darnos acceso al código.

-

/someserver.com/products.xyz?id=12+order+by+1

y

/someserver.com/products.xyz?id=12%20order%20by%201

debería ser equivalente.

Si pones esto en tu navegador:

/someserver.com/products.xyz?id=12 order by 1

se convertirá en una de las 2 formas que se muestran arriba antes de que se envíe por el cable.

    
respondido por el symcbean 05.07.2016 - 11:15
fuente

Lea otras preguntas en las etiquetas