Seguro que todos sabéis lo que es un captcha, normalmente una imagen de un texto para que lo identifiquemos visualmente y lo introduzcamos en un formulario y de esa manera demostrar que somos humanos. Digo una imagen de un texto pero ni que decir tiene ésto que ha evolucionado y hoy en día ya nos encontramos con captchas que nos proponen identificar ciertas formas, responder a diversas preguntas, interpretar un audio, etc. e incluso hacer un simple 'clic' con un algoritmo funcionando "en la sombra"...
Para quien no lo sepa, captcha viene del acrónimo "Completely Automated Public Turing test to tell Computers and Humans Apart " o, en castellano, prueba de Turing completamente automática y pública para diferenciar ordenadores de humanos, yafortunadamente su uso está adoptado ampliamente en los formularios de muchos sitios web.
Hace ya unos cuantos años vimos una serie de recursos para evadir estos "molestos" captchas y hoy de repente nos encontramos con una serie de ejercicios en el laboratorio 'Web for pentester II' que precisamente nos permitirán entender un poco y desarrollar los "bypasses" más sencillos contra esta medida. Así que vamos a ello.
Ejercicio 1:
El primer script tiene un fallo de lógica, básicamente si la aplicación recibe un captcha no válido no escapará correctamente, dándonos acceso sin necesidad de introducir nada.
Basta por lo tanto con interceptar la petición GET y quitar el parámetro captcha:
SERVIDOR
Para quien no lo sepa, captcha viene del acrónimo "Completely Automated Public Turing test to tell Computers and Humans Apart " o, en castellano, prueba de Turing completamente automática y pública para diferenciar ordenadores de humanos, y
Hace ya unos cuantos años vimos una serie de recursos para evadir estos "molestos" captchas y hoy de repente nos encontramos con una serie de ejercicios en el laboratorio 'Web for pentester II' que precisamente nos permitirán entender un poco y desarrollar los "bypasses" más sencillos contra esta medida. Así que vamos a ello.
Ejercicio 1:
El primer script tiene un fallo de lógica, básicamente si la aplicación recibe un captcha no válido no escapará correctamente, dándonos acceso sin necesidad de introducir nada.
Basta por lo tanto con interceptar la petición GET y quitar el parámetro captcha:
SERVIDOR
require 'sinatra/base'
require 'rack-session-sequel'
require 'RMagick'
class CaptchaExample1 < PBase
use Rack::Session::Sequel
set :views, File.join(File.dirname(__FILE__), 'example1', 'views')
set :public_folder, File.join(File.dirname(__FILE__), 'example1', 'public')
def self.path
"/captcha/example1/"
end
get '/' do
session[:captcha] = gen_captcha
erb :index
end
get "/submit" do
if params[:captcha] and params[:captcha] != session[:captcha]
@message = "Invalid Captcha!"
redirect CaptchaExample1.path
end
erb :win
end
def gen_captcha
str = rand_str
image = Magick::Image.new(310,60, Magick::HatchFill.new('#ffffff', '#4169e1')) do
self.format = 'PNG'
end
text = Magick::Draw.new
text.annotate(image,0,0,0,5, str) do
self.font_weight = Magick::BoldWeight
self.pointsize = 32
self.stroke = 'transparent'
self.fill = 'black'
self.gravity = Magick::SouthGravity
end
image = image.implode(0.4)
image.write(File.join(File.dirname(__FILE__), 'example1', 'public',"captcha.png"))
str
end
def rand_str
10.times.map { ('A'..'z').to_a[rand(('A'..'z').to_a.size)]}.join
end
end