想给学弟学妹们今后的学习铺路,也顺便整理一下自己的学习过程。
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
领取专属 10元无门槛券
私享最新 技术干货