单位做攻防演习,我扮演攻击方尝试破解。发现滑块验证码做了升级,比之前复杂了很多。好在仍然是一维验证,不用太麻烦。
https接口里读出的是json对象,先从对象里取出图片转的base64编码,然后把字符串转回成numpy.ndarray。这里我转了彩色图和灰度图两种,灰度图是为了下一步识别其中缺口用;彩色图是为了找到缺口后验证是否正确用。正式开始攻击时就不再转彩色图了。
"params": {
"Image": "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",
"height": "109"
}
def str2Image_COLOR(src):
data = src.split('base64,')[-1]
img_byte = base64.b64decode(data)
nparr = np.frombuffer(img_byte, dtype=np.uint8)
npimage = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
return npimage
def str2Image_GRAYSCALE(src):
data = src.split('base64,')[-1]
img_byte = base64.b64decode(data)
nparr = np.frombuffer(img_byte, dtype=np.uint8)
npimage = cv2.imdecode(nparr, cv2.IMREAD_GRAYSCALE)
return npimage
由于目前滑块验证码是一维的,也就是说图片中缺口的Y值是固定的,在http接口里直接返回了这个值。所以我根据Y值截取了图片中有效的部分。代码如下:
def cutImage(image, height):
cutImage = image[height:height + 70, 0:500]
return cutImage
我采用的是边缘检测的方式识别图像中缺口的位置,为了提高图像转二值图像后的清晰度,我先提高了图像的对比度。代码如下:
def AddContrast(image):
_image = np.zeros_like(image)
h, w = _image.shape[:2]
for _i in range(h):
for _j in range(w):
# blurred[i][j] = -0.5 * image[i][j] + 255 # 暗区域变亮,亮区域变暗
_image[_i][_j] = min(255, max(2 * image[_i][_j], 0)) # 对比度增强
# _SmallImage[i][j] = min(255, max((SmallImage[i][j] - 109), 0)) # 颜色发黑
return _image
对比度提高之后,感觉有些比较模糊的图变清晰了很多。接下来就可以做窄边界的边缘检测了。代码如下:
def setCanny(image):
image = cv2.Canny(image, 50, 100)
return image
得到边缘二值图像后,再通过矩形特征寻找缺口所在位置。通过观察发现,由于背景的干扰,图像缺口的矩形边缘线会出现扭曲变形的情况,进而使其线段分布在前后两列或上下两行,且两行中形成互补。如下图:
我的想法是:
逐列遍历图片,被遍历的列为x列;
判断x列与x+1列上的点色值是否一致,如果不一致,说明x与x+1列是线段扭曲后的互补,则当前列计数器累加一;否则不累加;
由于图像缺口宽度固定66像素,所以判断x+65列与x+66列上的点是否色值一致,如果不一致,说明x+65与x+66列是线段扭曲后的互补,则当前列计数器累加一;否则不累加;
获取y=2和y=3两行,从x到x+66之间的色值,如果y2与y3行上的点是否色值一致,如果不一致则当前列计数器累加一;否则不累加;
由于图像缺口高度固定66像素,所以判断y=67和y=68两行,从x到x+66之间的色值,如果不一致则当前列计数器累加一;否则不累加;
对全部x列的计数器进行排序,数量最大的认为是缺口左侧的x值;
def getMostX(image):
X = 0
MaxNum = 0
H, W = image.shape[:2]
for w in range(W - 66):
Num = 0
for h in range(H):
C1 = image[h, w]
_C1 = image[h, w + 1]
C2 = image[h, w + 65]
_C2 = image[h, w + 66]
if C1 != _C1:
Num += 1
if C2 != _C2:
Num += 1
for _w in range(65):
C3 = image[2, w + _w]
_C3 = image[3, w + _w]
C4 = image[67, w + _w]
_C4 = image[68, w + _w]
if C3 != _C3:
Num += 1
if C4 != _C4:
Num += 1
if Num > MaxNum:
MaxNum = Num
X = w
return X
为了验证对缺口的识别结果,在前面保存的彩色图片中,按照计算出的缺口左侧x的位置绘制一个红色的矩形用来检查。代码如下:
def checkImage(imageC, X, height):
imageC = cv2.rectangle(imageC, (X, height), (X + 65, height + 65), (0, 0, 255), 2)
return imageC
经过验证,识别准确率达到98%。但是这个方式仅仅能够适用于本次攻防演习,遇到其他滑块验证码还需要根据实际情况灵活调整。