首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

江南小安入门课堂:sql注入

想给学弟学妹们今后的学习铺路,也顺便整理一下自己的学习过程。

sql注入是web安全里面最基础最重要最庞杂的一部分。

OWASP Top 10 常年高居榜首。

希望刚接触web安全的学弟学妹们好好学习注入!

学习sql注入你需要准备:

数据库基本知识和指令

sql注入的理论知识

练习sql注入的环境

一、数据库基本知识和指令

数据库是用来存储、管理数据的仓库。

常见的数据库有mysql、mssql、oracle、sql server、postegresql、access等等。

其中mysql是一个小型的公开源代码的免费的数据库,常和php组成完美搭档,被用于很多网站的搭建中。因其常见并且在mysql5版本加入了information_schema库(该库中存储了数据库信息内容,因此可以直接爆库、爆表、爆字段,让注入攻击变得极其简单),所以往往以mysql注入为例讲解注入原理。

常见的数据库关键词有select(查询)、insert(添加)、update(更新)和delete(删除)。此外还有from、where、union、order by等等,均为字面意思。

数据库(database)由表(table)构成,一个表就是一个关系,表由行(元组)和列(column,属性,亦即字段)构成。我们通过注入需要获得的往往是某个表里的某个字段下的内容。

二、sql注入的理论知识

1)为什么会存在注入

这就好比你问我为什么windows总是在更新可为什么还是有那么多的漏洞一样。代码是人写的,是人就会犯错,所以代码里就会有漏洞。

如果一个程序员在编写网站代码的时候,忽略了对用户输入的内容进行过滤或者过滤的不完整,黑客们就有机可乘。

2)注入原理

非常简单,就是网站的用户在向网站服务器提交参数的地方构造添加sql语句,如果网站没有过滤,那么这段恶意sql语句就有可能被上传至sql服务器并被解析执行,从而获得我们想要获得的信息。

3)注入过程

以下为最基础的注入过程:

step1:寻找注入点

step2:判断列数

step3:报显位

step4:联合查询数据库名、表名、字段名以及你需要的信息

step1:举个栗子,最简单的在url处注入:

在id=xxx后加一个单引号,即

如果报错,则说明此处的单引号确实被服务器解析了,我们再在此处加一个

如果正常显示,说明此处的单引号被我们成功闭合了

源代码中执行的语句可能形如

sql=select xxx from xxx where id = 'xxx'

当我们在后面加一个单引号时,参数变为了xxx',因此服务器中的语句变为

sql=select xxx from xxx where id = 'xxx''

因此报错。之后我们构造语句闭合了多余的单引号,服务器中的语句变为了

sql=select xxx from xxx where id = 'xxx' or '1' = '1'

因此语句执行成功,正常显示。至此可以说明此处url存在着sql注入点。

step2:判断列数,用到order by,即排序。order by 1,就是按第一个字段排序。一开始我们会猜一个大概的数字,比如order by 5。如果报错说明不能按第5个字段进行排序,也就是说没有第5个字段。之后我们折半来猜,所以第二次猜3。order by 3 有回显说明有第三列。再试4,发现4报错。于是可以确认该表只有3个字段。

step3:查看每个字段在网站的位置,方便step4的显示。举个栗子:

图一为该网站的正常显示

图二为报出显位的显示

语句为:http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,3 %23

首先id的值改为-1或者0,因为没有-1行或者0行,所以select会把1,2,3直接显示在相应的位置。也就是说图二中2的位置应该是字段login name的位置,3的位置应该是password的位置,第1字段在该页面没有显示。

此外最后的%23即井号#的url编码。#是sql语句中的注释,类比c语言的//。在恶意代码末尾添加#这样服务器中的语句就会变成

sql=select xxx from xxx where id = '1' union select 1,2,3 #'

最后没有闭合的单引号就被注释掉了,所以不会报错。

因为url不会自动转换#号,所以我们直接输入%23,这样url就知道这是#了。

step4:有了以上,我们就可以用常见的sql语句查找任何在数据库中的数据了。

常见指令:

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #爆表名

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #爆列名

1' union select group_concat(user_id,first_name,last_name),group_concat(password) from users #爆用户名和密码

其中group_concat是为了让多个数据显示在同一行中,不然每次只能显示一行的数据。

这里为了让大家更好理解各个表的关系,放几张截图:

这是新增的information_schema表

tables表中有table_name字段,包含某个数据库下所有表的表名

columns表中有columns_name字段,包含某个表中所有字段的名字

三、练习sql注入的环境

在这之前你需要一个mysql的环境,推荐phpstudy或者wamp。

dvwa:

http://www.freebuf.com/articles/web/120747.html

http://www.freebuf.com/articles/web/120985.html

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G0UIOW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券